私は、プロセスをキャンセルするボタンをクリックせずにウィンドウを閉じることを防ぐために、25秒ほどかかることがあるセカンダリフォームにプロセスを持っています。キャプチャred-X
画面の右上にある赤いXをクリックすると、処理が完了してから終了するまで何も起こりません。
処理が完了するかキャンセルされるまでブール値を設定しようとしましたが、処理が完了して終了するまで待機します。
Red-Xクリックをトラップして、ユーザーに待機またはキャンセルするよう通知するにはどうすればよいですか?
私は、プロセスをキャンセルするボタンをクリックせずにウィンドウを閉じることを防ぐために、25秒ほどかかることがあるセカンダリフォームにプロセスを持っています。キャプチャred-X
画面の右上にある赤いXをクリックすると、処理が完了してから終了するまで何も起こりません。
処理が完了するかキャンセルされるまでブール値を設定しようとしましたが、処理が完了して終了するまで待機します。
Red-Xクリックをトラップして、ユーザーに待機またはキャンセルするよう通知するにはどうすればよいですか?
'X'がフォームを閉じないようにするには、ハンドラをOnCloseQuery
に入れます。
procedure TForm34.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= DoneProcessing;
if not(DoneProcessing) then begin
ShowMessage('hold on');
end;
end;
メインウィンドウのUIをブロックしないようにするには、別のスレッドに配置する必要があります。
OmniThreadLibraryを使用することをお勧めします。
私は自分のOPでそれを試しました_プロセスが完了するか、キャンセルされるまでブール値を設定しようとしましたが、プロセスが完了してシャットダウンするまで待ちます。_ – user2175495
- これを動作させるにはタイマーを設定する必要があります(間隔は問題ではありません)、タイマーが起動するとDoneProcessingをtrueに設定します。処理が終了した後、ユーザー入力メッセージ(赤色のxをクリック)がキューから取得された後に起動します。 WM_TIMERは、キューがポンピングする最も低い優先度のメッセージであるためです。処理は今のように終了しますが、フォームは閉じません。 –
それ以外の場合は、処理プロセスにApplication.Processメッセージを挿入します。 –
バルクプロセスの代わりにアイドルハンドラを使用します。 –
大きな問題は、あなたが忙しいメインスレッドを持っているということです。私はまずそれを修正したいと思います。フォームに閉じるボタンがないようにしてください。 –
処理をスレッドに移すまで、OnCloseQueryのハンドラを置くことができます。ハンドラは、プロセスが完了した後も引き続き実行されます。 –