2014-09-19 72 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

相关问题