2012-10-18 4 views
8

私は、アプリケーションを使用しているときに常にアクセス可能なユーティリティダイアログ(非モーダルで上に留まる)を持っています(アプリケーションで作業中にメモを取るために使用できるダイアログボックスを考えてください)モーダルダイアログが表示されます別のフォームがモーダルで表示されているときに無効になっていないフォームを作成するにはどうすればよいですか?

残りのアプリケーションは変更できません。

可能ですか?どうすればそれについて行くことができますか?

+0

Windowsの「モダリティ」は確かにPITAになる可能性があります。 (私が考えることができる最悪の例は、他のWordウィンドウにモーダルダイアログが開いている場合、Word文書を開くことができないMicrosoft Word 2010です(たとえば、* .docxファイルをダブルクリックするなど)。別のアプリケーションの一部ですか? –

+0

@Andreas Rejbrand:私は別のアプリケーションにすることを考えましたが、内部のアプリケーションにアクセスする必要があります(一部のキャプチャ/再生メカニズム用)。 – jpfollenius

+0

2つのアプリケーション間の通信に名前付きパイプを使用するのは簡単です。良いスタートについては、[cromis-ipc](http://www.cromis.net/blog/downloads/cromis-ipc/)をご覧ください。 –

答えて

15

ShowModalが呼び出されると、既存のすべての最上位ウィンドウが無効になります。それがモダリティが機能する方法です。対話が合理的なウィンドウがある場合は、再度有効にするだけです。

たとえば、あなたは、ユーティリティウィンドウにこれを追加することができます。これは、あなたのユーティリティウィンドウが無効にすることはできませんことを確認します

type 
    TMyUtilityForm = class(TForm) 
    protected 
    procedure WMEnable(var Message: TWMEnable); message WM_ENABLE; 
    end; 
.... 
procedure TMyUtilityForm.WMEnable(var Message: TWMEnable); 
begin 
    if not Message.Enabled then 
    EnableWindow(Handle, True); 
    inherited; 
end; 

+2

+1。デイヴィッドはいつも物事がどのように作用するか知っています:) –

+1

@AndreasRejbrandとてもいいと言っていいですが、私はそれが実際に真実であったことを願っています! ;-) –

+0

私は 'WM_ENABLE'ハンドラを使い、継承された呼び出しの前に' EanbleWindow() 'を呼び出します。より自然に見えるだろう。 –

関連する問題