【问题标题】:Set 'view-only' shortcuts for menu items?为菜单项设置“仅查看”快捷方式?
【发布时间】:2012-04-24 19:00:28
【问题描述】:

我们知道,如果我们为一个 TMenuItem 设置一个快捷键(例如,Ctrl + F2),一旦按下指定的快捷键,菜单项就会自动执行,并且在显示菜单时也会显示快捷键说明

但是有没有办法让菜单项上的快捷方式描述可见但使菜单不自动响应快捷方式?

你可能会问我为什么要这个,情况如下:

在多文档(如火狐的多标签)程序中,有多个 TPopupMenu 实例,因此多个 TMenuItem 对象具有相同的快捷方式,但我只希望活动文档窗口中的菜单项响应快捷方式。


编辑 1:抱歉,我想简化我的问题,但我错误地描述了它 - 实际上,我使用 TActionList 并将操作链接到菜单项。


编辑 2:刚刚发现:我想我可以使用 TApplicationEvents.OnShortCut Event 在将快捷方式分派到菜单/操作之前拦截它们...我会尝试更新我的问题当我得到结果时。

【问题讨论】:

  • TLama,感谢您的帮助。我已经更新(更正)了我的问题。通过“TPopupMenu 的多个实例(在我更正我的问题后应该是 TActionList)”,我的意思是我创建了多个 TFrame 对象,每个对象都包含一个 TActionList。
  • 但是即使是关于动作列表,仍然只有一个焦点帧的菜单会响应快捷方式。如果在此类菜单项标题中描述了快捷方式,我不明白为什么要拦截它们。这会让用户感到困惑,他们将能够弹出菜单,可以看到快捷方式,但是当他们使用按键时没有任何反应。
  • @TLama,我刚刚再次验证,使用D2010,不是焦点帧的菜单会响应快捷方式,而是会执行意外帧的动作,其余的会被跳过。这实际上会让用户感到困惑。我想要做的是通过集中处理快捷方式来避免这种混淆,这样只有活动框架会处理快捷方式,同时仍然让用户通过使用 TAction.Shortcut 属性看到菜单项上的快捷方式。跨度>
  • 您应该从根本上改变设计,使每个帧共享一个动作列表,单个popupmenu等。选择帧时,您将定义一个指针(像pattivedocument:^ tmyframe的东西)。然后在 action.execute 实现中,您将只使用您的 PActiveDocument。此外,您的应用也会使用更少的内存。
  • @az01,谢谢,这是另一种方法,但是,在框架上执行操作给我带来了便利(访问框架的内部数据)。

标签: delphi


【解决方案1】:

使用制表符 (#9) 字符指示标准菜单中文本的快捷方式部分。您可以设置菜单项的 Caption 属性或菜单项绑定到的操作组件,方法是编辑“dfm”或在运行时包含制表符:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Action1.Caption :=
      Action1.Caption + #9 + ShortCutToText(ShortCut(VK_F2, [ssCtrl]));

除非您还分配给菜单项或操作的ShortCut 属性本身,否则不会触发单击/执行事件。

【讨论】:

  • 太棒了!制表符之后的文本甚至是右对齐的,这是我第一次看到这个解决方案时想要和担心的!谢谢塞尔塔克!现在我知道我不必让自己的 TMenuItem 下降并绘制只读快捷方式;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多