是否有一個屬性通過其他形式ShowModal
過程來判斷表單是否已停用?是否有一個屬性可以告訴表單是否被其他形式的`ShowModal`過程取消激活?
編輯: 我的程序有一個托盤圖標,當它被點擊時會將主窗體放到主窗體的前面。當另一個窗口以模態顯示時,我想禁用它。因爲不這樣做,主窗體(這是禁用)將覆蓋模式窗體並完全阻止我的程序。
是否有一個屬性通過其他形式ShowModal
過程來判斷表單是否已停用?是否有一個屬性可以告訴表單是否被其他形式的`ShowModal`過程取消激活?
編輯: 我的程序有一個托盤圖標,當它被點擊時會將主窗體放到主窗體的前面。當另一個窗口以模態顯示時,我想禁用它。因爲不這樣做,主窗體(這是禁用)將覆蓋模式窗體並完全阻止我的程序。
此行爲是預期的。顯示模式表單時,其他表單將被禁用。你根本不需要禁用任何東西,框架已經爲你處理了這一切。由於您試圖與禁用的表單進行交互,因此會發出蜂鳴聲。
如果您希望在您的窗口被禁用時出於任何原因收到通知,而不僅僅是因爲已經顯示模式窗體,請收聽WM_ENABLE
消息。測試您的主窗體是否已被禁用。通過調用IsWindowEnabled
Win32函數來做到這一點。
話雖如此,我覺得很可能您沒有正確診斷過這個問題。這聽起來像你可能正在遭遇窗口所有權問題,這在Delphi 6中很常見。或者你正試圖從通知圖標代碼中錯誤地恢復應用程序。爲此,請使用Application.BringToFront
。
VCL對模態對話框的處理看起來很混亂。當您顯示系統提供的模式對話框時,例如MessageBox
,窗口被禁用,不管它們是否可見。但是,當調用ShowModal
時,VCL僅禁用可見窗口。更重要的是,您不能使用Enabled
來測試該窗口是否被禁用,您必須使用IsWindowEnabled
Win32函數。
是的! 「IsWindowEnabled」正是我所期待的。我對此感到抱歉。我不太會用英語說話,解釋對我來說更難。 –
我在猜測真正的問題是什麼。有些代碼會幫助我們。我不知道真正的解決方案是不是擔心啓用,並調用'Application.BringToFront'而不是'MainForm.BringToFront'。 –
> *'IsWindowEnabled' * ...>是的,窗體從不禁用,只有窗口是。 –
您可以在任何時間測試Application.ModalLevel
以查明是否有模態表單。例如: -
if Application.ModalLevel = 0 then
MainForm.Visible := True;
注意,非TCustomForm後代不會設置模式級,API對話就像打開文件對話框或消息框,例如。如果有這種可能性,您可能會圍繞運行這些對話框的代碼使用ModalStarted
和ModalFinished
。
您的情況似乎不是必要的,但如果您不知何故需要通知窗體/對話框將變爲模態,您可以附加一個處理程序到Application.OnModalBegin
和Application.OnModalEnd
事件。您可以使用TApplicationEvents
組件。
不幸的是,'ModalLevel'後面加了。 – TLama
@TLama - 無賴!謝謝你告訴我。 –
確實。我的'TApplication'中沒有'ModalLevel',而我正在使用Delphi 6。但是,您告訴我應該怎麼做。我將創建自己的屬性,每次在我調用ShowModal之前,我將它設置爲true,當ShowModal退出時,我將它設置爲false。 –
您的主窗體中的某些內容會打開該模式對話框,不是嗎?因爲如果是這樣,請從那裏禁用那些東西。 – TLama
我對你的措辭感到困惑。當您在另一個窗體上調用ShowModal時,窗體將自動禁用。然後你說,「我想禁用一些行動」的形式。 WTF?它發出一聲嘟嘟聲表示它已被禁用,無法獲得焦點。如果您不想禁用表單,請調用Show而不是ShowModal,並在用戶單擊表單時實現所需的任何邏輯,而另一個可見。 –
你問一個物業,但你的描述聽起來像你想要通知。這是什麼? –