2012-01-09 3 views
2

私は、標準の検索ダイアログがあります。Delphiで検索ダイアログを中断するにはどうすればいいですか?

enter image description here

私のプログラムはいくつかの非常に大きなファイルを処理することができ、そしてそのようなファイルにテキストを見つけることが10または20秒以上かかることがあります。 「次を検索」ボタンを押した後、カーソルを砂時計に変更します。私は、テキストが見つかったか見つからないと、標準のポインタに戻します。

私の問題は、ユーザーが検索をキャンセルすることを決定し、[キャンセル]ボタンを押して決定する可能性があるということです。キャンセルボタンを押してダイアログを閉じますが、テキストが見つかるか見つからないようになるまで、FindDialogFindルーチン内で検索が続けられます。

FindDialog.exeの終了時にブレークポイントを設定しましたが、FindDialogFindが完了するまでブレークポイントに達しません。

[キャンセル]ボタンが押されたため、FindDialogFindループを解除することができますか、またはキャンセルボタンを押したときに検索を停止する方法がありますか?

+0

'FindDialog'の' OnClose'イベントでは、ブール型変数 'FStopSearch'を設定します。検索ルーチンでこのvarを頻繁にチェックし、設定されていれば検索を中止します。 –

+2

@LURD - これはまさに私がやりたいことです。 Windows共通ダイアログのOnCloseイベントハンドラを設定するにはどうすればよいですか?これはDelphi形式ではありません。そして、あなたはコメントではなく答えとして私にこれを伝えてみませんか? – lkessler

+0

ドロップされたFindDialogには3つのイベントがあります。 FindDialogCloseは正常に動作するはずです。ありがとう。何も登録しない時代があります。ごめんなさい。 – lkessler

答えて

4

TFindDialogコンポーネントのOnCloseイベントでは、ブール値変数FAbortSearchを設定します。 検索ルーチンでこのvarを頻繁にチェックし、設定されていれば中止します。

+0

これはもちろん、検索ルーチンが 'Application.ProcessMessages()'を定期的に呼び出している場合にのみ機能し、キャンセルボタンはまったく機能します。 –

1

Nextボタンを押すたびに起動するワーカースレッドに検索ロジックを移動します。ダイアログが閉じているときは、まだ実行中のスレッドを終了できます。

+0

これはユーザが待っている主要な仕事になるので、私はできるが、本当の必要はない。 – lkessler

+0

おそらく、検索中に 'Application.ProcessMessages()'を呼び出すことで、検索自体を遅らせることなく、または副作用を導入することなく、検索操作をきれいに取り消すことができます。あなたが注目すべき時間の間主なスレッドをブロックする必要があるときはいつでも、ワーカースレッドの使用を考慮する必要があります。メインスレッドは、タイムリーにメッセージキューに応答する必要があります。 –

+0

...デルファイだけがスレッド化を容易にした場合。レミーに渡してください。 – lkessler

関連する問題