2008-10-22 69 views
1

如何使KeyDown事件在Delphi(2007)MDI應用程序父窗口中工作,即使子窗口具有焦點?在Delphi Mdi應用程序的父窗口中使用KeyDown事件

我想實現一個快捷鍵(F1),帶來了一個MDI應用程序幫助屏幕,我已經添加在KeyDown過程將MDI父窗口,並在這兩個父母與子女Windows中啓用的KeyPreview,但它不按預期工作。

如果我在Parents KeyDown代碼中放置一個斷點,我可以看到它永遠不會執行,即使它沒有打開子窗口。但是,如果我將相同的代碼添加到子窗口,它工作正常。

有沒有辦法讓父窗口接收按鍵,即使子窗口有焦點,因爲向25個表單添加代碼接縫有點浪費?

回答

4

本週我有完全相同的問題!我通過在mainform的ActionManager中創建一個動作來修復它。此操作將打開幫助文件並將F1鍵設置爲快捷方式。它也適用於所有MDI子屏幕。

+0

這應該肯定有效;此外,無論如何,使用TActionLists或TActionManagers這種事情是正確的方式! – onnodb 2008-10-22 16:09:49

2

您可以使用本地(全球不需要)keyboard hook。您也可以從signle form基類中派生所有MDI Child表單並在其中實現一次。你會發現這個設計也適用於其他問題。

編輯

應用廣泛的熱鍵/快捷鍵也可以與TApplication.OnShortCut事件實現。請參閱http://delphi.about.com/od/adptips2004/a/bltip0904_3.htm

F1已經是觸發TApplication.OnHelp的標準幫助快捷方式。所以也許你想使用OnHelp事件?如果您使用HelpFile,HelpContext,HelpType和HelpKeyword屬性,則可能根本不需要實現任何代碼。

+0

偉大的建議。我一直使用MDI兒童的基類。它只是覺得正確的做法。 – 2008-10-22 09:59:54

1

F1幫助處理內置於Delphi中,因此您所要做的就是正確處理幫助消息。這可能與設置應用程序的helpfile屬性一樣小。你可以使用窗體的幫助設置特定的頁面?屬性。

基本上,只是使用提供的幫助系統,忘記keydown。這是德爾福 - 你不必努力工作。

2

如何使KeyDown事件在Delphi(2007)MDI應用程序父窗口中工作,即使子窗口具有焦點?

作爲更通用的解決方案(用於幫助比F1其他應用)我在主要形式使用類似於此代碼以捕獲一個keydown事件。即使MDI子項處於活動狀態,也可以獲取所有密鑰。在這個例子中,我正在做與你正在做的相反的事情(我希望消息由我的子表單而不是主窗體來處理),但在父窗口中捕獲鍵的概念是相同的)。

​​
相關問題