2

我有一个有很多动作的单元,有些动作有快捷方式,有些甚至有相同的快捷方式。这是因为它们在应用程序中属于不同的模块,并且它们不在同一时间上下文中。

现在我有了一个可以随时随地启动的全局非模态对话框(称为 objectinspector)。它具有与模块中其他位置相同的快捷方式的一些操作。

因此,我想在 objectinspector 处于活动状态时临时覆盖那些共享相同快捷方式的操作,并在停用时释放它。

我在 objectinspectors OnActivate 事件中有这段代码:

  ClientActions.RegisterAction(ClientActions.actObjectInspectorNewWindow, ShowNewObject);
  • ClientActions 是包含操作的单元。
  • RegisterAction 是一种将事件与动作连接起来的方法。
  • actObjectInspectorNewWindow 是实际操作。
  • ShowNewObject 是执行操作时应调用的事件。

因此,对于每个模块和无模式对话框,上述方法都会注册一些操作。当 2 个操作共享相同的快捷方式时,问题就出现了。似乎首先注册的操作获胜并在用户按下快捷方式时执行。我更喜欢执行使用该快捷方式注册操作的最后一个操作。

如何才能做到这一点 ?

问候

4

2 回答 2

3

如果动作在同一个 TActionList 中,则必须将 scNone 分配给要禁用的动作,然后将快捷方式分配给新动作。前任:

acEditCopy.Enabled:=False;
acEditCopy.ShortCut:=scNone;

acShowCalculator.Enabled:=True;
acShowCalculator.ShortCut:=ShortCut(Ord('C'), [ssCtrl])

这样,检查按下的键是否对应于 ActionList 中的快捷方式的代码在找到分配的第一个 Shourcut 时不会中断。我希望这可以帮助你,这件事大约一个月前让我发疯了。:-)

于 2009-10-27T15:03:20.930 回答
1

如果我正确理解您的问题,您的应用程序中有多个 TActionList。不同动作列表中的动作可以使用相同的快捷键。您想控制当一个

我这样做的方法是分配表单的 OnShortCut 事件处理程序。在该事件处理程序中,按照您希望操作列表具有的优先顺序调用 TActionList.IsShortCut()。当 TActionList.IsShortCut() 返回 True 时,将 OnShortCut 的 Handled 参数设置为 True 并退出。当 TActionList.IsShortCut() 返回 True 时,它​​将实际执行该操作。

于 2009-10-27T11:24:09.873 回答