2012-05-10 8 views
2

私は、ユーザーインターフェイスとのやりとりを妨げるようなモーダルフォームをDelphiで作成しようとしていますが、他のフォームの実行は引き続き可能です。これは可能ですか?Delphiのモーダルフォームは非ブロック化できますか?

+1

あなたはフォームから出てほしいものを、どこに属している場所に移動してみませんか? MVCまで行く人もいれば、自分のロジックをすべて自分のフォームに入れない限り行く。 –

+0

この質問は私には明らかではありません。私はあなたが本当に欲しいものは何ですか?ユーザー対話またはコードの実行? –

+0

私は、Modalフォームの全体的な設計目的は、質問を誤解していない限り、背景が相互作用しないようにすることだと思いましたか? –

答えて

2

フォームには「実行」はありませんが、アクティブな(モーダル)フォームがある間にスレッドを使用してバックグラウンドでコードを実行できます。

3

モーダルフォームは、モーダルフォームが閉じたときにのみ返される関数ShowModalを呼び出すことによって呼び出されます。同じスレッド、つまりUIスレッドでコードを実行する場合は、ShowModalから呼び出す必要があります。ほとんどの場合、それは耐えられるアプローチではありません。そこから、問題のコードはUIスレッド以外のスレッドで実行されなければならないと結論づけることができます。

3

Windowsはバックグラウンドでメッセージを処理し続けるため、たとえばタイマーで発生した更新は引き続き発生します。すべてのキーボードイベントとマウスイベントがモーダルフォームに向けられているだけです。理論的には、メッセージを別のフォームに投稿して、必要に応じて「アクション」コードを追加することができます。あなたが主なスレッドでまだやっていることがたくさんあります。質問は、これがあなたが実際にやりたいことかどうかです。

2

可能ですが、お勧めしません。

これは、メインスレッドで引き続きアプリケーションがビジー状態であると言う進捗状況を示すために行っています。

ShowModalのコードを半分に分割し、repeat untilループを削除することです。

フォームを表示するために前半を呼び出すことができます。後半を呼び出してもう一度閉じることができます。

ShowModal内ループで終端されているアプリのApplication.HandleMessage ABDチェックへの呼び出しがあること

NonBlockingModalForm = TNonBlockingModalForm.Create(); 
try 
    NonBlockingModalForm.FirstHalfOfShowModal; 
    DoStuff; 
finally 
    NonBlockingModalForm.SecondHalfOfShowModal; 
    NonBlockingModalForm.Free; 
end; 

ノートの線に沿って何か。

UIをうまく再生したい場合は、これを行う必要があります。

関連する問題