1 :
デフォルトの名無しさん :
05/02/02 17:21:22
2 :
デフォルトの名無しさん :05/02/02 17:23:11
>>3 ↓自分はこの辺のAPIを使ってプリンタの解像度を求めてサイズを補正してます
GetDeviceCaps(Printer.Handle, HorzRes);
GetDeviceCaps(Printer.Handle, HorzSize)
GetDeviceCaps(Printer.Handle, VertRes)
GetDeviceCaps(Printer.Handle, VertSize)
ただ、このやりかたは
Delphi2の頃作ったプレビュー用コンポーネントで使っているものなので
今はもっとスマートな方法があるかも知れませんけど
6 :
デフォルトの名無しさん :05/02/02 20:07:07
フレームにボタンを貼り付けて複数のフォームで利用しています。 ここでフォームの背景を TImage を利用して変更していますが、 フレームのところだけ透明になりません。 フレームのボタン以外を透明にする方法ってないものでしょうか。
7 :
デフォルトの名無しさん :05/02/02 21:07:19
TSuper = class .... end; TSub1 = class(THoge) .... end; TSub2 = class(THoge) .... end; という宣言をして、TSub1 や TSub2 のインスタンスを TList に Add したとします。 それらのインスタンスを解放したい時、どうすればいいでしょうか? TList から取り出したポインタを TSuper にキャストして Free すると、 TSuper.Free が呼ばれて、メモリリークしてしまうのでしょうか? もしダメなら、TSuper に Sub1 か Sub2 か識別する為のメンバを作りますです。
失礼しました。訂正します。 × TSub1 = class(THoge) .... end; × TSub2 = class(THoge) .... end; ○ TSub1 = class(TSuper) .... end; ○ TSub2 = class(TSuper) .... end;
9 :
デフォルトの名無しさん :05/02/02 21:44:02
クリップボードの情報を形式に関係なく数値として取り出して変数に代入したいです 要するにバイナリエディタの入り口部分の機能ですがどうしたらいいのでしょうか
チェ十
>>7 TSub1 TSub2にデストラクタ実装して、TSuperでFreeしてみたら? 自分で実際に実験してそして理解せよ。
つーか、普通はTObjectのFreeだよね。デストラクタはDestroyですよ。
TObject(list[0]).FreeでOK。 ついでのオブジェクトの種類を判定したければ if TObject(list[0]) is TSub1 then TSub1(list[0]).Sub1Method; つうかTObjectList使え。
>>9 ハンドルからポインタを取得したり、GDIオブジェクトは独自解釈かな。
とりあえず、WinAPIの基礎を学べ。つーかMSDNでも見ろ。
ご回答ありがとうございました。
>>11-12 失礼しました。
TObject.Free でいい、との事なので安心しました。
自分でも実験プログラムなど書いて試したのですが、いまいち確信が持てなかったので……。
結果的に、こういった定石のような書き方を教えて頂いたので、質問して良かったと思っています。
> つうかTObjectList使え。
全くです。というか、忘れていました。すいません……。 orz o
ついでに言うと、is演算子も忘れていました。重ね重ねすいません……。 ` rz
>>13 ハンドルからポインタを取得というのはこの辺りですよね
var
MyHandle: THandle;
TextPtr: PChar;
begin
ClipBoard.Open;
try
MyHandle := Clipboard.GetAsHandle(CF_TEXT); //とりあえずテキスト
TextPtr := GlobalLock(MyHandle);
finally
Clipboard.Close;
end;
ここから先は初心者では無理ということですか?
Byte(TextPtr[0]) こうすればバイトになるだろ。 16進数に変換する方法は、自分で決めよう。 関数使うもよし、テーブル使って高速化するもよし。
> クリップボードの情報を形式に関係なく 格納されている情報の種類は一種類とは限らないよ。形式を指定しなければ 内容の保証もできないと思うけど?
データ取るだけならformatsのループ回してから buf: array of byte; setlength(buf, getdatasize(myhandle)); move(myhandle, buf, length(buf));
D2005でキーボードで矩形選択するにはどうすればいい? D7ではAlt + Shift + 方向で出来たんだが。
同じ操作で出来るよ。 ちなみに、操作解除のショートカットってなんだっけ?
Ctrl+Kの後、Lで一行選択では?
>>20 OK。
左のAlt+Shiftでのみ出来た。
左手ホーム、右Alt+Shift+方向で慣れて来たけど癖を直すようにする。
バグだな。それは。
24 :
デフォルトの名無しさん :05/02/03 14:21:25
プロパティの読み書きをする際に、プロパティ名を変数で指定したい場合、 何か方法はあるのでしょうか? 例えば s := 'Name'; として、この s を基に、Hoge.Name にアクセスする方法です。 言語レベルでサポートされているなら、一番いいのですが… よろしくお願いします。
VB とは異なり、言語レベルではサポートされていません。 一応、コンパイラだから。ということになります。 RTTI を使えば、希望のことはできます。つーか、DFM のリーダーが読み込んだテキストファイルから クラスのプロパティを特定して、値を書き換えています。
SetPropValue / GetPropValue で検索してみてください。
必要条件として、プロパティは published セクションで定義されている必要があります。 published property Name : string read FName write FName; インスタンス Hoge のプロパティ Name を他の変数 s 経由で実行時に変更したい場合、TypInfo ユニットを uses 節に追加し s := 'Name'; TypInfo.SetStrProp(Hoge, s, '新しい文字列'); とします。
28 :
デフォルトの名無しさん :05/02/03 16:29:40
Delphi6なんですが、ActionListの項目を一括してMenuItemに登録する方法はないですか? Drag&Dropしても受け付けてもらえません。 ひとつずつMenuItem.Actionを設定するしかないですかね。
いま試せないので違ったらごめん。 ActionList エディタで、カテゴリ単位で Drag & Drop できたような気がする。 組み込みアクションなら「編集」カテゴリを丸ごと登録するようなかんじ。
それActionManagerでは
作ったアプリケーションのショートカットをデスクトップに おいて、起動するとDel4.MBとか_QSQ3.DBとかいうファイルが たくさん出てきます。データベースのテンポラリファイルだと 思うのですが、コレを出さないようにするのはどうすれば いいでしょうか?
作業フォルダを設定するんじゃないの
>コレを出さないように ソレが出る。ってことは BDE を正しく終了させていないということですが、大丈夫ですか? もちろん、デバッグ中にアプリを強制終了させた場合など、作業ファイルが残るケースはよくありますが、 通常使用時にも「たくさん」残るのであればプログラムを見直したほうがよいでしょう。 BDE の作業ディレクトリは、TSession の PrivateDir プロパティで変更できます。
34 :
デフォルトの名無しさん :05/02/04 14:08:15
他のアプリから呼び出して使うアプリを製作中なんですが、 このアプリが起動した瞬間に起動元のアプリにフォーカスを戻したいです。 起動した瞬間に、今までアクティブだったウィンドウにフォーカスが移る、 といった事は出来ないでしょうか? ヘルプを読むとApplication.BringToFrontがそれっぽかったのですが、どうやら違ったみたいです。 もしくは、フルパスからウィンドウハンドルかメインウィンドウのクラス名を得る手段でもいいです。 ウィンドウハンドルが得られればSetForegroundWindowが使えますので。 どちらの手段でも結構です。知ってる方、どうかよろしくお願いします。
終了後に残るって事じゃなくて使用中に出るって事では?
起動するとき、Application.Handle の値も起動パラメータで教えてやったらいい
>>34 呼び出し側が自力で戻るのは駄目なのか?
handle := GetForegroundWindow();
CreateProcess
SetForegroundWindow(handle)
SW_SHOWNOACTIVATE指定するとか
自力で戻れないだろ、普通
>>38 何の普通だか知らないけど、普通は戻れる。
FGの戻り値が不安ならForm1.Handle使えばいいし。
そんなことはない。MSDN で SetForegroundWindow を読んでごらん
ごめんなさい、言い忘れました。 起動元のアプリは自作じゃないものです。
たんに FindWindow でハンドル見つけるだけじゃないの?
>>1 に書いてあるような超初心者が作ったソフトは使いたくないと最近思う
起動後にタイマーイベントで呼び出し側ウインドウをFindWindow&SetForegroundWindowやればいいんでは。
.dprの先頭でGetForegroundWindowすれば まだウィンドウが開いてないから元のハンドルが取れるんでないの
46 :
デフォルトの名無しさん :05/02/04 18:26:49
質問です。 Delphiで、リソースファイル *.rc を使ってフルカラーbitmapを読み込ませようとすると、 [RC エラー] hoge.rc(10): Invalid bitmap format ってなるんですけど、どうすりゃいいのですか?
>>46 bitmapを減色してリソースファイルを再作成するちゅうのはダメかい?
48 :
デフォルトの名無しさん :05/02/04 19:12:52
>>47 うーん、DLLに食わせるリソースファイルで、リソース本体を読みにくるのは他人の作った別のEXEで、
仕様書曰くフルカラーBMPだよん、って書いてあるんですわ。
リソースコンパイラだけ、どっかでフリーで入手できないんですかね?
自己解決しました。 BMPを保存しなおしたらコンパイルできました。 他人から貰ったBMPだったので、規格外だった模様。 暇があればBMPのバイナリ眺めて苦言を呈したいと思います。
bmpとして格納しなきゃだめなの?
遅くなりましたが
>>16 から16進に変換後配列に代入することができました。
>>18 も大体意味は分かり良い方法だと思うのですがなかなかうまくいかないため
余裕ができるまで
>>16 の方法で進めてみます。
ありがとうございました。
52 :
デフォルトの名無しさん :05/02/04 23:54:58
C言語で作られたアプリのコールバックでDelphiのDLLをロードしてハンドル渡して VCLなフォームやフレームを埋め込むことって出来ますか? それが無理だとして、普通のWin32APIであれば使えば可能ですか?
なんか、ものすごくダメなアプリのプラグイン作ろうとしてる一名がいるな。
両方出来ますよ。
55 :
デフォルトの名無しさん :05/02/05 01:52:24
実行中にウインドウの端を掴んでドラッグするとウインドウの大きさを変えられる機能(呼び名が分からないのでなんとも…)を 設定変更できるプロパティはありますか?
TForm.BorderStyle
ありがとうございました
>>45 ありがとうございます。
それで元のハンドルを取得して、OnActiveでSetForegroundWindowを実行で、
思い通りの事ができました。
そんなことはない。
60 :
デフォルトの名無しさん :05/02/05 19:49:00
コンボボックスで、↓を押した時にドロップダウンするようにしたいのですが、 どうすればいいでしょう? OnKeyPressに if key = #40 then ComboBox1.Perform(CB_SHOWDROPDOWN, 1, 0 ); の様に書いたのですがうまくいかず、 試しにキーをEscに変えて if key = #27 then ComboBox1.Perform(CB_SHOWDROPDOWN, 1, 0 ); としてみた所、一瞬ドロップダウンされるのですが、すぐに消えてしまいます。 ↓を押したらドロップダウンして、その中から選べるようにするのが理想です。 よろしくお願いします。
TStringList の SaveToFile でテキストを保存すると CRLF(0D 0A)が勝手に付いてしまいますが これを回避する方法はありますか?
仕様です
>>62 そうですか。
別の方法で何か無いでしょうか?
>>61 改行されたくないのにTStringListを使うのはなぜ?
俺ならTMemoryStreamとかTFileStreamを使うけど。
Theme ManagerをD6 Personalにインストールしたいのですが、 バッチを当ててからThemeManagerD6.dpkを開いてインストールしても --------------------------- ThemeManagerD6.bpl を登録できませんでした。 このパッケージは設計時には使えません。 --------------------------- というメッセージが出て正常にインストールできません。 どなたかうまくいく方法を教えて頂けませんでしょうか?
70 :
デフォルトの名無しさん :05/02/06 11:49:01
Memoに書き込まれる文字幅を揃えようと思い PitchプロパティをfpFixedにしたのですが文字幅がバラバラのままです 何か勘違いがあるのでしょうか
71 :
デフォルトの名無しさん :05/02/06 11:56:42
Delphi7を使い始めた初心者です RichtextやMemoコンポーネントで、テキスト編集領域の背景に 色ではなく画像(壁紙)を設定する方法はないでしょうか? もしくは、RichtextやMemoコンポーネントよりも前面にImageコンポ(もしくはそれに類するもの)を 持ってくる方法はないでしょうか? (「コントロール→前面・背面移動」を選択しても、どうしても順番が入れ替えられない)
>70 fpFixed は「他の条件を満たした上で、もし固定幅のフォントを作成できるならがんばれ」 という条件を追加するフラグ。 「MS Pゴシック」フォントは固定幅にはできないフォントなので fpFixed をつけても無視される。 「MS ゴシック」を使うこと。 これは Windows の Font API の仕様なので避けられない。
>>68 テキスト処理にTStream使う奴はアフォ
>69 ThemeManager ってのがなんだかわからんが、設計時に使えないということは IDE に登録してはいけないわけで... ドキュメント読み直したら?
∫,,,,,,,,,∧,,∧ 天気ええーなー
⊂,,,,,,,,,つ,,゚Д゚ミつ
>>71 さん
RichEditでは背景画像不可能だった気がします。
TMemoなら、
http://homepage1.nifty.com/cosmic/delphi/vcl.html こちらの「背景透明化可能 拡張エディット&メモ 」を
使うとよいでしょう
77 :
デフォルトの名無しさん :05/02/06 13:00:50
Delphi6 WinXP SP2 ListViewの上端を掴んで上にドラッグするとゴミが出るんですけど、これウチだけ? ゴミ出ないようにしたいです。 再現手順。 Win32のListView1を配置。 ListViewの、 DragModeをdmAutomaticに、 Itemsに適当な名前で項目を追加、 ViewStyleをvsListに(vsIconでは問題なし)。 実行。 ListViewに表示されたItemの上端を掴んで、上方にドラッグ。 そのまま(ドロップしないで)ドラッグでマウスカーソルをぐるぐる動かす。
>>76 ありがとうございます!
テキスト編集画面を透明化して、その下にImageを持ってくるだけで壁紙っぽく見せられますね!
(やはり、Imageコンポを前面に持ってくるのは無理みたいですね)
実は、RichtextコンポとMemoコンポの大きな違いまだ把握してないのですが
(Memoは制作可能文書サイズが64KBまで?)
とりあえず紹介していただいたコンポを使ってみたいと思います。
>>61 procedure hoge(src: TString; dst: TStream);
var s: String; i: Integer;
begin
for i:=0 to src.Count-1 do begin
s := src[i];
dst.WriteBuffer(s[1], Length(s)*SizeOf(Char));
end;
end;
こんな感じでどうぞ。
∧,,∧ 天気ええけど、
ミ,,゚Д゚彡 さむいどすな
ミ つ旦)~~
〜と,,,~),,~)
>>78 さん
RichとMemoはWindowsのコントロールで
それぞれワードパッドとメモ帳が使っている部品ですよ。
Richは文字毎に色とかフォントとか変えれますね。
Memoの64K制限はWin9x系だけだった気がしますが
独自実装している
TSonEditやTEditorとかも検討してもいいかも。
それアフォすぎ
芸術的やないか
>>71 >>76 fumika氏のCuteEditはDelphi7じゃ動作しなかったはず
>>82 検証と画像ありがとう。
うちでも、メインのノート(MOBILITY RADEON 9600)と
サブのデスクトップ(GeForce4 MX 440)とで試してみたけど、同じでした。
両方ともWinXP Pro SP2で、ビデオドライバはメーカーのもの。
ちなみにデスクトップのデザインはクラシックスタイル。
まぢぃ!
>>84 さん
D2005で試したところ、
ちょっと画面更新のタイミングが変気味だけど
一応動いているけど・・・
D6/7/2005w32で、何か目だった変化ある?
>>86 ごめん書き方が悪かった
正しくは、「XPmanifestを適用すると透明化が解除されてエリア下がバグる」
XPmanさえ使わなけりゃ正常動作する
あと、スクロール時に点滅するのは仕様だってさ
TCuteMemoは改行時のLine-heightもちょっと変気味だよね Richtext・Memo・CuteMemoそれぞれに FontをMSPゴシック12pt設定してAAを貼ってくらべるとよくわかる
∩|
ミ ゙''゙゙゙つ ________
ミ∧,,∧ /
ミ,,゚Д゚彡 < 使い込んでるね。
U U \
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>>87-88 さん、報告dクス
∩| ミ ゙''゙゙゙つ 何人かが過去タドタ道ですが ミ∧,,∧ Delphiマガジンの記事で ミ,,゚Д゚彡 Memo透明化の記事があったはずなので U U それを参考にしてみると、 技術向上できるかもね。 なんにしてもRichでは無理ぽだったはず。 Winのコントロールに依存するんだから仕方ないでつ。 超上級レベルだと思われですが、 TEditorやTSonEditの ソース解析などの道もあるかと。
∫,,,,,,,,,∧,,∧ ところで質問。D2005の ⊂,,,,,,,,,つ,,゚Д゚ミつ エディタ部分の[×]がついた タブコントロールは、どうやって作るのですか?
94 :
デフォルトの名無しさん :05/02/06 18:42:25
指定した秒数の中で、あるキーが何回押されたかを数える、 といった事をやりたいのですが、行き詰ってしまいました。 TTmierとonKeyPressで出来そうだと思ったのですが、 回数をどうやって取ったらいいのか全然わかりません。 どうか教えてください。
>>92 ごめんD2005持ってないんだ
答えられなくて申し訳ない
>>93 CoolMemoで試してみたけど
やっぱりXPmanifestを適用すると透明化が解除されてエリア下がバグるね
スクロール時に背景も乱れるけどCuteEditの点滅に比べたらマシかも
96 :
デフォルトの名無しさん :05/02/06 19:51:36
ImageコンポでPICTUREを読み込む場合、JpegよりBMPのほうがアプリに優しい(処理が高速)と聞いたのですが 本当ですか?
>>95 検証ありがとう+乙。
>>87 タンはD2005持ってないとするとD7かな?
CoolDevにその旨Postしておきます。
最近バージョンアップされていないから望み薄かも。
98 :
デフォルトの名無しさん :05/02/06 22:12:16
質問が2つあります。 1.6.0personal使ってますが、 TServerSocketやTClientSocketのヘルプがありません。 どっかにありませんか? 2.↑が無い場合の質問。 TServerSocketやTClientSocketのOnWriteイベントって、 どういうとき発生しますか? 「相手になにか送信が完了したときに発生」するものだと 感覚で思っていたのですが、 SendTextしても発生しません。
∫,,,,,,,,,∧,,∧ D6Proにはついてましたが,,, ⊂,,,,,,,,,つ,,゚Д゚ミつ TServerSocketのOnAcceptや TClientSocketのOnConnect直後 接続時に発生するみたいだよ。
>>96 そりゃ展開する分Jpegの方が重くなるだろ。
一方bmpの方がサイズが大きい分ディスクIOが余分に発生するが。
>>99 ありがとうございます。
そうか、WriteというわりにはReadの反対ではないのね。
腑に落ちないけど、そういう仕様なんだからしょうがない。
自分が能動的に発する命令にイベントなんて発生する必要なんてないだろ
104 :
デフォルトの名無しさん :05/02/07 01:40:16
文字の改行幅を調整しようとFontのSizeパラメータとHeightパラメータをいじってるんですけど 2つの値が連動して困ってます(Sizeを12にするとHeightが-16、Sizeを9にするとHeightが-12に・・・といった具合) フォントのサイズ(pt)は固定したまま改行幅を広げたり狭めたりできないものでしょうか?
できない
>>102 チャトラン思い出した(w
>漏れも"フニ"は落ちませんがそういうもんらしいです。
切るとこ違うよ。
"ふ"に落ちない。
>>103 Winsockの内部での都合を考えてくださいませ。
今話題の状況依存ヘルプを使いたいんですが、FormのBorderIcons プロパティをつかってバーにヘルプボタンを表示させる方法ならわかるん ですが、一太郎のようにツールバーのボタンを押したときにヘルプモードに する方法がわかりません。Toolbar1OnClickにどう書けば良いでしょうか?
あ、ToolButton1Clickの間違いです。
ヘルプヒントじゃなくて?
Perform(WM_SYSCOMMAND,SC_CONTEXTHELP,0); かな?
>>94 グローバルで受け付け時間内だけTrueになるフラグ用意して、カウンタ用の変数も1つグローバルで用意。
OnShowでタイマーイベント開始(Interval=100000=10秒)と共に受け付けフラグをTrueへ立てる。
フラグがTrueの間はKeydownイベント内でのスペースキーの押下をカウントアップしてEdit1へ表示するようにする。
オンタイマーイベントで指定時間がきたらフラグを降ろしてタイマーも止めて(Interval=0)計測終了。
というのを考えてみた。
var Form1: TForm1; Flg:Boolean = False; KeyDownCount:Integer; implementation {$R *.DFM} procedure TForm1.Timer1Timer(Sender: TObject); begin Flg := not Flg; Timer1.Interval := 0 end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = VK_SPACE) and flg then begin Inc(KeyDownCount); Edit1.Text := IntToStr(KeyDownCount) end end; procedure TForm1.FormShow(Sender: TObject); begin Timer1.Interval := 10000; Flg := True; KeyDownCount := 0 end; end.
あ、Form1のKeyPreviewプロパティをTrueにしてね。
FlgはTimer1.Enabled使えばよろし
自分がフォーカス無いときも数えたいんだろ
>>104 つーか、普通はフォントのsizeとheightは単位が違うだけで、
どちらもフォントの高さを示してる。
文字幅はlogfontで指定する。
121 :
デフォルトの名無しさん :05/02/07 23:27:59
Delphi6のヘルプ→ クイックスタート: チュートリアル→「 フォームへのコンポーネントの追加」ページにて -------------------------------------------------------------------------------------------- 4 テキストエディタで編集中のファイルのパスと名前を表示する場所をステータスバーに作成します。 ・ステータスバーを選択します。 ・SimplePanel プロパティを True に設定します。 ・SimpleText プロパティを untitled.txt に変更します。このテキストエディタを使うときに,編集中のファイルが まだ保存されていない場合,その名前は untitled.txt になります。 ・Panel プロパティの[(TStatusPanel)]省略記号をクリックして,[StatusBar1.Panels の編集]ダイアログボックスを表示します。 ・ダイアログのツールバーにある[新規追加]ボタンをクリックして,ステータスバーにパネルを追加します。 -------------------------------------------------------------------------------------------- とあるんですが、この通りに実践すると 「テキストエディタで編集中のファイルのパスと名前」が表示されず、外部ファイルを開こうが新規ファイルに名前を付けて保存しようが 表示が「untitled.txt」のままでした。 あれこれ試行錯誤しているうちに、「SimplePanel プロパティを False」のままにしておく(SimpleText プロパティは適用されなくなる)と 解説通りの効果が得られるようになりました。 これは、ヘルプのこの項目の説明文が根本的に間違えていると解釈してよろしいのでしょうか?
いいんじゃないでしょうか。
時々手続きの内部で別の手続きをしているソースを見かけるのですが これって何かメリットがあるんでしょうか?
見やすくなるから
みにくくなる 書き手次第
127 :
デフォルトの名無しさん :05/02/08 01:10:06
ヘルプにはルーチンのネスト、一般的には関数内関数と呼ばれているのかな。 呼び出し元のローカル変数にアクセスできるよ。
>呼び出し元のローカル変数にアクセスできるよ。 そういう使い方が出来るんですね。 便利そうですね。
130 :
デフォルトの名無しさん :05/02/08 01:25:33
メモ帳など、他のテキストエディタのキャレット位置を取得したいのですが、 どうやればいいのでしょう? GetCaretPosあたりを使えば良さそうだと予想したんですが、 調べても良く分かりませんでした。
>>129 変数と、ローカル関数の記述の順番によるけどね。
便利だよね。
>>130 その書き込みだと、GetCaretPosで出来たかどうかは解らない。
出来るんならそれでいいし、 出来なかったのならそう書いて欲しい。
作ったプログラムのアイコンを変更するにはどこを設定したらいいんですか? あと、作ったブログラムってBCBのように共有ライブラリ使ってないですよね?
書き忘れました、2005使ってます。
間違い発見・・・ >>あと、作ったブログラムってBCBのように共有ライブラリ使ってないですよね? 共有ライブラリを含んでいる
>>133 プロジェクトメニュー→オプション→アプリケーション
>>120 ヘルプでlogfontの項目が見当たらないんですが
TLogFont Windows API 用のレコード型 APIのヘルプか MSDN へどうぞ
>>119 TMemoとかが連動させてるだけで、自力で描画する分には関係ないよ、と言う話。
141 :
デフォルトの名無しさん :05/02/08 13:20:57
------ a.pas ------ Unit a; interface const HOGE=8; implementation end. ------ b.pas ------ Unit b; {b.pas} interface uses a; var FUGA : array[0..HOGE] of string; implementation ........(略) end. ってプロジェクトをコンパイルすると、 未定義の識別子:HOGE ってエラーになるんですがこれは仕様ですか? あるファイルで宣言した定数を他のユニットでも使いたいときには どうしたらいいんでしょうか?
それでいけるはず。a.dcu検索して削除してからビルドしてみたら。
ゴメン、出来た
補足: a.pasのファイル名を変更して、bの方のuses節を変更したらビルドできました。 30秒違いで… >142 thx
>>132 全くできませんでした。
var
pntCaret : TPoint;
begin
........(略)
GetCaretpos(pntCaret);
Top := pntCaret.Y;
Left := pntCaret.X;
ShowMessage('('+IntToStr(Top)+','+IntToStr(Left)+')');
end;
こんな感じで書いても、(0.0)しか返ってきません。
例えばメモ帳だったらどうやってやるのでしょう?
何でTop,Leftに代入してるんだ? pntCaretをClientToScreenに変換してそのまま使え
計算結果として 3.1415 みたいな結果がでてきたとして、これにTruncを使えば 小数点以下が切り捨てられるのはわかったのですが、 これを 3.1 や 3.14 などと表記する方法はないでしょうか?
>>147 こんなん使ってますが。nが小数点以下の桁数。
function HalfAdjustN(x: Double; n: Integer): Double;
begin
Result := Int(x * IntPower(10, n) + Sign(x) * 0.5) / IntPower(10, n);
end;
149 :
デフォルトの名無しさん :05/02/08 17:35:57
ヤフーオークションに Delphi7 のエンタープライズ版が ナイス値段ででてる! 買いたいけど金ねー くそー
150 :
デフォルトの名無しさん :05/02/08 17:37:27
StringList.Textだと、最後に余分な改行コードが付いてきます。 どうやったらカットで期末か?
毎回for文するのは嫌でつ。
>>148 使ってみます。
ありがとうございました。
>>150 AnsiReplaceStr(Text, sLineBreak, '')
Trimとかも?
サンクスでつ。
>>153 それだと、全改行コードが消えそうな...
>>154 TrimRightすると、最後の改行コード(と空白スペース)を消してくれるんですか?
なら、完璧でつ。
うまくいきました
>>146 いや、ですから、pntCaret自体が取得できないのです。
もう一度質問を書きますね。
メモ帳などのエディタのキャレットの位置を取得するにはどうしたら良いのでしょう?
直接文字列を指定したいのですが Stringの場合、「〜:= '文字列';」で問題ないのですが TStringsの場合、「〜:= '文字列';」だと上手くいきません どうしたらよかとですか?
出来ない。 やるなら、ターゲットプログラムで発生するすべてのイベントを監視する とか?
>>158 Textに突っ込め。っていうかTStringListのプロパティ全部嫁
>>158 TStringsは文字列リストだから代入という概念は無い
TStrings.Textは個々のリストに格納されている
文字列全部だからちょっと違うし
>>162-163 どうもです
てことは、例えばRichTextやMemoのLinesプロパティにも文字列を直接指定できないってことですね
TStringListについてこれから調べてみます
すいません行き詰まってしまったので質問させてください ファイルのコピーについてですが 現在サブフォルダのファイル全て変数(hoge1)に入れて(SrchFileを使わせてもらってます) CopyFile(PChar(hoge1),PChar(hoge2),True); で複数のファイルをコピーしようとしているのですが上記の場合ファイルが一つの場合のみ大丈夫なのでしょうか? また複数コピーする場合どうすればいいのでしょうか?よろしくお願いします
解決しました。 procedure GetCaretPosEx(var Ps: TPoint); var Rect: TRect; CPos: TPoint; ActiveWnd: HWND; hForeground: HWND; dwFrom, dwTo: DWORD; begin ZeroMemory(@Rect, sizeof(Rect)); dwFrom:=GetCurrentThreadId; hForeground:=GetForegroundWindow; if hForeground<>HWND(nil) then dwTo:=GetWindowThreadProcessId(hForeground, nil) else dwTo:=HWND(nil); if (dwFrom and dwTo)<>0 then begin if AttachThreadInput(dwFrom, dwTo, true) then begin if not(GetCaretPos(CPos)) then OutputDebugString('失敗'); ActiveWnd:=GetFocus; if ActiveWnd<>HWND(nil) then GetWindowRect(ActiveWnd, Rect); AttachThreadInput(dwFrom, dwTo, false); end; end; Ps.X:=CPos.X+Rect.Left; Ps.Y:=CPos.Y+Rect.Top; end;
168 :
77 :05/02/08 22:56:15
>>77 です
これは回避できないでしょうか?
あと環境によって問題ないとかあるんでしょうか?
VBAのShellオブジェクトをDelphiから叩くのが正解
入力補完のランチャーなんですが、 関数名がずらっと出てくるのですが、 選択時、一個飛ばしで選択されて、 必要な関数名を選ぶ事ができません。 設定の変更はできますでしょうか?
>>170 Delphi6のpersonal版でosはxpです。
時々発生するバグ
>>170 よく分からんけど、その状態になったこと無いな。
>>173 こっちはある。
「たま〜に」だから、気にしないようにしてる。
内部コンパイルエラーを出せたら一人前
そっ、そう? ループのない所で Break したら T2541 が出ませんか?
おっと、エラー番号は見てなかった。 失敬。 「内部エラーはたまに出るけど気にない」と。
気にない
Delphi7のShellTreeViewで起動時、前回選択していたフォルダを選択させたいのですが、 前回終了時にShellTreeView1.PathをIniFileに保存し、次の起動にそのパスをShellTreeView1.Pathに 設定していますが、この方法だと仮想フォルダの場合、実際のフォルダが選択されてしまいます。 仮想フォルダを選択させる方法がわかりません。えらい人教えて。
LF(&H0A)で区切られているテキストファイルを読み込み加工した後、上書きする方法はありますか? TStringListに読み込むと、全てのLFがCRLFに変換されてしまいます。 さらに既存のテキストファイルに追加で書き込む事は可能でしょうか?
Windowsでテキストモードでやっているなら仕方が無い。 嫌ならバイナリだか形無しモードで自分で書く以外ないよ。
一行ずつ書き込んでLFはさむだけだろ? 不思議な質問だ
>TStringListに読み込むと、全てのLFがCRLFに変換されてしまいます。 LineBreak プロパティで変更可能ですよ。
>>172 再起動しましたら直りました。
ありがとうございました。
ブラウザ機能の一部にGeckoエンジンを取り入れたものを現在考えていて、今はActiveXコントロールから 使用していますが、それでは他のマシンで動作させるためには下準備が必要なので、 自前で内蔵できるように(=極端な話exeファイル1つで動作できるように)したいのですが、 自分の探せる範囲ではいまだ見つかりません。 ヒントとかを教えてください。
GeckoのソースをBCCでビルドしてリンク
文字数はどうやれば取れますか?
Lengthのことかな?
length
ありがとうございます。できました。 型の使い方が違っていました。 var s: String; i: Integer; にして、 s := 'abcde'; i := Length(s); s := IntToStr(i); ShowMessage(s); これで出来ました。感謝します。
'こうだろ'.length
そのDelphiバージョン古杉ですから〜
ざんねーん
Delphi2005安く売ってるところ知ってますか?
ShowMessage(IntToStr(Length('abcde')));
文字列がオブジェクトじゃない言語って終わってるよな。
そうだね
文字数はLengthじゃだめだよ。
なんですか?
>Length は文字列によって使用されるバイト数を返します。 文字数じゃない
ああ なるほど ansiなんちゃらってあったなあ。
なこと無い、WideStringにも対応してる。 SJISには対応して無いな。
Delphi6は古杉のようですが大丈夫ですか? 2005買おうかと思って見てみたら高かったよ!
Delphi6は古くないけど売ってないだろ、さすがに。 D2005は素人にはおすすめ出来ない。ヤフオクでもいいからD7以下を手に入れるべし
わかった。ありがとう。
207 :
デフォルトの名無しさん :05/02/09 16:21:21
ListViewのスクロールバーの位置を知るにはどうすれば良いのでしょうか? スクロールは出来るんですが、読み出す事出来ない・・・
del2005買え、あーむかつく
スクロールバーの位置は右か下だけだろ
下記のようにしても、ListViewのスクロールバーが消せません。 SetScrollRange(ListView1.Handle,SB_HORZ,0,0,True); ShowScrollbar(ListView1.Handle,SB_BOTH,False); Sendmessage(ListView1.Handle,LB_SETHORIZONTALEXTENT,0,0); ハンドルを ListView1.Items.handle にしても駄目です。 Form1の場合はちゃんと消えるんですが。
SetとかGetとかが必要になってくる変数って 積極的にpropertyにしちゃっても問題ないですか? それともケースバイケース? デル6パー。
自己レス。FlatScrollbarをFalseにしたら消えました。 ・・・ってか愕然としました。FlatにしたとたんAPIは全て受け付けないなんて。
213 :
デフォルトの名無しさん :05/02/09 17:38:58
「不正な浮動小数点演算命令」とエラーが出るのですが・・何が何だか分からなくて困っています。 01:for X := 0 to 15 do 02: begin 03: Y := 0; 04: repeat 05: TChr[X,Y].Yposition := Y * s + 10; 06: NoD[X] := Y; 07: Y := Y + 1; 08: until TCar[X,Y].YposE > 4800; 09: end; 5行目で引っ掛かってしまいます。 右辺が計算式だとエラーが発生するようなのですが・・。 Delphi6でOSはWindowsXPです。
>>213 TChrとTCarの変数宣言くらい書いてくれないと
これだけじゃわからない
それに加えて、エラーメッセージも付け加えてください、そうすれば怒られないよ
216 :
213 :05/02/09 17:52:47
>>213 です
すみません。必要事項を書き忘れてる上に、一部書き間違えていました。
01:for X := 0 to 15 do
02: begin
03: Y := 0;
04: repeat
05: TChr[X,Y].Yposition := Y * s + 10;
06: NoD[X] := Y;
07: Y := Y + 1;
08: until TChr[X,Y].YposE > 4800;
09: end;
TChrは、レコード型Chrとして、配列で宣言しています。
フィールドのYpositionはExtended型です。
217 :
213 :05/02/09 17:55:37
度々すみません。 エラーメッセージは以下の通りに出てきます。 プロジェクトProject1.exeがEInvalidOpクラスの例外を生成しました。 ’不正な浮動小数点演算命令’
Y が宣言の外になってるに98コントルト
ループ抜けないでNaNで演算例外だな、たぶん
s ってなに? TChr[X,Y].YposE も和歌卵子 レコード型の宣言がみせろよ
221 :
デフォルトの名無しさん :05/02/09 18:24:17
本当に初心者の質問で申し訳ないのですが、 TstringListなどを使った場合、終了する前にFreeをしてあげないと メモリの解放などは行われないのでしょうか? それとも、終了した時点で割り当てられたメモリなどは解放されるのでしょうか?
>>221 FormDestroyでFreeでいいのでは?
223 :
213 :05/02/09 18:37:29
伝わりやすくしようとコードを端折ったのが逆効果となってしまったようです。 誤解を招く内容を書いてしまったことをお詫びします。 01: ss := StrToFloat(Form1.Edit1.Text); 02: s := Round(32 + ss * 8); 03:for X := 0 to 15 do 04: begin 05: Y := 0; 06: repeat 07: TChr[X,Y].Yposition := Y * s + 10; 08: NoD[X] := Y; 09: Y := Y + 1; 10: until TChr[X,Y].Yposition > 4800; 11: end; レコードは以下のように宣言しています。 type Chr = record Xposition : Extended; Yposition : Extended; Xplus : Extended; Yplus : Extended; graph : TRect; end;
224 :
213 :05/02/09 18:38:00
その他の変数は以下の通りに宣言しています。
ss : Extended;
s : Integer;
X : Byte;
Y : Word;
TChr : array[0..15,0..1000] of Chr;
NoD : array[0..15] of Word;
コンパイルは出来るのですが、実行させると上記コードの07で止まってしまいます。
エラーメッセージは
>>217 の通りです。
(上記コードはボタンクリックのイベントとして書いています。)
Yは10000以上になってもいいのか?
1000だな
サッカーミロ
気持ち悪いコードだな 書き直してみた これだとどうよ 01: ss := StrToFloat(Form1.Edit1.Text); 02: s := Round(32.0 + ss * 8.0); 03:for X := 0 to 15 do 04: begin 05: Y := 0; 06:while (TChr[X,Y].Yposition<=4800.0) and (Y<=1000) do 07:begin 07:TChr[X,Y].Yposition := Y * s + 10.0; 08:NoD[X] := Y; 10:inc( Y ); 11:end; 12:end;
229 :
213 :05/02/09 19:09:06
>>226 確かに、ssの値に1か0を代入すると、Yは1000を超えてしまうのですが、
ssが30以下の値だと、現象的に不自然なので、(説明が長くなるので理由は省略しますが)
下回らないように書き換えておきます。
しかし、プログラム事態は、07を一度も通過せずに止まってしまうんです。
230 :
213 :05/02/09 19:26:11
>>228 ご指摘の通りに書き直してみたところ、エラーも無く実行できました。
本当にありがとうございました。
ちなみに、 ・普通、自分で定義したレコード型やクラスなどの型は、頭にTをつけるのが普通 ・ゆえにTChrなんてつけかたは、普通、型に使う名前で勘違いされやすい ・万が一のコンパイラの勘違いを防ぐため、浮動小数点小数を意味する場合は、 4.0とか6.0とか、.0を付けること。代入される変数の意味もわかりやすくなる。 ・repeatは、条件が後に来るので見づらい。どうしてもという所以外、whileの方が見やすい。 ということを気を付けるだけでも、他の人が見てもかなり見やすいコードになると思うよ。
あ、あと、 ・ByteとかWordとかは、ここぞという場所以外使わない。 範囲外へ行ったときの不具合見つけるのが大変面倒。 一般的な32bitCPU+32bitOSでは、速度面でも不利なので、 なるたけ、IntegerかCardinalを使うことをおすすめする。 今回のコードのような使い方程度なら、メモリのムダとか考える必要はないので。
233 :
デフォルトの名無しさん :05/02/09 20:46:01
>>231-232 ご丁寧に教えていただいてありがとうございます。
初心者の私にとっては、大変参考になることばかりです。
確かに、分かりにくいコードでした。
今後は他の方が見ることも念頭においてコーディングするよう努力します。
>>186 ありがとうございます。
なんとかやってみます。
苦労に見合わないと思うけどなぁ・・・ 素直にIE使えばいいのに。
>>236 現在自作のHTMLエディタにIE・Geckoエンジン両方のプレビュー機能の実装を予定していて、
前述どおりActiveXであれば両方とも実装は完了しているんですが、そうなると色々と不都合があるので。
いやー、COMでやったあなたが偉いんだが? 何で、ソースを自分に取り込むのかがワカリマセヌ?
(ActiveX = COMであってますよね) COMだと他のマシンで使おうとすると、あらかじめCOMを入れておく必要があるので、多少サイズが大きくなってでもexeのみで動作できるようにしたいんです。 もし、他に方法があればヒントとかを教えてもらいたいのですが。
>>240 配布問題ですね。なーる。
趣味の範囲ではなさそうだな。
バグが出たとき毎回コンパイルして配布するのか?
バグが出たらDLLを配布するのか?、
私なら後者のほうだな
Geckoエンジンを使いたいけどFirefoxはインストールしていない。 Geckoエンジンを使ってページを作ったけどFirefoxで動作確認しない。 というユーザーを想像するのは難しい。
∧,,∧,,,,,, ) MLの人 ⊂ミ゚Д゚⊂,,,,,,,`つ がんがれー。
バグの種類にもよる、という前提はあるでしょうが、 自分の今のスキルではまだDLLの使い方(動的参照とか静的参照?)がいまいち理解しきれてないので、どちらかといえばDLLは使いたくないです。 このソフト自体は学校の授業中に思いついたソフトで、一応趣味のソフトですし、配布の予定は無いですが、やれるならやってみたいと思います。 (ケータイからなのでレスが大変です)
2005買ってないし・・・。 勝ち組ですみません。
コラー、君たち、デプロイメントのプロだろうが、 少しは文句書け
M$は卑屈な奴が多い
7は安定 2005は不安定 でよろしいですか?
VS野郎は帰れ
ところで、2005は不安定なんですか?
買った人の精神状況も不安定みたいです。
あの腐ったエディタ仕様変更できんの? タブは8だし フリーカーソルだし 行先頭から左押しても1つ前の末端までいかないし 複数行選択してタブ押しても消えるし
全部出来る
それがDelphiの仕様だ。以下略。
Delphi6のフリー版でxmlをいじるアプリ作っています。 現在はUTF-8をShift Jisに変換して処理してるのですが、特定の文字で化けが起きてしまいます。 内部をUTF-8扱う方法か、文字化けが起きない方法はないでしょうか?
>>256 その分言だと、Utf8ToAnsi()関数はまだ使ってないのかな
まだだったら試してみそ
ヘルプにものってるよ
xml自体をTStringListとかで読みとって、各行を全てUtf8ToAnsi()に
かければいい。
shift-jisにないunicode文字は変換のしようがないので、tntでunicodeのまま使う。
FormをDockした状態で表示させるにはどうすればいいんでしょうか。 表示→ManualDockでDockさせると一瞬Dockされてない状態が見えてションボリです。
260 :
259 :05/02/10 18:30:26
age。 ManualDock→表示→ManualDock で上記問題は解決しましたが理由がわかりません。。 もっとスマートな方法をご存知の方、教えてください。
通常のFormのDockでは
>>259 のやり方で問題ありませんでした。
JEDIコンポーネントのJvDockServer, JvDockClientを使っていたので、通常と異なる動作をしていたようです。
Form2.ManualDock(JvDockServer1.LeftDockPanel);
JvDockServer1.LeftDockPanel.ShowDockPanel(True, Form2);
上記のようにJvDockServerにManualDockした後、ShowDockPanelを呼び出すことで解決できました。
お騒がせしてすみません。
262 :
デフォルトの名無しさん :05/02/10 21:18:53
スレッドセーフなTStrings系のクラスってない?
以下のコードを実行すると、出力ファイルのサイズが何故か肥大化してしまいます。 ファイルサイズが変更しない正しいClipboard上でのBitmapの扱い方を教えて下さい。 var BMP: TBitmap; begin BMP:= TBitmap.Create; try BMP.LoadFromFile('Hoge.bmp'); Clipboard.Assign(BMP); BMP.Assign(Clipboard); BMP.SaveToFile('ClipHoge.bmp'); finally BMP.Free; end; end;
∧,,∧,,,,,, ) (´⌒(´
⊂ミ゚Д゚⊂,,,,,,,`つ≡≡(´⌒;;;≡≡≡
おそくなりすぎた
>>233 さん、ここなどどうか。
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200412/04120006.txt
落とすだけならTDownloadUrlアクション
Del6Personal使ってます FormにDirectoryListBoxとFileListBoxを配置して実行、 DirectoryListBoxの階層をいろいろ変えましたがFileListBoxのほうに反映されてません ヘルプによると、FileListBoxはカレントディレクトリを表示するコンポだそうですが DirectoryListBoxのなんらかの値を手動で渡してやらないとダメなんでしょうか?
なんかDLB側のプロパティで結び付けるじゃないの
>>268 DirectoryListBoxのFileListプロパティで指定してやったらうまく行きました!
てっきり子側(FileListBox)で設定するんだという固定観念に囚われすぎてた・・・
ありがとうございました!
270 :
デフォルトの名無しさん :05/02/11 13:06:48
TTreeViewでクリックしたノードをTListで管理しようとしているのですがノードを削除 したときの動作がうまくいきません。(4)を実現するためにOnDeletionで for j := 0 to FUndoList.Count-1 do //FUndoList: TList if FUndoList[j] = Nil then FUndoList.Delete(j); とやってみましたがダメでした。何か方法はないでしょうか? ◇R (1)★Pと▼Xと◆Cをクリック ├−−◆A (2)TListで★Pと▼Xと◆Cを保存 │ │ (3)◆Aを削除 │ ├−−▼T (4)TListから★Pと▼Xを削除 │ │ │ │ │ └−−★P │ └−−▼X │ ◇Z └−−◆C │ ◆V
271 :
270訂正 :05/02/11 13:07:52
if FUndoList[j] = Node then FUndoList.Delete(j);
No := FUndoList.IndexOf(Node); if No > -1 then FUndoList.Delete(No); でOKでした。
すみません質問させてください 現在POS関連のプログラムを作っております。 POSの制御にActiveXコントロールを使用するのですが、 フォームを持つDLLにこれを乗せて使用してもエラーが出て使用できません。 色々試した見たところActiveXであればどんなものでも上記の現象が起きるようです。 ぐぐってみたところCoInitialize及びCoUninitializeというのがキモであるように書いてありましたが initailzation節及びfinalization節にこれらを書いてもうまくいきませんでした。 解決策を知っておられるかたがいらっしゃいましたらお教え願いますでしょうか? ちなみに、アプリケーションの制約上どうしてもPOSのコントロールを持つフォームを DLLとして使わなければなりません。 どうかよろしくお願い致します。
とりあえず新規プロジェクト作ってまっさらなフォームに貼り付けてみたら。 付属のサンプル試してみるとか。
ComObjとかActiveXをusesしとけば自動で呼ばれなかったけ? 間違っていたらごめんよ
ついでだからCoInitialize関連で質問。これってオブジェクト使うごとに唱えなほうがいいのですか? それともアプリ実行時に一度唱えておけばOK? アプリ実行時に唱えておいたらスレッド関連でエラー起こした記憶があるから、 クラス化しちゃってコンストラクタとデストラクタで呼ぶようにしちゃいました。 問題ないかな?
面倒だからunitのinitializationで呼んでる
何回呼び出しても問題は無い
>>273 EPSONのOPOSActiveXだったら、上手くやっているから答えることができるけど、
他の会社だったら自分はこたえられない。
よかったら何を使っているのか教えてください。
procedure TForm1.ExifRead(ExifFile: String); なんだから、TForm1 の public 部か private 部に procedure ExifRead(ExifFile: String); という宣言を手動で追加してから、implementation 部の下に、あの実装コードを コピペするとよい。 > Power関数(?)も宣言(?)が必要みたいだし、 uses に Math を追加する。どのユニットを追加すべきかは、ヘルプを見ると分かる。
ActiveXコントロールの初期化はCreateイベントではなくShowイベント で行う事。いじょ。
そんなことは無い。いちいちTApplicationが複数のForm持っていたら どう済んだよw。誰が責任取るんだよ
284は、どういう書き込みなの? 笑うとこ? 真面目なレス? 分からない…。
GetPrivateProfileString()で分からない部分があるので質問します。 Project1.ini [Section1] key01=test var str,Ini_Path2 : String ; MAX_PATH : LongInt ; begin Ini_Path := ChangeFileExt(Application.ExeName, '.ini'); GetPrivateProfileString('section', 'key01', not_use', PChar(str), MAX_PATH, PChar(Ini_Path)); end; と書いて、コンパイルは出来るものの実際に実行すると例外が発生します。 引数の宣言に問題があると思うのですが、google等で調べてもなかなか解決しません。 助言お願いします。
Inifiles.TInifile使え
皆さんレスありがとうございます。
>>274 その方法で試しております。
>>275 initializatin節でCoInitialize(nil)、finalization節でCoUnitializeを行ってます。
>>281 残念ながらSHARPでして…でもOPOSなのでよろしければご教授願えますでしょうか?
>>284 フォームのCreateにもShowにも何も書いておりません。
>>288 ありがとうございました。
その2つのキーワードでググったら参考になるサイトが見つかって完成させることが出来ました。
>>284 |
|
(=) /V\
J /◎;;;,;,,,,ヽ> 悪いけどこっちも
_ ム::::(゚Д゚,,)::| 忙しいから
ヽツ.(ノ:::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
292 :
デフォルトの名無しさん :05/02/12 09:40:43
わりと規模の大きいプログラムになってくると、当然ソースが長くなりますが 複数のUnitに分割するのと一本のUnitにまとめるのでは、どっちがオススメなんでしょうか? やっぱり個人の好みの問題?
>>292 吐き出されるexeのサイズからいって一本まとめが正解
分散に一票。 整理することは、再利用のための一歩。
>やっぱり個人の好みの問題? 分割は目的ではない。 ソース、クラス、ロジックの分割は、ソースコードやクラス階層やロジック構造の整理の結果。 また、GUI 以前の開発環境は高々 80x25 のコンソールしかなかったので、上下左右にでかいコードは 疎んじられた。開発環境も思考を束縛するものだということ。 なので、オススメ。という物は無い。
>>294 「CD1枚に収めたい」みたいな目的がなければ、exeのサイズは
あまり気にしなくても良い。
>>292 可読性や再利用性を考えたら、やっぱり徹底的な分割と
グループ化が必要。
あとは構成管理かな。
>>296 > オススメ。という物は無い。
でっかいコードやクラスを書けという人は、古今東西一人も居ない。
1unitにまとめる・・(((((((( ;゚Д゚)))))))ガクガクブルブル
300 :
292 :05/02/12 11:08:38
みなさんレスありがとうございます 自分の場合、二重起動防止等をあらかじめ追加した自前のデフォルトdprを用意しといて 新規でアプリを作るときにはそこから始めてたんですけど、そこらへんも含めて 分散化して管理する方向に切り替えてみようかと思います
>>299 1unitだとプリントアウトが楽っていう利点もあるぞw
ラベルにaを使うにどうすればいいでしょうか? for a := 1 to 3 do begin Label1.Caption := IntToStr(a); Label2.Caption := IntToStr(a); Label3.Caption := IntToStr(a); end; このような感じをねらっています。 for a := 1 to 3 do begin Label[a].Caption := IntToStr(a); end;
>>292 Delphiではunit=namespaceだからその単位で分割する。
数学・数値処理ならMathユニットに放り込んであるし
文字列処理関数はStrUtilsでカテゴライズしてある。
Form1に関連する処理はUnit1に記述する。
現実的には常に1unitというのはありえない。
>>283 ありがとうございます!
ただ、まだどうしても「[エラー] Unit1.pas(517): 未定義の識別子 : 'GetJpegSize'」が出てしまいます・・・
「GetJpegSize」をヘルプで検索したのですが見つかりませんでした
そんな標準関数はDELPHIには無いよ
>>307 「[エラー] Unit1.pas(588): 変数実パラメータと変数仮パラメータとは同一の型でなければなりません」が出てしまいます・・・
ちょっと質問させてください。 TPaintBoxをフォーム上にalClientで置いて、そのOnPaintイベントで、 そのときのTScrollBarの位置に応じてTBitmapの一部を切り取って bitbltで転送しています。 スクロール程度でしたら問題ないのですが、フォームをリサイズすると、 白い帯状のノイズが目に付きます。 OnPaintイベント内では、再入防止のための変数のチェック以外の 特別な処理は行ってません。 どうにか改善する方法はないでしょうか? よろしくお願いします。
>>304 ライブラリとしては、Unit=Namespaceでも良いのだろうけど
アプリケーション(の部品)としては、使い勝手が悪い。
VCLは古ぶるしく、今ひとつ参考にならない。
311 :
デフォルトの名無しさん :05/02/12 14:27:35
お前のレスも具体的に乏しく、今ひとつ参考にならな。
>>308 Unit1.pas の 588 行目にある GetJpegSize の呼び出しコードの、
二つ目または三つ目の引数が Word 型ではない。
としかわからないな。01350.html を元にしているのなら、X と Y の定義を
何にしましたか?
申し訳ありません自己解決しました。 デバイスの開閉をFormCreate部分から除き 別の場所で行うことによって正常に動作しました。 うまく動かなかったのはDLL側の記述の不備がありました。 お騒がせいたしましたm__m
>309 Windows の宿命で、イベントキューが埋まった場合に WM_PAINT は後回しに されます。かつ、複数の WM_PAINT はひとつに融合されてしまいます。 そのため、OnPaint が呼ばれるタイミングが遅くなるときがあります。 どうしても描画を優先させたければ WM_PAINT だけでなく、要所要所で描画することを 考えないといけない。この場合だと、枠のリサイズ時にも描画するとか。 あとはダブルバッファかな?
317 :
233 :05/02/12 17:39:44
>>315 ありがとうございます。
いろいろ試してみます。
319 :
デフォルトの名無しさん :05/02/12 18:16:15
ちょっと質問です。 一般的に、delphiでは配列は0から始めるべきでしょうか、 それとも1から始めるべきでしょうか。 自分はC人間なので0からにしたいのですが、 ヘルプだと1からの例ばっかりだったので。 みなさんの主観でよいので回答願います。
どっちでもいいなら0にしとけ。 Stringは歴史的経緯から1になってるだけ。
>>312 >>282 の
http://forum.nifty.com/fdelphi/samples/01348.htmlの通り 「I,K,Hd,Hd2,Pt,X,Y: Integer;」でX,YはいずれもIntegerです。
試しに
>>307 の「GetJpegSize」の
-----------------------------------------
function GetJpegSize(const FileName:String;
var JWidth,JHeight:Word):String;
-----------------------------------------
のWordをIntegerにしてみたのですがダメでした。
>>282 内で使われている「GetJpegSize」関数と
>>305 の「GetJpegSize」関数はまったく互換性がないみたいですね。
これでまた振り出しに戻ってしまった・・・
>>319 別に状況によりけり。
Cと違って添え字は順序型なら何でも良いわけだし
system.pasに実装されている処理を改造したいのですが、 他のユニット、例えばclasses.pasを改造するようにsystem.pasを 書き換えたものをプロジェクトに登録しても、 そのsystem.pasではなくデフォルトのsystem.dcuが使われてしまいます。 dprのusesでsystem in '……',を先頭に持ってきても同じでした。 これはsystemが暗黙にusesされるためだと思いますが、 独自のsystem.pasを使う方法があったら教えてください。
おたずねします。 case で書けるものを敢えて if で書くと何かデメリットがありますか?
caseの方が速い可能性があるかもしれない
>>320 ,322
レスどうもです。
じゃあ0にしときます、とりあえず。
>>325 お答えありがとうございます。case にします。
あれこれ試行錯誤したんですが完全に行き詰まってしまいました(´・ω・`)
どっかにソースうpってみたら
>>315 > あとはダブルバッファかな?
結局、いろいろやって、アドバイスの通り、
フォームの DoubleBuffered でチラツキが
完全に消えました。メモリもそれほど
消費してないみたいです。
ホントにありがとうございました。
はじめからダブルバッファのためにあるような質問だったね
>>328 Exif を読む分には GetJpegSize は必要ないんだから、削っちゃえばいいじゃん。
if GetJpegSize(ExifFile,X,Y) then begin
・・・
end;
を削れば動くでしょ?
どうしてもサイズが取得したいなら、
>>307 の引数を Integer にしたバージョンをがんばって作るか、
Jpeg ユニットを uses して TJPEGImage でも使えば?
ああ、書いた後に思いついたけど、 新たに WordX, WordY: Word とでも宣言して if GetJpegSize(ExifFile,WordX,WordY) then begin StringGrid1.RowCount:=StringGrid1.RowCount+1; StringGrid1.Cells[0,StringGrid1.RowCount-1]:='画像サイズ:'; StringGrid1.Cells[1,StringGrid1.RowCount-1]:=IntToStr(WordX)+'×'+IntToStr(WordY); end; でもいいよね。これなら、GetJpegSize を書き換える必要もないし。
334 :
デフォルトの名無しさん :05/02/13 11:04:43
Editから入力/削除した文字をそのまま 同じフォームの別のLabelに反映させるには どうすればいいでしょうか?
EditのOnKeyUpイベントで Label.Caption := Edit.Text するとか
>>335 バッチリ上手くいきました!
どうもありがとうございました。
OnKeyUpなんて使ったことなかった・・・
OnKeyUpだとマウスでの編集に対応できないからOnChangeにしとけ
>>338 OnChangeの方が広く対応できるということですね。
アドバイスありがとうございます。
340 :
デフォルトの名無しさん :05/02/13 17:00:12
今から常駐してやるから愚痴でもなんでも聞いてこい
誰一人 D2005 のバグを教えてくれません。どうしたらよいでしょう。
すまん。ここはくだすれだった。341 は忘れてくれ。
>>340 >>263 お願いします
試しにCommon Files以下のにある「CHEMICAL.BMP」で試したところ、
43.2KBが169KBにまで膨らんでしまいました
何が間違っているのでしょうか?
344 :
340 :05/02/13 17:19:52
ファイルを見てないから判らないが、 8(4or以下)ビット画像を24(32)ビット画像で保存しているのでは?
>>243 俺は340じゃないが、
ようするに、クリップボードを通すと、
256色が、なんで16bitとか24bitとかに化けるのかって意味?
>>340 さま
>>345 さま
Assignした後のPixelFormatが何故かpfDeviceになっていたので、
pf8Bitを明示的に指定したところ問題がなくなりました
ありがとうございました!
347 :
340 :05/02/13 17:35:08
TBitmap.Assignの箇所をみたが、PixelFormatに関してなにもやっていない TBitmap.LoadFromClipboardFormatのヘルプ例を参考にしてみ
重ね重ねすいません
Loadは出来たのですが、今度はSaveが…
TBitmapのヘルプのSaveToClipBoardFormatの例を実行したのですが、
クリップボードへ出力してIrfanView等で読み込むと
何故かファイルサイズが膨らんでしまいます… orz
>>345 さまのおっしゃるようにbitが化けているようなのですが、
どうやったら8bitとしてクリップボードへ保存出来るのでしょうか?
procedure Hoge;
var
MyFormat : Word;
Bitmap : TBitMap;
AData: Cardinal;
APalette : HPalette;
begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile('CHEMICAL.BMP');
Bitmap.SaveToClipBoardFormat(MyFormat,AData,APalette);
ClipBoard.SetAsHandle(MyFormat,AData);
finally
Bitmap.Free;
end;
end;
349 :
デフォルトの名無しさん :05/02/13 17:48:56
バッチプログラムの動かし方について質問させてください。 Del側で取得した文字列を引数としてバッチを呼び出しているのですが (複数の文字列情報をバッチ側で処理したいんです)、 まとめて一文としているためか256文字以上になると バッファオーバーフローと表示されてしまいます。 複数ある引数を一つずつ渡せば回避できるかもとか考えたのですが、 上手い方法はないでしょうか?
350 :
340 :05/02/13 17:50:02
APaletteやADataっていきなり出てきてるようだが、Bitmapのメンバじゃないのか?
351 :
340 :05/02/13 17:52:32
バッチ側のプログラムがDelphiでは無い?のでスレ違い バッチ側のプログラムが悪いんだろ
オーバーフローがどっちででているかに因るだろ
>>350 6Personalのヘルプの例では「AData,APalette : THandle;」と宣言されているのですが、
コンパイルしようとすると
「変数実パラメータと変数仮パラメータとは同一の型でなければなりません」
と怒られてしまうため、同一の型に適当に変更してしまいました
アフォ
ちょっと、違うよ。 VCL内部で勝手に、pfDevice にしてClipboardのハンドるで取得したHBitmapからBitBltで複製してるから 元のクリップボードの色数とかは反映されない仕掛けのようだから、 自前で、TBitmap.LoadFromClipboardFormatを参考にして ClipBoard.GetAsHandle(cf_Bitmap) して GetObject(AData, sizeof(DIB), @DIB); で 収得したDIBのメンバーから色数とか調べて設定してからという処理が必要になるんじゃないかな このあたりはVCLのコードとWindowsのヘルプを参考に見てゆくしかないよ
俺はいつもここで、NkDIB推薦している奴だけど、 今回もTBitmapのかわりにTNkDIB使ってみたら?
358 :
デフォルトの名無しさん :05/02/13 18:47:48
>>351 >>352 舌足らずですみません。
バッチ側が悪いというよりはWinのシェルが一回のコマンドで
受け付けられる文字数が最大255文字だそうです。
一度にすべての情報を渡すとオーバーしやすいので
なんとかDel側で複数に分けて同じバッチのプロセスに
引数として文字列を突っ込む方法はないでしょうか?
という意図の質問でした。
ちなみにエラーが出たのはDel側で、256文字以上の文字列を
WinExec関数で実行させようとすると出てきました。
説明がヘタクソですみません。
359 :
デフォルトの名無しさん :05/02/13 18:52:27
単純にプロセス間通信 cmdバッチじゃ無理だろう
でかいデータはテンポラリファイルか標準入出力
>>356 >>357 とてもご丁寧にしてくださり、恐縮です
…が、最近Pointerを理解し始めた程度の初心者ですので、
そこのサイトに何が書いてあるのかイマイチわかりません…
でも、泣き言言っててもしょうがないので、とりあえず
357様の推薦してくださったNkDIBを使って頑張ってみます
本当にありがとうございました
色々いじっていたらナゼかバッファオーバーフローは出なくなりました。
その後も表記されるエラーはEAccessViolationで、
WinExecを実行する前のStrAllocで確保するとき
多めのバイト数を指定することで問題を回避できました。
256文字以上でも平気で実行されるのが少し気になっているのですが…。
(128or255が最大っていう表記は結構見かけたんですが何か勘違いしてるっぽいです)
もう少し調べてみます。
>>359 プロセス間通信は試したことがないので方法に見当がつきません…。
改めて調べてみます。
>>360 テンポラリファイルを作るのは考えつかなかったです。
大きなデータを扱う時に試してみたいと思います。
とりあえず、ソース出せ
ポップアップヒントについて教えてください。 Delphiのエディタにあるように、特定の文字の上にカーソルが来ると、 定義場所を示すような黄色背景のヒントがすが、これの実現方法が 分かりません。 Application.OnShowHint なんかとは違うような気がするんですが、 どうなんでしょう。 よろしくお願いします。
365 :
デフォルトの名無しさん :05/02/13 23:45:39
HintWindowClass
366 :
デフォルトの名無しさん :05/02/13 23:53:01
デルヒの超初心者用参考書を教えてください。 Javaで言えばやさしいJava(高橋氏)、Cでいえば、C言語1(倉薫氏)くらい簡単なのがよいです よろしくお願いします。
367 :
デフォルトの名無しさん :05/02/13 23:53:28
368 :
デフォルトの名無しさん :05/02/14 00:02:08
ありがとうございます そこ見たんですが、基礎からわかるDelphi6とカンタン!Delphiプログラミング はもう売ってないみたいですし、 Delphiはじめの一歩 やさしいプログラミングはアマゾンで不親切とあります やはりデルヒはほかの言語をマスターしてからじゃないとつらいんでしょうか
>>366 悲しいことに、おすすめの本はいまや古本屋でしか入手出来なさそう。
とりあえず初心者用の本って、言うじゃない? でもあんた、目的意識がなけりゃどんな本見ても無意味ですから
>>369 そうなんですか。
新品での購入はあきらめます。ありがとうございました。
別に最初の言語としてDelphiは向いてないということはない(と思う)。 分からないところはオンラインの解説サイトもいくつかあるから そこを参照するなりここで聞くなりすればいいし。
>>371 まあ、seventh delphiというサイトを最初は見るのがいいよ。
あそこの旧Delphi入門
>>365 なるほど。HintWindowClass ですか。
コントロールの ShowHint を細かく切り換えて、
OnShowHint で位置などを指定してたんですが、
これじゃ、一定時間後にヒントが消えちゃいますものね。
THintWindow のヘルプを読んでみます。
ありがとうございました。
質問です。 exe埋め込みwave再生したいのですが、 tips本のとおりやっても再生できません。 ご指摘お願いします。 具体的にはpsoundに "RIFF、f"が代入され,sndPlaySoundでエラーです。 procedure oto(a:integer); var h,hwave:thandle; psound:lpstr; t:string; begin hwave:=0; psound:=nil; t:=inttostr(a); if length(t)=1 then t:='0'+t; t:='sound'+t; h:=findresource(hinstance,pchar(t),RT_RCDATA); if h<>0 then begin hwave:=loadresource(hinstance,h); if hwave<>0 then begin psound:=lockresource(hwave); if psound<> nil then sndPlaySound(psound,SND_ASYNC) end; end; end;
rcファイル sound01 RCDATA "1.wav" sound02 RCDATA "2.wav" sound03 RCDATA "3.wav" sound04 RCDATA "4.wav" sound05 RCDATA "5.wav" sound06 RCDATA "6.wav" sound07 RCDATA "7.wav" sound08 RCDATA "8.wav" sound09 RCDATA "9.wav" インデント解除されているようで見難くてすいません。
SND_MEMORYがいるのでは? あと、Formatの使い方を覚えよう。
Cの%2dみたいに書式付で出力するにはどうすればいいんでしょうか?
>>380 Format関数。
VB風の書式化文字列はFormatFloatやFormatDateTimeだな〜ん。
FileListBox は同ディレクトリないのファイルを出力してくれるのですが、 例えば、同ディレクトリ内に logディレクトりを作り そのlogディレクトリ内のファイルを出力させる場合を教えてください。 Maskを *\log\*.txt ではなんともならなく、 他にディレクトリを指定できるところもなく、弱っています。 どうすればいいでしょうか?
382です ありがとうございます。わかりました。 FileListBox1.Directory := 'log'; で出来ました。お騒がせしました。
TDirectoryListBoxと連携させてるならそれを切って、 TFileListBox.DirectoryにTDirectoryListBox.Directoryから取り出したパス文字列に \logを付け足して動的にセットしてやるといいんでは?各階層に\logフォルダの存在チェックもしつつ。 procedure TForm1.DirectoryListBox1Change(Sender: TObject); var path,logpath:TFileName; begin path := DirectoryListBox1.Directory; logpath := path + '\log'; if DirectoryExists(logpath) then begin FileListBox1.Directory := logpath end else begin FileListBox1.Directory := path end; end;
>>384 ありがとうございます。
とてもいい感じにうまく動作しました。
これより、どのようになってるか理解していきます。
386 :
デフォルトの名無しさん :05/02/14 16:01:03
質問です。 DelphiでDLL作って、DLLの呼び出し元からウィンドウハンドルもらって、 Delphiで作ったフォームをそのウィンドウハンドルのモーダルウィンドウとして 表示したいのですけど、どのやうにすればいいのでしょうか?
俺も知りたいちょー知りたい
どの部分が分からないの?
ちなみにモードレスウィンドウとして表示はできてるの?
どっちも知りたいちょー知りたい
DLLへの初期化引数として呼び出し元のApprication.Handle(THnadle)型を渡して、 それをDLL側にて自身のApprication.Handleへ代入。 DLL側で自身の初期処理用手続きを書いてそこで引数(Handle)受け取ってやるといい。 それが終わったら同じ初期処理内で自身をShowModal。
>>391 Formのインスタンスを作るときの、コンストラクタの引数は何にすればいいんでつか?
オーナーを何にすればいいかって事? Apprication 変数を使うか、 ShowModal するんだからnilでも
をを、TApplicationって、TComponentから継承されていたのね! しりませんでした。つーか、この辺の処理をよく理解していない(汗
395 :
392 :05/02/14 17:46:10
追加質問ですが・・・ TApplication.Handleのヘルプに、 >これにより,ホストアプリケーションの DLL のフォーム部分が作成されます。 >このハンドルは EXE 内の Handle プロパティに割り当ててはいけません。 って書いてあったんですが、よう意味がわかりません。 偉い方、教えてください。
396 :
375 :05/02/14 20:59:01
>>377 リンク先の方法ではじめはトライしましたが、
うまくいきませんでした。
>>379 SND_MEMORYの件とりあえず調べてみます。
sage忘れ(おそいけど)
>>396 リソースストリームで読み込んで、マルチメディアAPIでガシガシ再生すれば?
あと、某有名MP3プレーヤコンポはストリーム再生もサポートしているから、
WaveをMP3にして、リソースストリームを直接再生してやると、Waveのサイズによっては
EXEが小さくなってお徳かも。
「リソースがちゃんと作成出来てない」ってオチじゃ、あるま〜にゃっ!
DirectXのxファイルをはき出させたいのですが、いいコンポーネントかライブラリってありませんか。
変数の中身を変数とする方法を教えてください。 たとえば data := 'test'; と変数'data'に'test'というデータを格納し dataの中の test を変数名として test := '中身'; ということをしたいんです。 perlでいうあらわすと $data = "test"; $$data = "中身"; print $test; と、すると 「中身」と表示される。 よろしくお願いします。
できない
>>401 Strings.Objects[Strings.IndexOf('hoge')]
みたいにやって代用できなくもない。
しかし面倒。しかもアイテムが数千、数万になると悶絶しそうな遅さ。
実用性を考えるなら、ハッシュ値で絞り込むようなデータ構造を自分で作るべし。
ここでTemplateが使えないというDelphiの悲しさが・・・
すなおにできないって言うべき
>>401 それに近いのはプロパティかな。
実行時型情報の仕掛けでプロパティにアクセスするようにするといいよ。
近いのではなく「変数の中身を変数とする方法」の質問してる。 Delphiでは出来ない。データ構造ではなく、言語使用の問題だから。
すなおにできないって言うべき
動的にソース吐いてビルドしてbplロードしてプロパティ列挙すれば出来る 要dcc32w
プロパティと変数の区別もつかない香具師は回答しなくていいよ
やりたきゃ普通の変数だって出来るぞ function getvaraddr(varname: string): pointer; begin if varname = 'test' then Result := @test; end;
無理してDelphiでやるなよ(´・ω・`)
hogeかも知れないし
>>411 変数とプロパティの区別ってなんですか?
変数は変数、プロパティーはプロパティー
プロパティと変数の区別の説明もできない香具師は回答しなくていいよ
やっぱり知らないらしいな。こんなのばっか・・・
だから、例えばフォームにpublishedでプロパティを定義しておくだろ? published property hoge:Integer; で、ctrl+ALT+Cで後の定義はやってくれる。 そうすると、こいつは実行ファイルに、プロパティ名が埋め込まれる。 実行時型情報という奴だ。 uses TypeInfo して GetPropValue / SetPropValue でアクセス出来る。 例 SetPropValue(Self,'hoge',data); ね? これなら簡単だし、手間不要でしょ? しかもプロパティだから、書き込み時にアクションさせる事も出来るし
あ!、フォームの場合は、published にするだけで埋め込み出来るけど 外部アクセス可能な変数だけのクラス作りたいとかいう場合は、 {$TYPEINFO ON} するか TPersistent から継承するといいよ
事前に定義して置いたら意味ないしそこまでしてやりたいなんていってないだろ。 フサスレ池
すみません、プロパティーじゃなくて、変数の中身を変数とする方法を教えてください。
>>421 ああ、事前に定義しないで自由に変数を使いたいわけね。
それはインタプリタの技術を応用するといいよ。
トイインタプリタとしてギコbasicがあったんだけど・・・
delphiの言語仕様でできるか否かって話だったような
>>423 文字列からハッシュ値計算して、ハッシュ表から該当するポインタ取って来て、
そこにアクセスするデータ構造くらいすぐに作れるだろ?
まさかわからん?(´,_ゝ`)プッ
429 :
デフォルトの名無しさん :05/02/15 16:48:54
皿仕上げ
もう、まともな回答者はいなくなったのか・・・・
フォームのOnShowイベントで重い処理をすると その間、フォームが表示されませんよね。 この重い処理をフォームが表示されてから行いたいのですが どうすればよいのでしょうか。 その間Screen.Cursorを砂時計にしているのですが、フォームが表示されていないので カーソルも変わらず、アプリが動いているのかすらわからない状態で困っています。
詰まったところを後回しにしてプログラムつくってたら なんか荒れてしまったようですね・・・ 回りくどいことして実装する気はないので 別の方法を考えます。 いろいろ提案をありがとうございます。
>>431 OnShowでやらずにタイマーを貼り付けてタイマーのイベントで1回だけ実行するとか
m9(^Д^)プギャー
>>431 TForm1 = class
private procedure CMShowingChanged(var Msg:TMessage); message CM_SHOWINGCHANGED;
procedure TFormEx.CMShowingChanged(var Msg: TMessage);
begin
inherited;
if Visible then
begin
Update;
// todo:ここに処理を記述
end;
end;
>>431 初期処理に時間かかる場合はスプラッシュフォーム出して、その間に処理。
それからMainFormを表示という定番の手も。
その初期処理を考え得るだけ最適化(効率化)する事に努めるのも大事。
>>435 アンタ俺のネ申だ!
バリバリ最高でスッキリしますた。
>>433 とりあえずそれで回避していましたが禿しく不満だったので質問しますた。
>>437 当然、限界まで最適化したつもりですが、ショートカットにD&Dされたファイルの処理なので
無数のファイルをD&Dされるとどうしても数秒かかる。
スプラッシュは昔から好きじゃないので。
みなさん、どうもありがとう。
439 :
デフォルトの名無しさん :05/02/15 22:04:43
csvデータを簡単にParadoxの.dbデータに変換できませんか? 又、その逆も。
441 :
デフォルトの名無しさん :05/02/15 23:23:03
勉強不足ですみませんでした。 参考にさせてもらいます。
質問です。 自分が作ってるブラウザに串を設定するための処理を書いてるんですが 通そうとする串が生きてるか死んでるかを判定する方法が分かりません。 串の状態を取得して生き串か折れ串なのかを見分けるにはどうすればいいんですか? ちなみに串の設定にはUrlMkSetSessionOption()を使っています。
bevelInner/Outerをnoneにする
>>438 procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
ApplicationEvents1.OnIdle := nil;
ShowMessage('OnShow以降、ここで初期化できるよ');
end;
OnShowでメッセージ投げてメッセージハンドラで処理するのがイイ。
んで、Show するたびに初期化されると
Delphi6 Personalでブラウザを作ろうと思ってIndy9をインストールしてidHTTPClientをフォームに配置したんですが、それから何をやればいいですか? やりたいことは指定したページを表示させたいです。
>>451 無事できましたー。
ありがとうございます。
すいません、Delphiでは文字列からインスタンスの生成は出来ないのでしょうか? 目的はデザインパターンのファクトリーメソッドパターンをDelphiでやりたいと思っています。 JavaでいうClassクラスのようなものはDelphiには存在しないのでしょうか? ご存知の方がいらしたらご教授下さい。
クラス参照型のこと?
TClass というのが、メタクラスになるけど 文字列からクラス名を識別してそのクラスインスタンスを作成したいなら 実行時型情報の仕掛けを使う事になるでしょ。 TypeInfo をあちこち覗いてみたら?
狭い範囲でやるならプロジェクトのスタートアップコードで Application.CreateFormがやってるようにクラス参照型で渡す。 広い範囲ならCOMにしてCreateOLEObjectなどを使う。かな?
VirtualListViewの使い方教えてください。 Demoのは難しくてわかんない。
>454〜456 レスありがとうございます。 教えて頂いたことをヒントに頑張ってみます!
>457 Demo のどこら辺が理解できなかった? Virtual ではない ListView を使わない理由は?
>>459 > Demo のどこら辺が理解できなかった?
OnDataFindイベントの発生するタイミングと引数の意味がわかりません。
> Virtual ではない ListView を使わない理由は?
フォルダ内の画像ファイルのサムネイルを表示したいのだが、Virtualでないと
ファイル数が多い場合にかなり時間がかかるから。
461 :
デフォルトの名無しさん :05/02/17 14:51:04
C++使っていましたが、都合でDelphiを使わなければならなくなり質問。 Object Pascalってクラスのインスタンスを生成(破棄)したときに自動的にコンストラクタ (デストラクタ)を呼ばないの?例えばC++なら void cpp(void) { AClass instance; // AClassのコンストラクタAClass::AClass()が呼ばれる : : } // 関数cppのスコープを出る時にAClassのデストラクタが呼ばれinstanceを破棄 Object Pascalの仕様では明示的にコンストラクタ、デストラクタを呼ばなければならない のでしょうか?
そうです
>>462 おおっ、すばやいご回答有難うございます。
C++の感覚でコーディングしてうっかりコンストラクタ/デストラクタを呼び忘れたら
原因を特定しにくいバグをこしらえてしまいますね。気をつけようと思います。
普通はデストラクタはDestroyじゃなくてFreeを呼ぶけどね。
>>461 Delphiでは、クラスは、動的にしか使えんのですよ
静的にも使えるObject型はDelphi8で消えたしな
あと、デストラクタは、Freeとnil代入を行うFreeandNil()が便利
466 :
デフォルトの名無しさん :05/02/17 17:05:30
質問させて下さい。 現在、親フォームと子フォームを持つ(Unitを二つ持つ)プログラムを作っています。 同一の変数を複数のUnitで使うには、uses節に該当するUnit名を追加すればよいということは分かったのですが、 それでは、関数(手続き)をUnit間で共有するためにはどのようにすればよいのでしょうか(そのやり方が分からないため、現在は、全く同じ関数をUnitごとに書いています)。 ヘルプの「複数のユニットの参照と間接的なユニット参照」の項には、関数は共有できるというようなことが書かれているのですが、やり方がイマイチ判然としません。 具体的なソースコードが分かれば大変助かります。どうぞ、ご教示下さい。
関数も同じ。専用ユニットを作って、interface 部に宣言を implementation 部に 実装する。ソースが見られるなら、VCL でも同じになってるよ
>>466 関数を定義した、別のユニットを用意すればいかがですか?
>>466 君は IntToStr() 関数を使ったことがあるだろ? Unit1 でも Unit2 でも
Uses に SysUtils を含めると使える。だから、たとえば MyFunc.pas とか
のユニットファイルを作って
>>467 のようにするだけ。
Unit2に定義した関数FooをUnit1から使うには以下のようにする。 unit Unit2 interface procedure Foo; implementation procedure Foo; begin end; end. unit Unit1; interface implementation uses Unit2; // implementationの下でusesする procedure bar; begin Foo; // unit2のFooをコール end; end.
Delタン怖い
>>466 とりあえずその関数の宣言をPrivateからPublic宣言に移動させてみては。
それでとりあえず効果は確認できると思う。
スマートにやるならやはり別ユニット方式で、
新規に関数専用ユニットを作って各Unitからそれをuse。
473 :
デフォルトの名無しさん :05/02/17 21:26:27
他のソフトのエディットコントロールの、選択範囲の文字列を取得するには、 どうすればできるでしょうか?
>>472 Private・Public宣言はクラス内の宣言だと思うのだが?
>>473 日本語のWin32ヘルプがCDROMに付いてた筈。
それでエディット コントロールの概要を見てみたら?
>WM_COPYメッセージは、 エディット コントロールで現在テキストが選択されていれば、
>選択範囲のテキストを削除せずにエディット コントロールからクリップボードにコピーします
ソースが公開されているDelphi製のマクロソフトないでしょうか? 現在使ってるものに少々手が届かなくて歯がゆいんですが、 一から作るのは実力的にきついものがあるので。
477 :
466 :05/02/18 12:18:23
ありがとうございます。 頂いた情報を元にして、とりあえず動くものはできました。 解説の意味内容を本当に理解するには、オブジェクト思考プログラミングについてもっと勉強しなければならないということだと思います。そちらについても、徐々に勉強していきます。 わざわざ回答して頂いて、ありがとうございました。
OOP関係なし。ユニットファイルの構造について知るだけ。ヘルプに書いてある。
480 :
デフォルトの名無しさん :05/02/18 14:02:37
スイマセン。 「処理中です」ってウインドウを出したいんです。 もちろん処理が終わるとそのウインドウも自動で閉じるって感じのやつで。 どうやってだすんでしょう?お願いします。
もうひとつフォーム作って、ラベル貼って「処理中です」にして、好きなときに Show
>>481 その方法って、新しく作るフォームに処理を書かないとダメな気がするんですが・・・。
ShowMessageみたいなヤツが希望なんですけども、
無いならば481氏の方法でやります。481サンありがとう。
DelphiのIDEはダイアログエディタなんだよ。それつかってダイアログ作るのさぼってどうする。
>>431 動的に作ればいいの?
procedure TForm1.Button1Click(Sender: TObject);
var f:TForm;
procedure msg(s:string);
begin
f.width:= f.Canvas.TextWidth(s)+20;
f.Canvas.TextOut(10,10,s);
end;
begin
try
f:=TForm.Create(nil);
f.Caption:='メッセージ';
f.Show;
msg('今ナニしてるからちょっとまって');
Sleep(1000);
msg('もうすこし');
Sleep(1000);
finally f.free end;
end;
486 :
デフォルトの名無しさん :05/02/18 16:31:08
C言語のfseekみたいな関数はありますか?TFileStreamで大きいファイルの中から指定された部分を読み込んだり書き込んだりしたいのですけれど。
あります
Position: を使うか、seekメソッドを使うのだけど 32ビットの壁があるから・・・
いちいち2ギガバイト以下のファイルだけ適用できる、とか注釈しなくてもいいんでは?(笑)
TFileStreamで大きいファイル
>>488 Del6以降はInt64のSeekがあるよ
ところでC言語のfseekが2ギガ超にアクセスできるの?
494 :
デフォルトの名無しさん :05/02/18 19:56:14
そこを ユニット名.CopyDataToOld(Wnd,ParamCount); クラス名.CopyDataToOld(Wnd,ParamCount); とかすればいいのでは?
単にそのunitがプロジェクトに加えられてない(useされてない)だけかも。
useじゃ構文エラーだけどな
フォームで開いた画像の色を取得したいんですがどうしたらいいですか?
Canvas.Pixels[]
>>495 ユニット名でもダメでした。フォームがないユニットなのでクラス名は無いです。
>>496 それはDelphiさんが勝手に付けてくれたので付いてました。
画像の色だぞ?
できました。
そのユニットのinterface部にprocedureのヘッダを書いてあげればよかったみたいでした。
もしかして
>>496 はそういう事を言ってたのかな。
APIのNetUserGetLocalGroupsを使いたいのですが コンパイルすると未定義の識別子エラーになります。 USESに何か足らないと思うのですが分かりません。 何を追加すれば良いですか?
505 :
デフォルトの名無しさん :05/02/19 12:26:24
'TStrings' と 'String' には互換性がありませんと言われるのですが、どういう事でしょうか?
>>505 TStrings はエディタのような文字列が集まった構造を扱うもので文字列とは違います。
TStringsのインスタンスのメンバー Text や Strings[ ] がString 型です
-------------
で私の質問
const c=[1,2,5] みたいに定義した集合の、全部の要素にアクセスする一番良い方法は?
for i in c do みたいな構文があればいいのですが
507 :
デフォルトの名無しさん :05/02/19 13:08:03
自分で調べた範囲では格好いい方法ないですね。 だから for 文が拡張されるのか
>>506 こんな感じ?
const
Hoges: array[0..2] of Integer = (1, 2, 5);
var
i: Integer;
for i := Low(Hoges) to High(Hoges) do
ShowMessage(IntToStr( Hoges[i] ));
ああ、ごめん集合型か。配列と読み間違えた。
>>510 うん。 動的配列を返す関数でも作ろうと思ったけど、結局集合要素に効率的にアクセスする方法が無くて格好悪い
low(c)で最小要素 とかがあればいいんだけど、集合構成子には効かないし
513 :
デフォルトの名無しさん :05/02/19 15:12:46
>>506 const c=[1,2,5];
var a: set of Byte;
a := c;
i := 0;
while a <> [] do begin
if i in a then begin
// いろいろ
Exclude(a,i);
end;
Inc(i);
end;
こんな感じでどう?
High, Low が集合型に使えれば便利なのに・・・
for item in set do ... 構文は、次のDelphi言語の拡張で実装されますね・・・
>>504 解決しました。ありがとうございました。
>>506 ちょっと違うけど
type
Tc = (c1, c2, c5);
cs = set of Tc;
var
c: Tc;
f: cs;
begin
f := [];//集合
for c := Low(Tc) to High(Tc) do
begin
if c in f then ; //処理する
end;
end;
これではだめかい
>>513 ありがとう。 似たような方法でやってたけど、結局
>>509 に近い方式にしちゃった。
>>515 それはダメなんだ。
実は要素は大きな列挙型で定義されてて、そのうちの何個かの集合を効率良く操作したかったの
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MyEdit := TEdit.Create(self); MyEdit.Parent := self; MyEdit.BorderStyle := bsnone; MyEdit.Left := x; MyEdit.Top := y; Myedit.SetFocus; end; こんな感じでフォーム1をクリックしたときにTEditを表示して フォーカスを当てるようにしたんですが、 MyEditのonchangeイベントはどのように書けばいいのでしょうか?
518 :
デフォルトの名無しさん :05/02/21 11:11:10
Object Pascalでインスタンスの破棄をメソッドではなくデストラクタでやる必然性が よく分かりません。例えば type AClass = class destructor Destroy; procedure CleanUp; end; AClass.Destroy; begin CleanUp; end; とした場合 var instance : AClass; begin . . instance.CleanUp; end. としてはまずいのでしょうか?
>>518 一般的な方法に従っておいたほうがバグを減らせる。(そういう意味で、命名規約にも従いましょう。)
それに、オーバーライドされたデストラクタで解放処理をまとめて行えば、他のオブジェクトに
インスタンスを所有させるなどの処理がやりやすい。
例えば、TObjectListとかに放り込むような処理がやりやすくなる。
自己解決しました。
>>518 もしCleanUpの中でAClassが持つフィールド等の破棄をしているだけなら、
instance自身が格納されているメモリ領域は開放されない。
Edit1に文字を入力した後、Edit1に何も書かれていない場合に Edit1をdestroyしたいんですがどうしたらいいですか?
Free する
自己解決しました
526 :
デフォルトの名無しさん :05/02/21 22:04:05
IntToStrとか大文字小文字をやったほが見やすいとは思うのですが、SHIFTを押す事があまり無いので こうやって入力すると遅くなってしまいます。 皆さんはIntToStrのようにしてますか? それともinttostrとしてますか?
テキストファイルの重複行を削除するにはどうすればいいでしょう?
procedure implementation function procedure function ↓ procedure implementation function のようにしたいのです。つまりまったく同じ内容の行は1行だけにしたいということです。
var SL: TStringList; i, j: Integer; SL := TStringList.Create; try SL.LoadFromFile(FileName); for i := 0 to SL.Count-1 do for j := i + 1 to SL.Count-1 do if SL[i] = SL[j] then SL.Delete(j); SL.SaveToFile(FileName); finally SL.Free; end; 試してないから間違ってるかも
>>526 SHIFTはもう無意識に押してるかんじ。
一回inttostrとやってもなんかスッキリしないから戻って打ち直すし。
一行ずつ下をみて同じ行があったら、下からDeleteしていく。 procedure TForm1.Button1Click(Sender: TObject); var sl:TStringList; i,j:integer; begin sl := TStringList.Create; i := 0; try sl.Add('procedure'); sl.Add('implementation'); sl.Add('function'); sl.Add('procedure'); sl.Add('function'); while i < sl.Count-1 do begin for j := sl.Count-1 downto i+1 do if sl[j] = sl[i] then sl.Delete(j); Inc(i); end; finally Memo1.Lines.Assign(sl); sl.Free; end; end;
>>526 全てはコード補完に任せてる。
小文字で intt まで打って補完。
予約語は全部小文字にしてます。
ちなみに then や do の後ろに改行せずに begin を書いています。
>>530 、532
ありがとうございます。私が考えついたのは恥ずかしながら以下のようなものでした。
Addしているぶん容量が大きくなると遅いでしょうね。勉強になりましたです。
function DuplicateLineDel(S: string):string;
var
SR,DE: TStringList;
No : Integer;
dmy : string;
begin
if S <> '' then
begin
SR := TStringList.Create;
DE := TStringList.Create;
DE.Text := S;
while DE.Count > 0 do
begin
dmy := DE[0];
DE.Delete(0);
repeat
No := DE.IndexOf(dmy);
if No > -1 then DE.Delete(No);
until No = -1;
SR.Add(dmy);
end;
Result := SR.Text;
SR.Free;
DE.Free;
end;
end;
535 :
デフォルトの名無しさん :05/02/22 00:06:04
文字から文字コードへ変えるのってどうするんでしたっけ? chrの反対の動作です
Ord でも Byte キャストでも
537 :
デフォルトの名無しさん :05/02/22 00:09:26
538 :
デフォルトの名無しさん :05/02/22 00:14:03
539 :
デフォルトの名無しさん :05/02/22 00:15:47
>>534 遅いかもしれないけど、TStringList.Duplicatesを使うのが簡単だと思うが。
>>535 Ord()?
>>539 ヘルプより
Duplicates プロパティは,ソートされたリストに重複文字列を追加できるかどうかを指定します。
今回のとは機能が違うんじゃないの?
541 :
デフォルトの名無しさん :05/02/22 00:29:32
542 :
539 :05/02/22 00:34:12
結果を収納する方のTStringListを Sorted:=True; Duplicates:=dupIgnore; にすれば、重複の判定が要らない分コードがすっきりするかと思ったんだけどね。 おそらく内部的にはバイナリサーチしてそうだから、普通にループ回すよりこっちの方が早いかも。 ソース見てないから断定はできないけど。
だからソートされちゃまずいんだってば procedure implementation function procedure function ↓ procedure implementation function
544 :
デフォルトの名無しさん :05/02/22 00:39:58
529を読む限り、ソートされちゃまずいとは書いてないと思うが。 「同じ内容の行は1行だけにしたい」というだけで。
サンプルのスピンエディタでSHIFTキーを押しながらクリックするときIncrementの値を 変えたいのですが、以下のコードでは当然ながらいったん数値が変更されたとき以降で ないとIncrement値も変更されません(スピンエディタにはOnChangingイヴェントがない)。 何か方法はないでしょうか? TForm1.SpinEdit1Change(Sender: TObject); begin if GetKeyState(VK_SHIFT) >= 0 then // SHIFTキーが押されてないとき SpinEdit1.Increment := 1 else SpinEdit1.Increment := 10; end;
546 :
デフォルトの名無しさん :05/02/22 00:57:16
>>545 TSpinEdit.WindowProcをサブクラス化してクリックのタイミングを取得。
532 です。おもしろいので、ソートしてもよいとして、532の方法と542の方法の 実行速度を測ってみました。Delphi6 in Win2k ランダムに三桁の数字を発生させて、3万行のテキストファイルをつくりました。 procedure TForm1.Button1Click(Sender: TObject); var i:integer; sl:TStringList; begin Randomize; sl := TStringList.Create; for i := 1 to 30000 do sl.Add(IntToStr(Random(900)+100)); sl.SaveToFile('c:\Test1.txt'); sl.Free; end;
532の方法 procedure TForm1.Button2Click(Sender: TObject); var sl:TStringList; i,j:integer; start,stop:DWORD; begin sl := TStringList.Create; sl.LoadFromFile('c:\Test1.txt'); Start := GetTickCount; i := 0; while i < sl.Count-1 do begin for j := sl.Count-1 downto i+1 do if sl[j] = sl[i] then sl.Delete(j); Inc(i); end; stop := GetTickCount; Label1.Caption := IntToStr(stop-start); Label2.Caption := IntToStr(sl.Count); Memo1.Lines.Assign(sl); sl.Free; end;
542の方法 procedure TForm1.Button3Click(Sender: TObject); var sl1,sl2:TStringList; i:integer; start,stop:DWORD; begin sl1 := TStringList.Create; sl1.LoadFromFile('c:\Test1.txt'); Start := GetTickCount; sl2 := TStringList.Create; sl2.Sorted := true; sl2.Duplicates := dupIgnore; for i := 0 to sl1.Count-1 do sl2.Add(sl1[i]); stop := GetTickCount; Label3.Caption := IntToStr(stop-start); Label4.Caption := IntToStr(sl2.Count); Memo1.Lines.Assign(sl2); sl1.Free; sl2.Free; end;
[結果] 何度か実行させると値がばらつくものの、542の方法が532の方法より30倍以上 速いです。ソート+バイナリサーチの威力が分かりました。
> TSpinEdit.WindowProcをサブクラス化してクリックのタイミングを取得。 what? what? (w やはり難しいのですね。
552 :
518 :05/02/22 09:36:42
>>519 >>521 レス、どうもです。つまり、デストラクタはDestroyという名前にして必ず仮想メソッドとする
そして動的に割り当てたインスタンスを破棄するにはdisposeではなくfreeを使う
という理解でよいですか?
553 :
デフォルトの名無しさん :05/02/22 10:09:23
簡単な質問で申し訳ないのですが、 ある文字列「---,--,----,----」から、例えば2つめと3つめのコンマで 囲まれた文字列を取り出すにはどうしたらよいですか。 各コンマで囲まれている文字数は決まっていません。
FAQ。TStringList.CommaText を使う
>>552 > そして動的に割り当てたインスタンスを破棄するにはdisposeではなくfreeを使う
dispose は動的にメモリを割り当てられた型付ポインタのメモリを開放する
インスタンスの破棄とはそもそも無関係。
仮想メソッドでない TObject.Free をよぶことによって、仮想メソッドである
Destroy が下位クラスの実装から順に多態的に呼ばれることが保証できる。
556 :
デフォルトの名無しさん :05/02/22 11:26:09
「注意 LoadFromFile は,Add メソッドを使って,ファイルから読み出した文字列を追加します。」 TStrings.LoadFromFileのリファレンスにこうありますが では、Addメソッドで一行ずつファイルから読み込む事はできないのですか?
>>556 TStringsを二つ用意して、一つ目で全体読み込んで、
二つ目ので、一つ目のaddしたい行をaddすればいいんじゃないの。
//stra , strb : TStrings;
stla.add( strb[3] );
みたいに。
あと、TStringsは抽象クラスだから、実際にはTStringListを使うことになるんだけど。
>>557 なるほど思いつきませんでした
もしかしてReadlnってのがこういう用途に使えるんですかね
つかえます。
CSVファイルを読み込むときはよくTStringListを2個使うと便利 区切り文字がカンマじゃなかったらStringReplaceで置換すればいいし
CSVくらいあらかじめ自分で実装したクラス用意しておけばいいじゃない
562 :
553 :05/02/22 13:08:41
単語帳を作ろうと考えてます。 テキストファイルに、単語、品詞名、意味、例文の順に書いておいて、 例えば、エディタ1に単語を入力したらエディタ2に意味を出力する様に したいんですが、どうしたらよいでしょうか。 エディタ1に入力した単語をテキストファイルから検索し、あったら その行の2つめと3つめのコンマにはさまれた文をエディタ2に表示する。 こういう流れだと思いますが、プログラムはどうなるでしょうか。
そういうプログラムなると思います。 で、どの部分が分からないの?
こんな感じかな sLineList := TStringList.Create; sDataList:= TStringList.Create; try sLineList.LoadFromFile(テキストファイル名); for i := 0 to sLineList.count -1 do begin sDataList.clear; sData := sLineList.Strings[i]; sDataList.commatext := sData; if AnsiCompareStr(sDataList.Strings[0], 単語名) = 0 then begin hinsi := sDataList.strings[1]; imi := sDataList.Strings[2]; reibun := sDataList.Strings[3]; break; end end; finally sLineList.Free; sDataList.Free; end;
565 :
553 :05/02/22 14:10:27
>>564 ありがとうございます。
やってみます。
566 :
デフォルトの名無しさん :05/02/22 14:17:01
Paradox7の中身を全部消してまっさらにするのはどうすればいいですか。 DataSource1.Dataset.Deleteをループさせてやってみたら、カウンタ型が 初期化(?)されず、続き数字になってしまいます。
>>553-554 ただし空白やダブルクォートを含んでいると思わぬ結果になる事があるので注意。
Paradoxは知らないけどDelete tableもしくはDrop Tableといった SQL文発行した方が体に良さそうだと思う
>>567 ””でくくればその中にカンマがあろうと半角スペースがあろうと
全角スペースがあろうと問題ないよ
でも”があるとそこで切れるので”はStringReplaceで置換するしかない
571 :
デフォルトの名無しさん :05/02/22 17:46:02
画面に幅広いグリッドを3つ配置したいのですが、 グリッド毎にスクロールバーを表示したくありません。 グリッド3つを同時に横スクロールしたいのです。 スクロールバー内に3つ並べてみたのですが、画面外のセルにフォーカスを移動しても移動しません。 何かコーディングが必要なのでしょうか?
>>571 procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
StringGrid2.TopRow:=StringGrid1.TopRow;
StringGrid2.LeftCol:=StringGrid1.LeftCol;
end;
>>532 は逐次探索してるからなあ。ソートされたリストだと2分探索が使えるけど。
ソートしないときもっといい方法はないんだろうか?
逐次検索しかないと思うよ
誰もハッシュ比較で高速化しよう、と言い出さないことについて。
そんなのより、ソートと2分探索の方がいいからだろ
>>572 亀レスすみません。
おかげで先へ進めそうです。
ありがとうございました。
>>576 重複を取り除くだけなら辞書順に並ぶ必要は無いから、ハッシュ値でソート&二分探索すれば、
大量の文字列比較処理を単なる整数比較に置き換えられて高速化できる。
Del厨 and アルゴリズム = 0
581 :
デフォルトの名無しさん :05/02/22 22:30:38
たとえば10000文字ぐらいの英語のページを探して、二文字か三文字ごとに改行入れて単語とするのはどうだろう。 で、それを使った処理速度比較plz
は?
アルファベットと数字に文字列として検索に本質的な違いがあるとでも?
584 :
デフォルトの名無しさん :05/02/22 23:11:37
ワロタ
>>585 お疲れ様。 さらに早くするには、ハッシュを添字に行番号配列を持った配列を作る事かな。
データ数が2倍になる都度、配列サイズも2倍にして作り直すと
587 :
デフォルトの名無しさん :05/02/23 14:06:45
TfileStreamでファイルの最後から消していってサイズを小さくするにはどうしたらいいのでしょうか? 新しいファイルを作らないと駄目でしょうか?
Stream.Size:=NewSize;
>>586 テーブルのリサイズ・データの挿入のコストは無視ですか。
扱うデータの種類によるけど英単語の重複程度のチェックなら
出てくる単語の種類は高々数万(手持ちのspell.dicは52,000個)。
サイズ決め打ちのハッシュテーブルに突っ込めば十分。
にしても今時ツリーだのハッシュだのを手書きする
OOPLはDelphiくらいのもんだな。
それは言えてる。Delphiプログラマがパスカルプログラマだと思ってるのもいるし
Delphi で bit 単位でファイルを読み書きする方法はありますか?
>>591 D7だと、RenameFileは内部でMoveFile APIを呼び出してる。
MoveFileは別ドライブでも可らしい。だから情報が古いのではないかと。
>>592 標準ではないと思う。
Delphi6ユーザーでDelphi2005への乗換えを検討しています。 Delphi6ではコード整形プラグインのDelForExを愛用していたのですが、 Delphi2005でも使えるでしょうか?? もしくは、Delphi2005開発環境中から簡単に呼び出せるコード整形ツールは存在するでしょうか。
すみません。 DelForExpの配布元を改めてよく見てみたら対応したと出ていました。 スレ汚し失礼しました。
他のアプリのハンドル取得 var H : HWND; ------------------------------------------- begin H:=FindWindow('notepad',nil); ↑↑↑↑メモ帳の場合↑↑ H:=FindWindow('IEFrame',nil); ↑↑↑↑インターネットエクスプローラーの場合 なぜiexploreじゃなくてIEFrameなんですか? H:=FindWindow('XXXXXXXXX',nil);の中の 'XXXXXXXXX'はどのようにして決められるんですか?
FindWindowの第一引数はクラス名 決めるのは作ったプログラマ自身
>>589 >にしても今時ツリーだのハッシュだのを手書きする
>OOPLはDelphiくらいのもんだな。
べつにC++とかやってても、一般的でないデータ扱うときはツリーくらい書くけどなぁ…
ハッシュ関数だって、イレギュラーな偏りのあるデータとかなら自分で書いた方が高速化できるし。
なんでもかんでもライブラリに隠蔽されたおかげで、どのような場面でどのようなアルゴリズムを
使えばよいか解らない奴がワンサカいるし。
C#なんか勉強する前にヴィルト先生(できればクヌース先生)の本でも嫁、と言いたい。
ジジイ必死だなw
600 :
デフォルトの名無しさん :05/02/23 22:48:07
ひとつのpopupmenuを複数パネルから(panel1, panel2・・・) 使いたいのですが、 どのパネルからポップアップさせたかを知るにはどうすればいいですか?
if Sender = Panel1 then
603 :
600 :05/02/23 22:56:03
>>602 これはどこに書くのですか?
OnPopupに書いたら駄目でした。
そりゃそうだろう
騙しかよ! 騙しレスかよ!!!! 初心者騙して釣っておもしろいですか? もういいです。帰ります。
質問する場所を考慮しろよ
一応言っとくが、604はオレじゃないからな TPanelのOnContextMenu辺りにでも書いとけばいいんじゃね もちろん、そのOnContextMenuはPopupつけてるコントロールで共有
両方のPanel.PopupMenuにPopupMenu1突っ込むだけだろ
procedure TForm1.PopupMenu1Popup(Sender: TObject); begin Label1.Caption := PopupMenu1.PopupComponent.Name; end; だから if PopupMenu1.PopupComponent = Panel1 then とかでOK
610 :
600 :05/02/23 23:49:02
>>605 偽者(・A・)イクナイ!!
>>607 MouseDownでできたのですが、
OnContextの方が(・∀・)イイ!!ですね。
無理に適当な回答するのは2chではよくあること。 質問した場所をわきまえて・・・逆ギレは見苦しい。 ちゃんとした回答が欲しければそれなりのところへどうぞ
612 :
600 :05/02/23 23:54:25
みなさんありがとうございます。
いろんな方法があるのですね。
>>607 さんのがカコイイと思うのでこれでやります。
>>609 Senderはasで確認したほうがいい
if (Sender as TPopupMenu).Name = Panel1 thenとか
質問者はトリップ付けた方がいいと思う。 まさか「トリップって何?」って人はいないよね?
>>613 なに滅茶苦茶いってるの? TPoupuMenu の名前に Panel1 とか付けるアフォ発見
616 :
デフォルトの名無しさん :05/02/24 00:14:09
だいたいインスタンスの名前と Name プロパティーを混同してる時点でアウト
618 :
デフォルトの名無しさん :05/02/24 00:16:19
>>612 ヘルプより
PopupComponent プロパティは,右クリックに応答して最後にポップアップメニューを表示したコンポーネントを示します。
これを使わないのは変
619 :
デフォルトの名無しさん :05/02/24 00:19:44
>>617 Name プロパティーは string 型だろ。どうやって = Panel1 とかの
インスタンス変数と比較できるわけ?
インスタンス変数名と name プロパティーを混同する香具師は、 えらそうにレスなんかつけるなよ
おまいらすぐ荒れるな
623 :
デフォルトの名無しさん :05/02/24 01:09:37
[警告] Unit1.pas(142): 符号付型と符号無し型の演算により、オペランドが拡張されました これってどうしたらええんでしょう? ソースの部分は >Edit1.Text:=inttostr(timeGettime-tm);//かかった時間の計算 なんですけれども。 一応実行して普通に動いてるのだけれども不安で・・・
>>623 timeGettimeとtmの型が合っていない
宣言を見てみ
TimeGetTimeは、cardinalだから、 そっちにあわせなきゃだめだね
VC++で作ったスタティックライブラリをDelphiで利用することはできますか? 思いっきりFAQな気がしますがぐぐってもそれらしい情報が見付かりませんでした。 もし既出ならご容赦ください。
無理 ソースをbccでビルドしてobjをリンクすることは可能
BCC持ってないです。残念。 お答えありがとうございました。
集合型の変数に整数を代入するにはどうすればいいのですか。 THoge=1..50; THoges=set of THoge; var Hoge:THoges; begin Hoge:=$000001; とかやると怒られます。
include
>>632 さんくす。
ついでにお願いします。集合型の値を表示したいのですが、
THoge=1..12;
THoges=set of THoge;
var
Hoge:THoges;
begin
Hoge:=[];
Include(Hoge,2);
ShowMessage(IntToStr(Word(Hoge)));
これは表示されますが、THoge=1..50とかにすると、THogesのサイズが7バイトになり
正しくない型キャストと怒られます。こういう場合はどうすればよかですか?
どうしようもありません。 >これは表示されます とありますが、集合型として表示されているわけではないですね?
集合型の内部表現と整数等の内部表現は本質的に異なるため、たまたま集合型が Integer 4 バイトに収まるまではごまかしが効きます。4 バイト = 32 要素を 超えた場合はごまかせません。 集合型の内部表現は 32 byte までありうるので、32個の byte 型フィールドを 持つ Packed array を用意するのがひとつの手でしょう。 そもそも何をしたいのですか?
>>635 単に現在の値を目で見たかっただけですが、
他にもINIファイルへの保存などで整数型にキャストしWriteIntegerで書き込みたいのです。
BitMapをImage1にロードして、 そのBitMapの色情報(色数と色とかです)はどうやって、 所得するんですか?
>>637 Image1.Picture.Bitmap.PixelFormat
Image1.Picture.Bitmap.Canvas.Pixels[X,Y]
Image1.Picture.Bitmap.Scanline[Row]
>>636 直接は無理なので集合型変数をメモリの塊として処理する。
# そもそもサイズが合わない可能性があるからIntegerとの変換は無理
ms := TMemoryStream.Create;
ini := TInifile.Create(ParamStr(0)+'.ini');
ms.Write(Hoge, SizeOf(Hoge));
ini.WriteBinaryStream('Sec', 'Hoge', ms);
またはBinToHex, HexToBinで文字列に変換する。
var s: String;
SetLength(s, SizeOf(Hoge));
BinToHex(@Hoge, PChar(s), SizeOf(a));
DLLへ引数としてTFormやTMainMenuのインスタンスを そのまま渡しても大丈夫でしょうか? 例えば、呼び出し側のFormのインスタンスをもらい、 Captionを変更する以下の処理は問題ありでしょうか? // 呼び出し側 procedure TForm1.Hoge; begin (略) ChangeCaption(Self); end; // DLL側 procedure ChangeCapton(Form: TForm); begin Form.Caption:= 'Hoge'; end;
コールバックの方がよくね?
何を心配しているのか知らないけど 同一プロセス内で動いてる以上無問題
>>641 レスありがとうございます。
しかし、出来ればDLL内に直接処理を書きたかったので…。
>>642 レスありがとうございます。
そうなんですか、良かった…。
TFormにはString型のPropertyがテンコ盛りということで、注意書きの
「構造体やクラスに埋め込まれている場合も含め String 型を DLL と…」
の「埋め込まれている場合」に抵触していないか心配だったのです。
644 :
デフォルトの名無しさん :05/02/24 20:27:03
問題あるだろ
String型は使えない
char型使え
>>642 初心者に嘘教えるなよw
スクリプトとプログラムの違いがわかりません…
C で作った DLL について教えてください。 TBitmap の ScanLine に対応するものとして char 型の二次元配列を考えています。 引数や戻り値で P: PByteArray と char ** c が対応するという理解で良いですか?
ツールバー等のアイコンに使うbmpファイルをまとめておいてあるサイトはないでしょうか。
>>640 一般に共通のパッケージを使う以外で、クラスのインスタンスをDLLとやりとりする
ことはできません。同じバージョン、同じパソコン内のDelphiで、別々にコンパイルさ
れたDLL内のインスタンスのVMTとEXE内のインスタンスのVMTは同一ではありません。
WideStringって > 16 ビット Unicode 文字から成る なのでUCS-2ですよね? UTF-8をWideStringに変換したら表現できない文字もあるって認識でOKですか?
>>647 半分合ってて半分合ってない。
ポインタのポインタを単純に二次元配列と同等としか解説していないサイトが多いけど、
そう単純じゃない。
おまいさんの使い方の場合、y行分の各ポインタを渡してやりたいんだろうから、
今日日の32bitポインタの場合、4バイト*yバイトのメモリ領域をallocmemとかで用意して、
そこに各ポインタを入れて、先頭のポインタ(アドレス)をdllで渡してやることになる。
つまるところ、C側は、char*でもint*でもポインタなら何でも良い。
どうせキャストするだろうし。
一般的に、DLLでデータをやりとりする際、ポインタのポインタを引数とする関数を
externalするようなわかりにくいことはしないよ。
とか書いたが、別にポインタのポインタを引数にしても良いような気がしてきた。 まあ、ポインタなら間違いじゃないよ。
var a,b,c:integer; と、宣言した上で、a,b にいろいろ値を入れた後、 c:=trunc(a/b); を実行すると、たまに不正な小数点演算 というエラーが出ます。 宣言を var a,b,c:integer; d,e:double; として、 d:=a; e:=b; c:=trunc(d/e); とすると、特にエラーが出ません。 Delphi7 です。何ですかね、これ。
>>653 何かの拍子に、bに0が入っているっぽいような。
truncの直前に、
assert(b <> 0 , '0除算');
を付け加えても、assertにひっかからずにエラーでる?
Truncは関係あるの?
>>655 一応、resultがint64の範囲外の時は例外を出すと
ヘルプに書いてあるが、今回は関係なさそうだね
>>654 0除算ではありません。それはifで除外しています。
一度Double型に入れてから計算すると、エラーが出ないものですから。
659 :
名無し募集中。。。 :05/02/25 10:56:15
>>658 integerは整数型だから除算はdiv、/は浮動小数点除算に使う
そこらへんが怪しいと
すいません。除算ではありませんでした。私の思い込みだったようです。 結局例外の原因となっていたのはこういう処理でした。 var a:integer; b:double; f:double; begin a:=50000; b:=a; f:=sqr(a); //OK f:=sqr(b); //OK f:=sqrt(sqr(a)); //NG f:=sqrt(sqr(b)); //OK f:=sqrt(a*a); //NG f:=sqrt(b*b); //OK end; 計算部分でNGとあるものが、例外の発生するものです。 50000を2乗するとintegerの桁を超えるのが原因のようです。 ただ不思議なのは、Double型に代入する f:=sqr(a); には問題が無く、Double型を引数とすると思っていたsqrt関数で f:=sqrt(sqr(a)); で例外が発生するのは、単にsqrtにintegerで受け取るoverload関数があったと言う事でしょうか・・。 お手数かけました。すいませんどうも。
すみません・・。 f:=sqr(a); の結果は、桁が溢れた -1794967296 でした。 負の数でsqrtしたら例外が出て当然ですね。 本当にご迷惑かけまして、すみません・・。
あの・・。すみません、本当にくだらない内容になってますね。 var a:integer; f:double; begin a:=50000; f:=sqr(a); end; これにより、f=-1794967296になるのは、sqrに function Sqr(X: Integer): Integer; というoverload関数があるから桁あふれしたのだと納得したつもりだったのですが、 f:=a*a; としても、f=-1794967296 になってしまうのはなぜなんでしょう・・。 a*aの演算時は、結果をaと同じintegerに格納し、それからDouble型に直してfに入れるという事でしょうか・・。 一部でも大きな桁になる可能性のある計算式には整数型の変数を使ってはいけないという教訓ですかね。 失礼しました・・。
|
|
∩
∪
__
/ /|
| ̄ ̄|/
 ̄ ̄
>>661 スレのみんなで君の晴れ舞台を用意したよ。
delphi6起動中にCtrl+gでアウトラインを出してくれるソフトウェアの在りかを教えてください。
質問です。 TListViewにてViewStyleをvsReportにてした場合でも アイコンを表示する方法はありますでしょう?
>>665 SmallImagesに小さいアイコンを入れたTImageListを設定する
667 :
デフォルトの名無しさん :05/02/25 16:04:55
Delphi8 EnterpriseでOracle7.3からデータを取得してエクセルに渡すソフトを作っているのですが、 データ形式が特殊な為時間がかかり困っています。 頭2桁がアルファベット、そこから下2桁が12進数(10→A,11→B,12→C)の品種データがあり、 その品種名とデータをエクセルに順番にコピーするのですが、品種が順番に並んでいないので 今はエクセルのセルに総当たり戦で並べ替えています。 データベースにめちゃくちゃな順番で品種が入っているのでどうしても総当たり戦をせざるを得ず、 そうすると、膨大な時間がかかってしまっています。 ローカルにデータベースを作ってそこにデータをコピーして並べ替えられればベストだと思うのですが、 このような特殊なデータフォーマットの並べ替えに対応しているデータベースはありますでしょうか? また、良い方法がありましたら教えてください。
Excelにデータ転送後にExcelでソートすれば? Oracleから取り出すときにソートすれば?
(Sender).Name[6] は 6番目の文字が抜き出されるのですが、 6番目7番目の文字が欲しい場合はどのようにすればいいでしょうか?
自己解決しました。 honya(Sender).Name[6] + honya(Sender).Name[7] ででました。
Copy(honya(Sender).Name,6,2);
>>670 三文字以上とかになると激しくアレだから671がお勧め
>>650 確かにUTF-8ではUCS-4に含まれる文字もエンコードできるから、UTF-8からUTF-16だと
欠落する文字が皆無とは言えない。
でも、現実にはWindows上でUCS-4にしか含まれない文字なんてほとんど使われないし、
サロゲートペアで多少は回避できるので、気にしなくてOKだと思いまつ。
675 :
デフォルトの名無しさん :05/02/25 19:02:23
Memo1.Text、Memo2.Text、、、をMemo[i].Textのように扱いたいのですがうまくいきません 代替手段等あれば教えてください
TTextの配列でも作れ、若しくはTComponentあたりに何かあるべ
var DMemo: array[0..9]of TMemo; for i := 0 to 9 do DMemo[i] := TMemo.Create; 後は好きなように・・・・
681 :
デフォルトの名無しさん :05/02/25 23:36:09
QuickReportを使用したことのある方に質問なのですが、 TQueryをレポートを呼び出すフォーム側とQuickRep側のどちらかに貼らなかった場合に エラーが起きる等の話を聞いたことがありませんか? あるシステムを開発していて、大量の帳票を作成したのですが、 いくつかの帳票でうまく出力されないエラーが起きています。 聞いたことがある方、ご存知の方がいましたら教えてください。 Delphi6使用です。 よろしくお願いします。
DelphiからリモートにあるMySQLデーターベースサーバーにアクセスしたいのですが、どうすればよいのでしょうか? ぐぐってみてもBDEだのDAOだのODBCだので、どれを使っていいのか分かりませんし...。 どこかに詳しく解説されているサイトとかありませんか?
このごろのプロはくだすれを利用するようだ・・・・
684 :
デフォルトの名無しさん :05/02/26 03:24:20
>>667 TListじゃだめか?C言語のqsortみたいに自分で比較関数を定義できるのだけど。
メモリやHDにデータを読み込んで、それをTListで並べ替え。
>>674 ありがとうございました。
レスに気がつかずに必死で調べていました。
無視してすみませんでした。おやすみなさい。
687 :
デフォルトの名無しさん :05/02/26 11:22:39
>>687 トップページにソース公開されてるよ。自作コンポみたい。
Delphiで現在の通信量(上り下り)知るにはどうしたらいいのでしょうか 教えてくださいませ。 orz
皆さんはプログラムのコーディングにIDEとテキストエディタのどちらの方を よく使いますか? アプリとコンポではかなり違うと思いますが。
今公式ページ落ちてる? 繋がらないんですが('A`)
>>690 IDEです。EmEditorでDelphi構文色分けなどしてますが
使うのは複数行コメントアウトの時や
他のコード見ながら入力するときのソース閲覧として使います。
>>691 うちからも。
693 :
デフォルトの名無しさん :05/02/27 14:24:09
FASTNETのTNMHTTPで、以下のようなコードを実行すると、 1回目は成功するのですが、2回目以降は@の部分でプログラムが固まります。 何がいけないのでしょうか? nh:=TNMHTTP.Create(Application); ・・・・@ try nh.InputFileMode:=False; nh.Get(Url); finally nh.Free; end;
>>689 知るだけならパフォーマンスカウンタで良いんじゃない?
delphiのIDEより使い勝手のいいテキストエディタって色々試したけど見つからない。 IDEはオートインデントとかマクロが弱いから、ちと不満。
696 :
デフォルトの名無しさん :05/02/27 18:16:45
mediaplayerで dtAutoSelect 以外では再生できない。どうしてですか?
ある数に一番近い数を配列の中の数値から取り出したので調べてましたところ、 MinIntValue MinValue 関数を発見したのですが、使い方がわかりません。 これはどのように使えばいいのでしょうか? また一番近い数を取り出す良い方法がしってましたら教えてください。 現状はこんな感じなのです・・・。 procedure TForm1.Button1Click(Sender: TObject); var a : array [0..3]of Integer; b : array [0..3]of Integer; i,j,u,min : Integer; begin u := 30; a[0] := 10; a[1] := 33; for i := Low(a) to high(a) do begin b[i] := a[i] - u ; if b[i] < 0 then begin b[i] := b[i]*-1; end; end; min := b[j]; for j := Low(b) to High(b) do begin if min > b[j] then begin min := b[j]; end; end; Memo1.Lines.Add(IntToStr(min)); end;
ある数に一番近い数を配列の中の数値から取り出したい。ので調べてましたところ、 でした。
>>697 たとえば
99 100 101
とあって、100に一番近い数字はどれにしたいのか。
仕様を明確にすべし。
>>699 レスありがとうございます。
u:Integer 値が100の時、 配列がaの要素 99 100 101 の中で一番近いのはどれか? です。
何に使うかといいますと、ビットマップの1ピクセルの色の置換えになります。
ご教授おねがいします。
>>27 です。
MinIntValue(b); 単にこれで出てきました。
しかしながら何番目の要素なのかは分からないんですね。
んー、いい方法ないかなあ。
>>701 ありがとうございます。
簡易的なものを作ろうと思って、その本を
今日、近所の本屋に行ったのですが、田舎なのか売ってなかったです。^^;
注文したほうがよさそうですね。
>>694 パフォーマンスカウンタとはどんなふうに使うんでしょうか。ぐぐってもわかりませんでした。
すいません・・
>>701 漏れ、減色ソフトつくってるんだけど、あの記事はなんだかなあ、とか思ったり。
R>=G>=B
って本当なんかな。
>>682 DelphiやMySQLのバージョン。エディションが不明だが
速いのはdbExpress。手軽さはMyODBC
単にドライバの問題なので、接続後は普通のDBプログラミングと同じ。
>>704 G>R>B です。
2箇所書いてあったから誤植じゃないっぽいなあとぽかーんしますた。
内容も今までに何度か出てきていたメディアンカットの記事に毛がはえた程度だったし・・・。
>>707 だよなあやっぱり。
その直前のRGBからの変換式では、ちゃんとGの係数が一番大きくなっているのに、
あの記事では訳わからん。
>>708 著者が理解してなくて資料片手に原稿書いたと思われ
>>709 名前でぐぐると、一応、画像処理のシェアウェア作者らしいんだけどな・・・
よくわかんないけど、誰にでもミスや勘違いはあるんだから 生暖かい目で生易しく見守ってあげたり指摘してあげたら、 素敵な人になれるのではないかしら。
>>711 まあ一般的にはそうなんだけど、Cマガはそういうの大杉。
「オリジナルOSを作ろう!」という特集なのに肝心のOSがなかったりとか。
ところで、
>>697 は a[2], a[3] の初期化をどこでやっているんだろう?
とりあえずCマガの読者アンケートに書いておいた。
714 :
デフォルトの名無しさん :05/02/28 22:20:27
if pos('|','ポ') <> 0 then showmessage('なんで?'); なんで'|'が'ポ'に含まれてるのですか?
'|'=7C 'ポ'=83 7C ShiftJISだからと思うよ
AnsiPos でないからです | は 7C ポ は 837C
ありがとう
ポ の真中の棒が含まれてるのかと思ってしまった
ヤラレタorz
721 :
デフォルトの名無しさん :05/03/01 01:19:26
AnsiPosだとバイトをちゃんと見分けるのですね。 必ずAnsiPosを使った方がいいのですか? Posより遅くなりますか?
2バイト文字を含むときはAnsiPosが必須。そうでなければPosでいい。
>>710 画像関係は数式だけ何処かから持ってくれば
なぜそうなるか理解してなくても
それなりに動作するものが作れるから
まあいいかげんすれ違いの話題だがあの人は Cマガで画像処理関連の連載を長いことやってた人だよ。
すれ違い
配列にまとめて値を入れるにはどうすればいいですか? a : array[0..5]; a := (1,2,3,4,5,6);
>>726 同じ型同士なら代入互換性があるから
定義時に初期値をいれておいて代入したら?
同じ型でなければいけないよ。
Delphiでドットインパクトプリンタに統一伝票用の 印刷プログラムを作るには、QuickReportを使用する のが無難ですか? 大量に印刷するんで速度も重視したいんですが・・・
アクションについて教えてください。 1つのアクションを複数のメニューから実行できるようにしておいて、 実行時に選択されたメニューによって動作を変えたいときは どうすれば良いでしょうか。 Senderにはアクション自身が入っていてちょっとがっかり。。
ちょっと違うかもしれんけど、 TMenuItemのActionはカラにしといて、 OnClickにTActionのOnExecuteを直接指定してみては? それならSenderにはTMenuItemが入っているはず
733 :
デフォルトの名無しさん :05/03/01 19:25:02
VC++で作成したDLLをDelphiで利用するプログラムを書いています。 このDLLはいわゆる入出力プラグインと呼ばれる物で、DLL経由でデータの入力/出力を行います。 DelphiからDLLへデータを渡す場合(Export)はDelphiでGetMemしたポインタを渡して処理が実現できているんですが、 そもそもこれがうまくいくのがよくわかりません。 DLLは呼び出し側とメモリ空間は共通なんでしょうか? でも逆にDLL側で確保したメモリを呼び出し側(Delphi)で参照するとアクセス違反が起きます(これは納得)。 (普通、メモリ共有はCreateFileMapping()を利用すると思うのですが、 これは面倒なので他の手段を試しているんです)
>>733 32ビットアプリなら、DLLとアプリは同じメモリ空間。
DLL側でどうやって確保してるの?
>>734 > 32ビットアプリなら、DLLとアプリは同じメモリ空間。
あ、そうなんですか?
それなら話は早いですね。
DLL側ではGlobalAlloc()で確保してます。
Delphi側でGlobalFree()で破棄してるんですがこれがまずいんでしょうか?
GMEM_FIXEDで確保して、帰り値をポインタとして使ってるんだよね? それで問題無いと思うよ。 同じ事をDLLでなくDelphi側で試験コード作ってやってみたら? それで問題無いなら、たぶんDLLの呼び出し時のミスだと思うよ。 cdeclとかの呼び出し規則のミスか 構造体のアライメントのミスか
>>731 ありがとう。それだとActionじゃなくて普通の関数でいいですよねえ。
ん〜Actionは単純な場合しか使えないのかな。
>>736 DLL側でGlobalAlloc(GMEM_FIXED, ...);として確保してましたが、
確保してない領域にアクセスしていたようです(あいたた)。
これで何とか入力/出力がDLLで実装出来ました。
ありがとうございました。
>730 ActionComponent
リモートデバッグ用のサーバってどこに入っているんですか? ヘルプには >デバッグサーバーをデバッグ対象環境にインストールするには, >CD-ROM の RDEBUG ディレクトリにある setup.exe を実行してください と書いてありますけどどこにもない。Delphi6 Professional使用
>>740 リモートデバッグはEnt版の機能じゃないか?
Windows ソケットエラー:無効な引数が提供されました。 (10022)[API'WSACancelASyncRequest'] って出たんですが、これ、何が原因ですか?解決法を教えてくださいぃ!
>729,732 DBがSQLServerなんで、QuickReportになりそうです。 あんまり融通利かないんですか・・・ ありがとうございました。
マルチポストする人って、頭わるいのかな。質問のしかたもひどいし。
くだすれで言っても
746 :
デフォルトの名無しさん :05/03/02 14:09:39
IniFile.ReadStringで改行を含む文字列を取得するには どのようにすればよいのでしょうか? 例えばIniファイルにhoge=Hello#13#10Delphiなどと書いて ReadString(Section, 'hoge', '')とやると改行されず Hello#13#10Delphiがそのまま取得してしまいます。 「改行を含むデータなんてIniファイルで取得する必要ないだろ!」 という意見はごもっともですが、ご存知の方がいましたらお教え下さい。
自己解決しますた ReadStringは改行を読み込めないみたいなので sData := IniFile.ReadString(Section, Ident, ''); sData := StringReplace(sData, '\n', #13#10, [rfReplaceAll]); とやって置換することで対応しました
> Hello#13#10Delphiがそのまま取得してしまいます。 '#13#10' はたんなる文字列だから・・・そのまま取得されないとむしろ大変だろ
sData := StringReplace(sData, '#13#10', #13#10, [rfReplaceAll]); なら、もとのままでもOKだよ(笑
delphi2005で指定したフォルダの中にあるファイルをすべて出力するにはどうしたらいいでしょうか? VBだったらfor each使えばすぐに出来るのですが、delphiでのやりかたが分からないので教えてください。
http://vamp.s9.xrea.com/yukiwiki/wiki.cgi? %B1%EE%A4%C7%A4%E2%A4%EF%A4%AB%A4%EBDelphi6
%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A1%C1
OpenJane%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB
猿でもわかるDelphi6インストール〜OpenJaneコンパイル
の通り、環境を整えたのはいいものの、
「[致命的エラー] Main.pas(13): ユニット IdGlobal は異なるバージョン
System.RTLVersion によりコンパイルされています」
とででコンパイル出来ません。
どなたかご教授ください。
>>750 "Delphi FindFirstFile"でぐぐりなさい。
>>750 for each使うやり方を晒せば移植してあげるよ
>>752 Delphi FindFirst だと思うけど。FindFirstFile はAPI
>>750 procedure TForm1.ScanSubDir(Path: string);
var
FName : String;
res,L : Integer;
SearchRec: TSearchRec;
begin
if Path[Length(Path)] <> '\' then Path := Path+'\';
L := Length(Path);
Path := Path+'*.*';
res := FindFirst(Path,faDirectory+faReadOnly,SearchRec);
if res = 0 then
begin
try
repeat
if SearchRec.Name[1] <> '.' then
begin
FName := Copy(Path,1,L) + SearchRec.Name;
Memo1.Lines.Add(FName);
if (SearchRec.Attr And faDirectory > 0) then ScanSubDir(FName,flg);
end;
res := FindNext(SearchRec);
until res <> 0;
finally
FindClose(SearchRec);
end;
end;
end;
-------------------------------------------------------------------------
ScanSubDir(ExtractFilePath(Application.ExeName));
>>750 procedure SearchDirectory(const Path: String);
var
Rec: TSearchRec;
begin
if FindFirst(Path + '*.*', faAnyFile, Rec) = 0 then
try
repeat
if (Rec.Name = '.') or (Rec.Name = '..') then
Continue;
if (Rec.Attr and faDirectory > 0) then
Continue;
Writeln(String(Path + Rec.Name));
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
end;
758 :
デフォルトの名無しさん :05/03/02 23:22:59
mediaplayerで dtAutoSelect 以外では再生できない。どうしてですか?
(´-`)。o ○ (「ソケットエラーの人」、ここではレスが付かなかったので 他へってんなら、その旨書くぐらいのことはしてもいいんじゃないのかねぇ… どうして簡単にコピペで他へ質問するかなぁ…)
761 :
758 :05/03/02 23:43:19
お。
>>759 さん
質問変えます。
音楽CDでmediaplayerでPauseがなんでStopになるのでしょう。
それDelphiと無関係のような
763 :
758 :05/03/02 23:51:46
TMediaPlayer の事では?
サンプルのスピンエディタのソースにある RepeatPause,InitRepeatPause って WinAPIなのでしょうか? ぐぐってもわかりません。 FRepeatTimer.Interval := RepeatPause; FRepeatTimer.Interval := InitRepeatPause;
すんません。unit DBCtrls で定義されてました。 InitRepeatPause = 400; { pause before repeat timer (ms) } RepeatPause = 100; { pause before hint window displays (ms)}
答えてもらえないから火病るなんて…
768 :
デフォルトの名無しさん :05/03/03 12:43:57
ほかのソフトが生成するテキストファイルを読み込んだり、 コピーしたりしたいんですが、そのファイルが書き込み途中か、 クローズされているかを、判断したいんですが、 いい方法があったら教えてください。
googleの検索バー作ってるんですが URLエンコードはどうすればよいのでしょうか? おしえてください
>>768 ファイルの日付を見て、更新されてたら処理するようにして、
書込中は相手が排他的オープンしてるだろうから開いてみて開けなければとしたらどう?
>>750 procedure TForm1.ScanDir(Path : string);
var
Rec : TSearchRec;
Ret : Integer;
begin
Path := IncludeTrailingPathDelimiter(Path);
Ret := FindFirst(Path + '*', faAnyFile, Rec);
while Ret = 0 do begin
if ((Rec.Attr and faDirectory) = faDirectory) and
(Rec.Name <> '.') and
(Rec.Name <> '..') then begin
ScanDir(Path + Rec.Name)
end else begin
Memo1.Lines.Add(String(Path + Rec.Name));
end;
Ret := FindNext(Rec);
end;
end;
>>771 FindFirstでJPEGファイルとBMPファイルだけを抽出したいのですが
やっぱPath+'*'で全部拾っていかないとダメなんでしょうか?
RFC嫁
RFCって?
ほかにいきます・・・
781 :
デフォルトの名無しさん :05/03/04 06:28:55
Delphiのwithに相当するものってJavaにありますか?
なぜここでJava
Integer の変数を Extended 変数に変換するのはどしたらいい?
Double経由になるかもしれないけど、明示的にキャストしてやったら。
ただ代入するだけ。 > 明示的にキャストしてやったら キャストって・・・意味わかっていってる?
別に普通に代入して暗黙的にキャストさせてもいいが、 万が一でもコンパイラの勘違いさせないために、Extended( ) で囲うのも 悪いことじゃない。 上のやりとり見ると、785の方がキャストの意味がわかっているのか疑問。
>Extended( ) で囲うのも悪いことじゃない。 わはははは、メモリイメージがまったく異なる数値形式をどうやってキャスト するのかコードしめしてみ
>>786 代入による暗黙の型変換とキャストを混同してるんだろ
sqrt(Rp * Rp + Gp * Gp + Bp * Bp) あの783です。これエラーがでるです。Integer Extended のエラがでます。 マイナスを無くすための処理でしょうか? 誰か助けてください。
Rp * Rp + Gp * Gp + Bp * Bp だけで IntToStr() で表示してみて。 マイナスになるようだったらinteger の範囲でオーバーフローしてる。 だから procedure TForm1.Button1Click(Sender: TObject); var i:Integer; x:Extended; begin i := 123456; x := i*i; Label1.Caption := FloatToStr(sqrt(x)); end; はエラーになる。でも、これだとうまくいく procedure TForm1.Button1Click(Sender: TObject); var i:Integer; x:Extended; begin i := 123456; x := i; Label1.Caption := FloatToStr(sqrt(x*x)); end; 参考になったかな?
791 :
デフォルトの名無しさん :05/03/04 16:03:41
memcheckって日本人が作ったのと海外のがありますが、どちらが優秀ですか? 海外のを試しましたがDelphi2005の設定方法が分からなくてきちんとメモリーリークを 検出できなかったもので。
>>790 ありがとう、非常に参考になったが上手くいきません。ちと粘ってみます。 感謝します。
>>792 ようするに
var
xRp,xGp,xBp:Extended;
と変数を用意しておき、二乗する前に代入するといい
sqrt(1.0 * Rp * Rp(ry
795 :
デフォルトの名無しさん :05/03/04 17:49:09
とりあえずRubyを覚えたいんですが その前に最低限覚えなきゃいけないことって何でしょうか?
( ・ω・)
(ε・ω・)з エラが出ます。
それはともかくとして、R,G,B が integer でオーバーフローを起こすほど
大きな値になるというのは、ちと不思議だ。
それ以前の計算は合ってるのかな?
>>795 スレタイが正しく見えるようになること。
797 :
デフォルトの名無しさん :05/03/04 18:13:25
795だけど Delphiってなんですか?
798 :
デフォルトの名無しさん :05/03/04 18:27:19
DelphiからExcelのブックを開いているのですが、Auto_Openマクロが自動的に実行されません。 これは何かやらないといけないのでしょうか? ファイルを開いた後に E_Application.WorkBooks.RunAutoMacros xlAutoOpen ; を追加してみたのですが、コンパイルが通りません。 どなたかよろしくお願いします。
D5Pro+PARADOX(BDE5.2)でいぜんTableを使用していたところをTQueryをRequestLiveで 更新しようと書き換えたのですが、処理が1行おきになってしまいます。 いかのような処理をしています while not Query1.eof do begin Query1.edit; 編集処理 Query1.Post; Query1.next; end; このときPostとNextのところでそれぞれカーソルが動いてしまうのですが、これで良いのでしょうか。
どうも、画面のハードコピーを印字しようとしていますが うまくいきません。うまくいかない内容は印字結果がとても 小さいんです。ソースが長いので次レスで書き込みます。 環境はWin2000, Delphi 6 Personalです。 また、プリントダイアログで用紙を横デフォルトにはできない でしょうか? よろしくお願いします。
//変数定義は改行規制のため一行にまとめています。 procedure TForm1.Button1Click(Sender: TObject); var Bitmap: TBitmap; FormRect: TRect; PrintDialog: TPrintDialog; begin PrintDialog := TPrintDialog.Create(Form1); try if PrintDialog.Execute then begin Form1.Repaint; Bitmap := TBitmap.Create; try with printer do begin Bitmap := Form1.GetFormImage; FormRect := Rect(0, 0, Bitmap.Width, Bitmap.Height); begindoc; Canvas.StretchDraw(FormRect,Bitmap); enddoc; end; finally Bitmap.Free; end; end; finally PrintDialog.Free; end; end;
>>801 ディスプレイとプリンタでは1ピクセルの大きさが違う・・・でわかる?
>>803 なんとなくですが、そうなんだろうなと思っていました。
ふと思いついて試したコードが以下です。
FormRectへの代入を以下にして見ました。
if Bitmap.Width > Bitmap.Height then
begin
FormRect := Rect(0,
0,
Printer.PageWidth,
Trunc(Bitmap.Height *
(Printer.PageWidth / Bitmap.Width)));
end
else
begin
FormRect := Rect(0,
0,
Trunc(Bitmap.Width *
(Printer.PageHeight / Bitmap.Height)),
Printer.PageHeight);
end;
これだとなんとか用紙幅一杯に印刷できるようになりましたが
本来の目的と異なるなぁ。っと。
>>793 追撃ありがとうございます。できました。
しかしながらへっぽこな画像なのです。
>>796 の言ってることあたりなのかもなあ。わからん。
>>800 AfterPostとかBeforePostにカーソル動かすコード何か仕込んでない?
TDataSet.Postのヘルプ(D4)に
>などのようにあるレコードから別のレコードへ移動するデータセットメソッドは,自動的に Post を呼び出します。
とあるから、Postは省いてNextだけでいいと思うけど。
編集処理で何をやってるかは分からないけど、TTableをTQueryにせっかく置き換えたなら
グルグルしないでSQLのUpdate文一発とかで更新にチャレンジしてみては?
807 :
デフォルトの名無しさん :05/03/05 00:34:33
>>798 「開く」というのはどういう操作?
ドキュメントのパスをシェルから開いたのか、それとも何かオートメーションで操作したか。
とりあえず、Excelのセキュリティ設定も見とけ。
809 :
デフォルトの名無しさん :05/03/05 01:14:54
>>808 1.「<!--hombun-->」の場所をansiposで探す。
2.そこから最後までを別にコピー。
3.コピーしたヤツから「</td>」を探す。
4.コピーしたヤツの、「</td>」から後を削除。
ではダメ?
そのアドレスのソース見てないから、 勘違いなレスだったら無視しておくれ。
それよりhonbunじゃないの?
>>808 StrPosで <!--hombun--> を探し、 そこからさらに </td> を探す。
</td> の場所に #0 を入れちゃえ。
>>810-814 レスありがとうございます。
ちょっと調べてみたのですが、〜Pos関数というのはいろいろ使えそうです。
未だ具体的な方法がわかっていませんが、いただいたレスを参考に勉強します。
ありがとうございました。
Edit1に入力してEnterキーを押した時のイベントはOnEnterではなさそうなのですが、 どうしたらいいですか?
817 :
デフォルトの名無しさん :05/03/05 11:01:32
DLGC_WANTALLKEYSでOnKeyDown
配列がうまく使えません!どうすればいいんでしょうか。 begin HTML:= IdHTTP1.Get(Edit1.Text); s := StringReplace(HTML,'.dat<>',',',[rfReplaceAll]); for i := 0 to 50 do begin ListBox1.Items.Add(s[i]); end; end; えっと、2chのログ形式は すれ番号<>タイトル(書き込み) です。 リストボックスにずらーっと羅列したいんですが。おせえてエロい人!
begin
HTML:= IdHTTP1.Get('
http://pc5.2ch.net/tech/subject.txt ');
s := StringReplace(HTML,'.dat<>',',',[rfReplaceAll]);
for i := 0 to 50 do
begin
ListBox1.Items.Add(s[i]);
end;
end;
すいません修正します;;
改行区切りだから s := TStringList.Create; s.Text := StringR以下略 でいいのでは
ええっと・・・よくわからんっす;; まったくの初心者なんですみません; 俺の書いたソースに付け加える形でおねがいします;;
ありがとうございました。 begin HTML:= IdHTTP1.Get(Edit1.Text); s:=TStringList.Create; s.Text := StringReplace(HTML,'.dat<>',',',[rfReplaceAll]); for i := 0 to 50 do begin ListBox1.Items.Add(s[i]); end; end; これで解決しました。ほんとうにありがとうございました!
823 :
デフォルトの名無しさん :05/03/05 17:26:55
C言語のエスケープシーケンス("\n","\r")のように、 文字列を表すクオーテーションに挟まれ書いてあっても、 内部的には制御記号になるような文字列の表記方法はDelphiにはないですか? "#"記号を使った場合は、文字列ではなく変数のように扱いになってしまい、 クオーテーションの外に出さないといけないので。 'ABCD'+#13#10+'EFGH'ではなく'ABCD#13#10EFGH'のような書き方をしたいのですが。
あれ、 'ABCD'#13#10'EFGH' でよくなかったっけ
>>823-824 procedure TForm1.Button7Click(Sender: TObject);
var
S: string;
begin
S := 'ABCD'#13#10'EFGH';
MessageBox(Handle, PChar(S), 'テスト', MB_OK);
end;
結果。
ABCD
EFGH
と表示されるから、それで動くみたいだね。
上級は人がいないようなのでこっちでも質問しますm(__)m UTF-16LE 文字列を ANSI 文字列に変換したいのですが対応する標準関数 が解りません・・・ていうかあるのでしょうか?
WideCharToString
煽りに必死な奴なら多い
それが2ちゃんさ
Delphi 6 Personal を使用しています。 システムの最大パス長を知りたいのですが、 他の方のソースにある MAX_PATH が使えません。 何か uses に付け加える必要があるのでしょうか?
uses Windows;
>>832 うまくいきました。
迅速な回答、どうもありがとうございます!
835 :
永遠の初心者 :05/03/06 11:34:39
いまだにDelphi5なんですがStringReplaceとVer6以降に追加されたAnsiReplaceStr はどう違うのでしょうか? StringReplaceは置換速度がやたらと遅いのですが AnsiReplaceStrは少しは早くなったのでしょうか?
StringReplaceに限らず Ansi が付く関数・手続きは、マルチバイト対応。 例えば、StringReplace で 'a' を 'b' に置き換えようとした時 'a'($61) を含むマルチバイト文字も置き換えられるので、 例えば 餌 ($89 $61)や 病 ($95 $61)などの $61(a) 部分を $62(b)に置き換えてしまう。 すなわち 餌→叡 ($89 $62) になったり 病→秒 ($95 $62) になる。 AnsiStringReplace は、マルチバイト文字を検出するので、 このような現象を避ける事ができる。
どっちも初心者専用関数だけどね
>>834 RFC読め。
できるできないではなくやって良いかどうかだ。
赤信号だったんだけどぉ〜試しに渡ってみたら無事渡れちゃいました☆
今後もやろうと思います☆
おいジョン、見てみろよ。
RFCも読めないイエローモンキーがまた何かやってるぜ。
赤信号だったんだけどぉ〜RFC読みながら渡ったら事故りますた。
おい見ろよ、RFC嫁嫁イエローモンキーがまた出てきたぜ
RFCって何ですか?
function URLEncode(src: String): String; var i: Integer; begin Result:=''; for i:=1 to Length(src) do begin Result:=Result+'%'+IntToHex(Ord(src[i]),2); end; end;
>>843 それはいくらなんでも乱暴すぎるようなw
せめて英数字くらいはスルーしてやってくれ。
>>838 そりゃやっていいとは思ってねぇよ。
俺のブラウザではシフトJISとEUC-JPとユニコードを自動判別して
URLエンコードしてから検索サイトに渡してるよ。
ていうか、834の最後に「お勧めはできない」の一文を付けるのを忘れてた。
しかしなんかギスギスしてんな。
>>846 超初心者用なのに自慢したいやつが常駐してる・・・・
>>844 function URLEncode(s: String): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Length(s) do case s[i] of
' ': Result := Result + '+';
'A'..'Z','a'..'z': Result := Result + s[i];
else
Result := Result + '%' + IntToHex(Ord(s[i]),2);
end;
end;
やったら駄目な事を回答としてレスされても、質問者は困るよね。
ああ、困るな。
851 :
デフォルトの名無しさん :05/03/06 21:07:51
TActionListはどういう時に使いますか? 便利ですか?
コンポ開発初心者 procedure TForm1.FormCreate(Sender: TObject); begin UMCustom := TCustomControl.Create(Self); UMCustom.Parent := Self; UMCustom.Left := 80; UMCustom.Top := 10; UMCustom.Width := 50; UMCustom.Height := 50; UMCustom.Visible := True; end; TCustomControlってこれだけでは何も表示されないんですね。
>>851 オレはメニューのカスタマイズ用に使ってる
>>852 そりゃそうだ
Canvasで描写していく
854 :
デフォルトの名無しさん :05/03/06 22:22:08
>>851 かなり便利だよ。機能のEnable・Disable、ツールチップ、
ボタンイメージ、ショートカットなんかを一元管理できる。
Delphiチュートリアルに使い方が書いてあったと思うが。
>>771 もしかして'*'だと拡張子のないファイルしかヒットしないのでは?
>>835-836 Delphi 6以降は持っていないのでわかりませんが
Delphi 5のStringReplace関数はヘルプにはマルチバイトに対応していると書かれていますし,
SysUtils.pasを見てもマルチバイトには対応しているようです.
簡単なプログラムでテストをしてみましたが『病』と『餌』は化けませんでした.
>>842 Googleがある時代,「○○ってなんですか?」っていちいち掲示板できくのは無意味ですよ.
>>851 たとえばメニューとツールボタンの両方があるアプリを作るとき.
項目の名前,アイコン,イベントハンドラ,ヒント文字列などを1カ所で管理できます.使用不可にするのも1カ所でできます.
またユーザーインターフェース(要は操作方法)をあとから全く違うものに変更したくなった場合にも
コードをほとんど変更しなくて済みます.ほかにもいろいろ便利.
>>852 TCustomControlクラスの実体を作るのではなくてこのクラスをベースに独自のクラスを定義して使います.
ヘルプの『コンポーネント開発者ガイド』はざっとひと通り読んでみてください.
(ここはわかりやすく丁寧に書かれています)
わからないことがあったらまた質問して下さい.
>>855 >もしかして'*'だと拡張子のないファイルしかヒットしないのでは?
んなこたーない
ワイルドカードは . だって含む
あれ?
じゃあ何で *.* で検索すると . の無いファイルやディレクトリも引っかかるんだ?
教えてエ○イ人!
ディレクトリだけ特別扱いしてる、とか
*.* が特別な扱いになってるだけ。 DOSの頃から存在する謎な仕様の一つですな。
delphi8のアップデートいつなの?
delphi8のアップデート=D2005 ですが、なにか?
>>858 昔のFAT形式は ファイルが32バイトで表現される為に、その情報として'.'を含んでいなかったのです。
つまり 8+3でファイル名+拡張子を記録してドットは記録してなかったわけ。
それなら、*.txt がどうしてワイルドカードになるのかわかんない。 拡張子とファイル名を区別して記録していたなら、ドットが記録されているかどうか を議論するのは意味が無いのでは?
dos,windowsでは最後のドットはファイル名の名前部分と拡張子部分の 区切りを示す特別なものなのだよ
それなら、なぜ *.* のドットが最初のドットではなく、最後のドットだと分かるの? > *.* が特別な扱いになってるだけ。 これのほうが分かりやすいと思うけど。
なぜ疑問なのかが分からないんだけど・・・ *.* の左の*は名前部分、右の*は拡張子部分示してるだけ 正規表現とは違うよ
コマンドプロンプトから dir * dir . dir *.* dir *. dir .* とか入れて見比べてみな
*ばっか
そうなることは分かってる。どうしてそうなっているのか、を議論してる。
Windowsの仕様としかいいようがないだろうに。 ゲーツに聞いたら?
だから > *.* が特別な扱いになってるだけ。
特別扱いになってるのをもっともらしく説明しようとするから・・・・
それなら * が特別扱いだろうに
>>856 にあるとおり、* はドットを含む、と見なせば特別扱いじゃないと思うけど
*だと.shrcとか.historyとか見えちゃうじゃん(*´ω`*)
877 :
デフォルトの名無しさん :05/03/07 11:57:37
>>807 E_Excel := CreateOleObject('Excel.Application');
E_Application := E_Excel.Application;
これを使って開こうとしています。
もちろん、マクロの確認ダイアログは開かないように設定しています。
デジカメの写真からEXIF情報を抜き出してます。 EXIFでは日付が2004:02:12 14:21:48という形式になってます。 これをすばやくTDateTime型に変換したいのですがどうしたらよかですか。
>>878 var
sDate: String;
dDate: TDateTime;
SysUtils.DateSeparator := ':';
SysUtils.TimeSeparator := ':';
sDate := '2004:02:12 14:21:48';
dDate := StrToDateTime(sDate);
function ExifToDateTime(ExifDatetTime:string):TDateTime; begin ExifDatetTime := StringReplace(ExifDatetTime,':','/',[]); ExifDatetTime := StringReplace(ExifDatetTime,':','/',[]); result := VarToDateTime(ExifDatetTime); end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := DateTimeToStr(ExifToDateTime('2004:02:12 14:21:48')); end;
clientsocketでデータの送受信をこれ以上したくないという場合 に通常のshutdownのようなメソッドはありますでしょうか? client.close; を実行したらそのソケットに関してはもうdisconnectイベントが 発生して欲しくないのです。
disconnectイベントをnilにしてcloseしれば?
そうか ConnectイベントでOnDisconnectにDisconnectイベントを設定すればいいのか!
うーん。なんか違う気がする
2005のPersonalエディションていつ無料ダウンロード可になるんでしょうか?
ダウンロードだと将来の商売に差し支えることになるので、雑誌の付録のCDとかに 収録される予定らしい
888
>>887 ありがとう。
雑誌をチェックしてなきゃあかんのか。
貧乏ってつらいな。
891 :
デフォルトの名無しさん :05/03/08 01:35:20
は?
見習って質問に答えたら?
相手してください。。。
確か「2005」の話題は無しじゃなかった?このスレ。
メインバージョンを無視してどうすんだよ
2005は勝手はいけないバージョンなんですよ。 そんなものを買ったんですか? はい。
おれはDel7と心中します。
エディットコントロールの領域にファイルをドラッグアンドドロップし、 そのファイル名をドラッグしたエディットコントロールに表示させたいのですが、うまくいきません。 USE節にshellapiを追加し、private宣言の中に procedure WMDropFiles(var Msg:TWMDropFiles);message WM_dropfiles; を追加、onshowなどに dragacceptfiles(handle,true); を追加、 procedure TForm1.DropFiles(var Msg:TWMDROPFILES); でファイル名取得処理、という感じでフォームにドラッグしたファイル名の受け取りはできました。 そこで、 dragacceptfiles(handle,true); → dragacceptfiles(Edit1.handle,true); にしてみたら、エディットコントロールにドラッグ可能にはなったのですが、ファイル名取得処理が働きませんでした。 説明がへたくそですいませんが、どなたかご教授お願いします?
> procedure WMDropFiles(var Msg:TWMDropFiles);message WM_dropfiles; こうやって宣言しておいて > procedure TForm1.DropFiles(var Msg:TWMDROPFILES); でうまくいくはずないけど・・・・それはともかく > エディットコントロールにドラッグ可能にはなったのですが、ファイル名取得処理が働きませんでした。 それは当たり前。WM_DROPFILES メッセージは Edit1 に届けられるので Form1 で受け取れない。 Edit1 で受け取るために WindowProc を使ってサブクラス化しなくちゃ
>>900 レスどうもありがとうございます。
>procedure WMDropFiles(var Msg:TWMDropFiles);message WM_dropfiles;
すいません、いろいろいじっててごっちゃになってました。
とういか、「どなたかご教授お願いします?」、とかいって疑問形になっちゃってますね(汗
サブクラス化ですか、頑張ってみます。
902 :
798=877 :05/03/08 16:31:30
どなたかよろしくお願いします。
>>902 開いたブックをBookとすると、
Book.RunAutoMacro(xlAutoOpen, CLID);
でいいんちゃう?
CLIDはLOCALE_SYSTEM_DEFAULTのconst
IME再変換に使うと思われるWinAPI immReconvert の使用例はないでしょうか? ぐぐってもあまり出てこないです。
すんません。 immReconvert はWinAPIではありませんでした<(_ _)>
40レスかかってやっと気付いたか
907 :
デフォルトの名無しさん :05/03/08 22:36:45
TActionListに関する質問です。 ToolButton1 . PopUpMenu1のItem1 , PopUpMenu2のItem2 に同じ「HogeAction」 というアクションを設定したとします。 「HogeActionExecute」では処理を分岐したいのですが、 どこから「HogeAction」が呼ばれたかを知るにはどうすればいいでしょうか?
>>907 俺が
>>730 で聞いたのとまったく同じ疑問だw
よくわからないけど、Actionを登録してもOnClickに別関数を割り当てることができるようです。
Caption等々はActionで共通化しておいて処理だけ別みたいな感じで。
ただ、IDEがdfm作成するときにOnClickを消しちゃうので再設定が必要みたい。
>907 >739
>>907 Action.OnExecuteからでは判別不能です。別の方法考えれ。
ちなみにActionを割り当てたからって、
必ずそのActionのOnExecuteを使う必要はない。
自分で新しくイベント定義すればSenderで判別できる。
>>908 ありがとう。
でも不便ですね。
Action使った方が便利と聞いたので、
やっとActionに設定し終わったんですよ
100くらい orz
面倒だけど、後々の管理は楽になるぞ
>>909 ありがとう!!!解決しました。
みんなありがとう。
かなりスマートにいけそうです。
delphiに感動しますた。
WindowsのMediaPlayerをActiveXのインストールでコンポーネントに 出来たまでは良かったのですが、ファイルを読み込むことすら出来ません。 ぐぐって見たんですが、以前のMediaPlayerを使った解説ばかりで 説明通り出来ないんです。 MediaPlayer Var.10を使っています。 よろしくお願いします。
確か「2005」の話題は無しじゃなかった?このスレ。
916 :
デフォルトの名無しさん :05/03/08 23:34:05
くだスレとは思えない程有益なスレだなw
たまに回答神が光臨しますので お待ちください。
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
日本のDelphiコミュニティで一番活発な場所だ。 悪い意味で。
はいはい。
921 :
デフォルトの名無しさん :05/03/09 14:57:29
教えてください。 Imageに画像をセットした後のクリア方法がわかりません。 imgMXXX.Picture.LoadFromFile(''); で実行したのですが、ボタンクリック時に書いたところ消えませんでした。
>>921 TImage.Picture.Canvasで塗りつぶす
923 :
デフォルトの名無しさん :05/03/09 15:10:59
近似色を求めるのにsetPixelVを使うと求められるようなのですが、 使い方はどのように使えばいいのでしょうか?
926 :
sage :05/03/09 16:35:10
GetMem関数で730MByte程度のメモリを確保すると、「メモリが足りません」とエラーが出てしまいます。 使用しているPCの物理メモリは2GByte搭載しており、仮想メモリは3GByte確保しております。 どなたかご存知でしたら教えてください、お願いします。
>>926 プロジェクトオプションのリンカタブで
最大メモリサイズを大きくしたらどうだろう
928 :
926 :05/03/09 17:19:39
Delphiってなんですか?
>>928 C言語を知ってるならmallocで試してみるとか
Linuxブチこんでgcc辺りで試すとか
問題の切り分けをやるしかないね
∫,,,,,,,,,∧,,∧
>>900-901 ⊂,,,,,,,,,つ,,゚Д゚ミつ
ApplicationOnMessage使うのが
楽で、いいんじゃないかな?
http://web.archive.org/web/*/ http://nug.nasu-net.or.jp/~sakai/delphi/tips01.html
>>925 procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
// 線を引く
for i := 0 to 100 do SetPixelV(Canvas.Handle, 10 + i, 10, $0000FF); // R
for i := 0 to 100 do SetPixelV(Canvas.Handle, 10 + i, 20, $00FF00); // G
for i := 0 to 100 do SetPixelV(Canvas.Handle, 10 + i, 30, $FF0000); // B
end;
こんな感じじゃない?
934 :
デフォルトの名無しさん :05/03/09 20:02:59
Delphi初心者です。教えて下さい Virtual ListViewでCheckBoxを表示したいのですがうまくいきません。 ListViewのプロパティは OwnerData=True Checkboxes=True で設定し、OnDataイベントでデータの表示をおこなっています。 Delphi5です。 何が足りなくて表示されないのかわかりません。 また、helpにListView.Items.SetCount()ってprocedureがあるって書かれてるんですが コンパイルエラーになります。これはHelpのバグでしょうか? どなたかおわかりの方、お教え下さい。よろしくお願いします。
>>934 > ViewStyle が vsList または vsReport の場合
とヘルプにある。
> helpにListView.Items.SetCount()ってprocedureがあるって書かれてるんですが
SetCount は protected メソッドだからじゃね?
ListView.Items.Count := 100;
みたいに Count プロパティに直接代入するとか。
936 :
934 :05/03/09 20:29:43
>>935 レスありがとうございます。
説明不足で申し訳ないです。ViewTypeはvsReportで設定しています。
> SetCount は protected メソッドだからじゃね?
了解しました。
> ListView.Items.Count := 100;
本題とはずれてしまいますが、この式をVirtualでない場合(OwnerData=False)は
Countに値が代入されませんでした。これも不可解なんです。
Helpにはデータ領域を確保しますみたいな事書いてあるんですが...
>>936 要するに、OwnerData=Falseの時に
Items.Count に代入すると、キャパシティを設定するということでは。
Items.Count は、実際のアイテム数を指していないと破綻するし。
TListとかでもそうだけど、Capacityを超えてAddしようとすると、
新たにメモリを割り当てなおすから無駄があるけど、
追加するアイテム数がわかってるなら、あらかじめCapacityを設定することで
無駄がなくなって早くなる。
>>856 ごめんなさい,十年くらいずっと勘違いしてました.
>>878-880 海外版Windowsで動かす可能性があるのなら自分で切り出した方がよいかもしれません.
回答神光臨中
>>928 単純にそれだけのサイズの連続した領域を確保できないのでは?
∧,,∧ ぉぁょぅ ミ,,゚Д゚彡 早起きしますた ミ つ旦)~~ 〜と,,,~),,~) Windowsサービスを起動・停止するのは どのようにするのでしょうか、 sc.exeを使う方法は、sc.exe自体を 配布してもいいやらわるいやら よくわからない&そういうのに左右されたくないので ライブラリでとあるサービス(例えばlanmanserverだが)を 起動・停止、してみたいのです。 残りレス数も少ないですが 教えてエロい人。
>>941 コマンドプロンプトでは
net start/stop "サービス名"
でできる
943 :
デフォルトの名無しさん :05/03/10 11:08:18
EditのTextなどの文字が表示できるとこで、 EnabledをFalseにすると文字が灰色になりますが、 この文字の色を黒のままにしたいんですが、できるんでしょうか? 回答お願いします。
パネルごと・・・
2カ所に同じ値を代入したいんだが。 どう書けばいい?
a:=1 b:=1
他にない?
a:=1 b:=a
a=b=1とかは無理だから
嫌ならCをやりませう
a := b = 1 の結果はbが1ならTrue、そうでなければFalse。
thx C++やっててDelphiに浮気したw
>953 うおお、できました。 こんなプロパティあったのか、知らんかった。 ありがとございました。
> EnabledをFalseにすると文字が灰色になりますが、この文字の色を黒のままにしたいんですが できてないだろ・・・・
>955 あ、いや、ReadOnlyをTrue、EnableをTrueにしたので 要は中身を変更禁止のまま文字を黒にしたかったわけで で、変更禁止のプロパティをEnableしか知らなかったわけで 説明不足申し訳ないと思ったわけで
delphiからDOSコマンドのNet Sendみたいなことをやりたいのですが、 何か方法はありますでしょうか(バッチをキックするとかじゃなくて)? 宜しくお願いします。
>>945 function Oppai(const Chikubi: Integer): Boolean;
begin
Result := False;
a := Chikubi;
b := Chikubi;
if a = b then
Result := True;
end;
>>958 NetMessageBufferSend
次スレよろ
imageListの設定で、アイコン追加すると、 画像の一番外側の枠が無視されてしまうのは何故?
ImageListは追加された画像の左下か右下1Pixel分を 自動で透過色判別するからじゃね?
透過させる色を変えればいいんだよ
>>964-965 書き出ししてたから透過色選択できなくて気づかなかった・・・
マジdクス
猿でもわかるIME再変換の方法を教えてください。
>>942 さん、
>>957 さん
∧,,∧ 多謝!
,,ミ,,゚Д゚ミ
.とミ,,,,,U,,U
次スレを立てますか。
Delphi6でgifアニメ表示するにはどうしたらよいのでしょうか。 おしえてください。
TGIFImageとかフリーのコンポーネントを利用するのが楽かと
>>973 それ選んだ瞬間固まっちゃったもので・・・後出しですいません
TMainMenuを使いメニューを作成しましたが 実行してみるとメニューバーが表示されていません。 何か解決策はあるのでしょうか?
>>975 BorderStyleがbsDialogになってるとか?
>>976 で、できた。やっぱりbsDialogになってたみたいです。
まじありがとうございました。
コンポーネントパレット中のコンポーネントをダブクリすると、 自動で中央に配置されるんだね、知らんかった。
980 :
デフォルトの名無しさん :05/03/13 03:12:41
日本語のOSなのか英語(その他)のOSなのか判断するにはどうしたらいいのでしょうか?
プログラムを起動しているマシンのグローバルIPアドレスを取得したいのですが どのようにすれば良いでしょうか。おそらく外部のサーバに接続したりしないと いけない気がするのですが。。
>>980 GetSystemDefaultLCID
自身を再起動したいと思うのですがどうすれば良いでしょうか。 やはりバッチファイル等を使わないと無理ですよね?
ヤバい、
>>985 が人生の再起動について聞いてるのかと思っちゃった。
>>985 CreateProcess なり、WinExec なり、ShellExecute なり、なんなりと