2009-10-23 78 views
1

我有一个单位有很多的动作,一些动作有快捷方式,有些甚至有相同的快捷方式。这是因为它们属于应用程序中的不同模块,并且它们不同时处于上下文中。有没有办法用快捷方式覆盖先前注册的操作?

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

所以我想暂时覆盖当objectinspector处于活动状态时共享相同快捷方式的操作,并在停用时释放它。

我有这样的代码在objectinspectors OnActivate事件:

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

因此,对于每个模块和无模式对话框,都有上述方法注册的一些操作。当两个操作共享相同的快捷方式时,问题就来了。当用户按下快捷键时,首先注册的动作似乎取胜并执行。 我首选执行了使用该快捷方式注册动作的最后一个动作。

这怎么办?

问候

+0

可以TAction.OnUpdate事件中使用快捷键使这种冲突可以得到解决? – 2009-10-23 17:50:27

回答

1

如果我理解你的问题正确,你在你的应用程序超过一个TActionList。不同操作列表中的操作可能使用相同的快捷键。你想要的动作,当

我会做到这一点的方法是指定形式的OnShortCut事件处理程序执行控制。在该事件处理程序中,按您希望操作列表具有的优先顺序调用TActionList.IsShortCut()。当TActionList.IsShortCut()返回True时,将OnShortCut的Handled参数设置为True并退出。当TActionList.IsShortCut()返回True时,它将实际执行该操作。

+0

谢谢,我不知道有一个快捷处理器。但在我的情况下,我在单元ClientActions中有一个大的全局TActionList。所以我认为这在这种情况下不起作用。 – 2009-10-27 16:13:52

2

如果行动是在同一个TActionList,您必须分配给scNone要禁用,然后分配的快捷方式新动作的动作。例如:

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

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

通过这种方式,来检查,如果presed钥匙对应于的ActionList的快捷方式,当它发现分配第一Shourcut不破的代码。我希望这可以帮助你,这个事情在一个月前让我疯狂。 :-)

+0

嗯,但在这种情况下,它可能很难找出禁用操作。 – 2009-10-27 16:23:06

+1

你可以写类似的方法: EnableDiableShortcutsModule1(AEnabled:布尔) EnableDiableShortcutsModule2(AEnabled:布尔) EnableDiableShortcutsModuleX(AEnabled:布尔) 然后调用取决于你即将在aplication输入/负载模块的方法。传递AEnabled = true将为模块分配快捷方式以指定所需的操作,并清除所有其他类似的快捷操作,反之亦然 – 2009-10-27 16:30:58

相关问题