我在FMX中遇到了一些与VCL不同的行为。这与主菜单快捷方式的处理方式有关。似乎FMX应用程序将拦截主窗体中的所有快捷键击,这样任何其他活动窗体都不会看到这些击键。
这意味着,例如,如果您在第二个表单上有TMemo而主表单使用Ctrl-V主菜单快捷方式,则无法使用Ctrl-V将文本粘贴到备忘录中。这是FMX独有的,VCL按预期工作,其中第二种形式接收所有击键而不管主窗体上的快捷方式。
此问题How to intercept Menu shortcut event in Firemonkey中的答案解释了如何拦截主窗体中的快捷方式。
这里的问题是如何将这些截获的击键从主窗体转换为当前活动的窗体,以便第二个窗体上的TMemo或TEdit等控件按预期工作?
答案 0 :(得分:1)
根据How to intercept Menu shortcut event in Firemonkey中的答案,将主菜单快捷键击(例如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 :(得分:1)
对第一个问题的另一个答案是,它可以运作,但不是每个人都喜欢它,而且它有局限性。对于简单的情况,应该有效。
在显示第二个表单之前,从主表单中删除快捷方式,然后在表单将控件返回到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');