ダイアログの正しい閉じ方、停止の仕方は?
●Form1(メインフォーム)に
ファイル検索開始ボタンを置き、手続き FileSearch でファイル検索し表示させます。
procedure SearchFile;
・・・
if (FindFirst(Path + '\*.*', faAnyFile, SearchRec) = 0) then
・・・
repeat
Application.ProcessMessages;
・・・
until (FindNext(SearchRec) <> 0);
Form2表示窓閉じ&中止ボタンを置き、手続き SearchStopでForm2を閉じます。
procedure SearchStop(Sender: TObject);
begin
Form2.Close;←←←????
end;
●Form2ダイアログはForm2.Show;でデータ表示用の非常駐のForm2を表示させています。
(ShowModalでは、メインフォームから操作できないから)
Form2にListViewだけを貼り付けています。
このリストビューに検索データを表示させています。
質問1は、Form2を正しく閉じるには Closeでいいのでしょうか?
質問2は、検索中に(ListViewに表示中)に途中中止するにはどうしたらいいか解りません。
Application.ProcessMessages;をつけるのではと考えたのですが。
「Access violation at address 004907BD in module 'FindFile2.exe'. Read of address 0000022C.」というエラーが出ます。
以上、毎度愚問ですがご指導いただきたいです。m(__)m
>質問1
Closeで構わないと思いますが、FindFirst使ってる途中で閉じたりするときは、ちゃんとFindClose()が発行されるようにしてやって下さい。
>質問2
Application.ProcessMessages;を何に使っているんですか。多分、ListViewへの表示用ということでもあるのでしょうが、、、
例えば、Privateとかで、
SearchFlg : Boolean;
とでもしておき、中止が押されたイベントで、
SearchFlg := false;
とかにしておき、
Application.ProcessMessages;
if (not SearchFlg) then
begin
//検索を抜け出す処理なりなんなりを書く
end;
とでもすればいいのでは?
通りすがりさん、いつも教えて頂いてありがとうございます。
質問1の件は安心しました。
少しずつ勉強していると、使ったメモリーやインスタンスを解放してやると書いてあるのでForm2、リストビューの解放がこれでいいのかなと心配になったものですから。
質問2は、高速?で検索と表示処理中になると処理が終わるまで、他のクリックなど受け付けなかったものですから、Application.ProcessMessages;を使う例があったものですから付けてみました。しかし使い方が解りませんでした。
早速試してみます。ありがとうございました。m(__)m
忘れてました。
ListViewを使っているんですよね?
TListItemのDataプロパティを使ってポインタをイヂっている場合、ListViewのOnDeletionにちょっと必要です。
それと、このForm2ってのも、自動作成の対象に入っているのであればCloseで構いませんが、そうではなく、
var
F : TForm2;
begin
F := TForm2.Create(Self);
F.ShowModal;
end;
なんてしてる場合は、Form2のOnCloseでAction := caFree;
とかってしなけりゃならなかったり
通りすがりさん、わざわざのフォローありがとうございました。
お礼が遅くなりました。
「ウィンドウの終わり方」なんて愚問かもしれませんが意外と探し回っても解説したHPが見つかりませんでした。
今回、Action := caFree;というキーワードを教えて頂いて、これを元に探し回ったら、
http://delphi.sakura.vg/lesson22.html
http://kakinotane.s7.xrea.com/delphi/d2/d035.html
http://www.geocities.co.jp/SiliconValley-Bay/3828/a13.html
などためになるHPを探せました。
ありがとうございます。m(__)m
ツイート | ![]() |