Delphi でモーダル フォームを作成して、ユーザー インターフェイスとの対話を防ぎますが、他のフォームの実行は続行できるようにしようとしています。これは可能ですか?
4 に答える
Windows はバックグラウンドでメッセージを処理し続けるため、たとえばタイマーで発生する更新は引き続き発生します。すべてのキーボード イベントとマウス イベントがモーダル フォームに送信されるだけです。理論的には、メッセージを別のフォームに投稿して、必要に応じてコードを「アクション」することができます。メインスレッドでできることはまだたくさんあります。問題は、これが実際にやりたいことかどうかです。
ShowModal
モーダル フォームは、モーダル フォームが閉じたときにのみ戻る関数 を呼び出すことによって呼び出されます。同じスレッド (UI スレッド) でコードを実行する場合は、内部から呼び出す必要がありますShowModal
。ほとんどの場合、これは支持できるアプローチではありません。このことから、問題のコードは UI スレッド以外のスレッドで実行する必要があると結論付けることができます。
フォーム自体には「実行」はありませんが、(モーダル) フォームがアクティブな間、スレッドを使用してバックグラウンドでコードを実行できます。
推奨されませんが、可能です。
これは、進行状況フォームを表示して、メイン スレッドを続行しながらアプリケーションがビジー状態であることを示すために行いました。
ShowModal 内のコードを半分に分割し、repeat until ループを削除するという考え方です。
フォームを表示するために前半を呼び出すことができ、フォームを再び閉じるために後半を呼び出すことを保証する必要があります。
の線に沿った何か
NonBlockingModalForm = TNonBlockingModalForm.Create();
try
NonBlockingModalForm.FirstHalfOfShowModal;
DoStuff;
finally
NonBlockingModalForm.SecondHalfOfShowModal;
NonBlockingModalForm.Free;
end;
ShowModal 内のループでは、Application.HandleMessage abd への呼び出しがあり、終了するアプリをチェックします。
UI を適切に再生するには、これらを行う必要があります。