【问题标题】:How to intercept Menu shortcut event in Firemonkey如何在 Firemonkey 中拦截菜单快捷方式事件
【发布时间】:2014-09-19 01:31:51
【问题描述】:

在 Firemonkey 表单上添加一个主菜单和一个子菜单项。将子菜单的快捷方式属性设置为 Ctrl-A。

在进入菜单之前是否有拦截 Ctrl-A 的方法?好像OnKeyDown这个表单没看到。

【问题讨论】:

    标签: delphi firemonkey


    【解决方案1】:

    表单检查是否有子组件想要处理该键。如果钥匙被处理,那么故事就结束了。

    这是一种使用插入器防止TMenuItem 处理密钥的快速而肮脏的方法。

    type
      TMenuItem = class(FMX.Menus.TMenuItem)
      protected
        procedure DialogKey(var Key: Word; Shift: TShiftState); override;
      end;
    
    
    procedure TMenuItem.DialogKey(var Key: Word; Shift: TShiftState);
    begin
      if (ssCtrl in Shift) and (Key = 65){A} then exit;       
      inherited;
    end;
    

    如果您正在使用操作,那么您必须以相同的方式覆盖 TActionListDialogKey 函数。

    【讨论】:

    • 在表单上启用 KeyPreview 属性的同时,使用表单 OnKeyDown 事件拦截此组合键不是也可以吗?
    • @SilverWarior,你说的是 VCL,这个问题是针对 Firemonkey 框架的。在 FMX 中没有 KeyPreview,因为所有键都已被表单捕获。如果子组件处理密钥,则表单 OnKeyDown 将永远不会触发。
    • 我不知道。我认为这与 VCL 相同。我想我们每天都会学到一些新东西。
    • 感谢您的回答,但我注意到的一件事是,如果您有第二个表单,它将看不到与主表单关联的快捷键。这意味着,例如,如果您在第二个表单上有一个 tmemo,而主表单使用主菜单中的 Ctrl-v 快捷方式,则无法使用 Ctrl-v 将文本粘贴到备忘录中。这是 FMX 独有的,VCL 按预期工作,第二个表单接收所有击键,而与主表单上的快捷键无关。
    • 您的解决方案有效。我现在要发布另一个问题,询问如何将这些截获的击键传递给当前活动的表单。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多