2014-09-19 74 views
1

我在VCL中遇到了一些與FMX不同的行爲。這涉及如何處理主菜單快捷方式。 FMX應用程序似乎會攔截主窗體中的所有快捷鍵,以使其他任何活動窗體都看不到這些擊鍵。如何將按鍵傳遞到Firemonkey中的第二個活動窗體上

這意味着,例如,如果第二個窗體上有TMemo,並且主窗體使用Ctrl-V主菜單快捷方式,則無法使用Ctrl-V將文本粘貼到備忘錄中。這對FMX來說是獨一無二的,VCL可以按預期工作,第二種形式接收所有擊鍵,而不管主窗體上的快捷鍵。

這個問題的答案How to intercept Menu shortcut event in Firemonkey解釋瞭如何截取主窗體中的快捷方式。

這裏的問題是如何從主表單獲取這些攔截的按鍵到當前活動的表單,以便第二個表單上的TMemo或TEdit等控件按預期工作?

回答

1

基於在How to intercept Menu shortcut event in Firemonkey答案,單程通過在MainMenu的快捷鍵,例如Ctrl-A鍵,當前激活的形式是主要形式使用此代碼:

TMenuItem = class(FMX.Menus.TMenuItem) 
protected 
    procedure DialogKey(var Key: Word; Shift: TShiftState); override; 
end; 


procedure TMenuItem.DialogKey(var Key: Word; Shift: TShiftState); 
var ch : char; 
begin 
    if (ssCtrl in Shift) and (Key = 65){A} then 
    begin 
    ch := #0; 
    Screen.ActiveForm.KeyDown(Key, ch, Shift); 
    exit; 
    end; 
    inherited; 
end; 
1

一種替代回答第一個問題,這是行得通的,但不是每個人都會喜歡它,再加上它有侷限性。對於簡單的情況應該工作。

在顯示第二個表單之前,從mainform刪除快捷方式,然後在表單將控制權返回給mainform時恢復快捷方式。如果使用showmodal顯示第二個表單,則工作正常。可惜沒有一個像VCL那樣的OnShortCut事件。例如粗略的例子:

(MainMenu.Items[0] as TMenuItem).Items[0].ShortCut := TextToShortCut(''); 
FormTwo.ShowModal; 
(MainMenu.Items[0] as TMenuItem).Items[0].ShortCut := TextToShortCut('Ctrl+V'); 
+0

我實際上決定這麼做,因爲我只需要Ctrl + C,它就像一個魅力。我使用主窗體的「OnActivate」和「OnDeactivate」事件。 PS。使用VCL C++(我剛剛意識到這不是一個VCL問題,對不起) – Peter 2016-01-21 04:15:24

相關問題