2014-07-24 65 views
0

是否有一個屬性通過其他形式ShowModal過程來判斷表單是否已停用?是否有一個屬性可以告訴表單是否被其他形式的`ShowModal`過程取消激活?

編輯: 我的程序有一個托盤圖標,當它被點擊時會將主窗體放到主窗體的前面。當另一個窗口以模態顯示時,我想禁用它。因爲不這樣做,主窗體(這是禁用)將覆蓋模式窗體並完全阻止我的程序。

+0

您的主窗體中的某些內容會打開該模式對話框,不是嗎?因爲如果是這樣,請從那裏禁用那些東西。 – TLama

+0

我對你的措辭感到困惑。當您在另一個窗體上調用ShowModal時,窗體將自動禁用。然後你說,「我想禁用一些行動」的形式。 WTF?它發出一聲​​嘟嘟聲表示它已被禁用,無法獲得焦點。如果您不想禁用表單,請調用Show而不是ShowModal,並在用戶單擊表單時實現所需的任何邏輯,而另一個可見。 –

+0

你問一個物業,但你的描述聽起來像你想要通知。這是什麼? –

回答

2

此行爲是預期的。顯示模式表單時,其他表單將被禁用。你根本不需要禁用任何東西,框架已經爲你處理了這一切。由於您試圖與禁用的表單進行交互,因此會發出蜂鳴聲。

如果您希望在您的窗口被禁用時出於任何原因收到通知,而不僅僅是因爲已經顯示模式窗體,請收聽WM_ENABLE消息。測試您的主窗體是否已被禁用。通過調用IsWindowEnabled Win32函數來做到這一點。

話雖如此,我覺得很可能您沒有正確診斷過這個問題。這聽起來像你可能正在遭遇窗口所有權問題,這在Delphi 6中很常見。或者你正試圖從通知圖標代碼中錯誤地恢復應用程序。爲此,請使用Application.BringToFront


VCL對模態對話框的處理看起來很混亂。當您顯示系統提供的模式對話框時,例如MessageBox,窗口被禁用,不管它們是否可見。但是,當調用ShowModal時,VCL僅禁用可見窗口。更重要的是,您不能使用Enabled來測試該窗口是否被禁用,您必須使用IsWindowEnabled Win32函數。

+0

是的! 「IsWindowEnabled」正是我所期待的。我對此感到抱歉。我不太會用英語說話,解釋對我來說更難。 –

+0

我在猜測真正的問題是什麼。有些代碼會幫助我們。我不知道真正的解決方案是不是擔心啓用,並調用'Application.BringToFront'而不是'MainForm.BringToFront'。 –

+0

> *'IsWindowEnabled' * ...>是的,窗體從不禁用,只有窗口是。 –

1

您可以在任何時間測試Application.ModalLevel以查明是否有模態表單。例如: -

if Application.ModalLevel = 0 then 
    MainForm.Visible := True; 

注意,非TCustomForm後代不會設置模式級,API對話就像打開文件對話框或消息框,例如。如果有這種可能性,您可能會圍繞運行這些對話框的代碼使用ModalStartedModalFinished

您的情況似乎不是必要的,但如果您不知何故需要通知窗體/對話框將變爲模態,您可以附加一個處理程序到Application.OnModalBeginApplication.OnModalEnd事件。您可以使用TApplicationEvents組件。

+1

不幸的是,'ModalLevel'後面加了。 – TLama

+1

@TLama - 無賴!謝謝你告訴我。 –

+1

確實。我的'TApplication'中沒有'ModalLevel',而我正在使用Delphi 6。但是,您告訴我應該怎麼做。我將創建自己的屬性,每次在我調用ShowModal之前,我將它設置爲true,當ShowModal退出時,我將它設置爲false。 –

相關問題