6

我有一个带有主表单的应用程序。在这个表单中,我放置了三个 TActionMainMenuBar,因为应用程序本质上以三种不同的模式运行。

菜单栏都是由存储(代理)在主窗体上的 TActionManager 中的操作构成的。ActionManager 实际上引用了各种其他表单上的操作列表。

然后显示+启用和隐藏+禁用菜单栏,这样一次只有一个可见。这很好用,如果单击或使用 ALT 导航,然后使用箭头键或标题中带下划线的字符,则操作会运行。

然而问题是这些动作似乎没有响应任何快捷键的按下。

有谁知道是什么导致动作不触发?

如果需要,我很乐意提供更多信息,我正在使用 WinXP SP3 中的 C++Builder 2007 RAD Studio 进行编程。

感谢任何阅读此内容,甚至阅读此内容并提出解决方案的人!

彼得MJ

更新:我没有说明不同菜单中的快捷方式重叠,因为相同的快捷方式在不同的菜单中用于不同的操作,但所有快捷方式在自己的菜单中都是唯一的。

此后,我还简化了测试应用程序中的问题,使用两个 TActionMainMenuBar,所有操作共享一个操作管理器。在这种情况下,我有两个具有相同快捷方式的操作。它们被放置在不同的菜单上。然后一次启用一个菜单。在这种情况下,快捷方式确实有效,但是当使用通用快捷方式时,即使禁用了保持菜单,也只会触发第一个菜单中的操作。

这比我的实际问题略好,因为某些动作确实会触发,但突出显示这些动作没有被正确触发。有没有人没有解决方案?

4

2 回答 2

4

ActioneMenuBar 的启用/禁用或显示/隐藏对菜单栏上的操作没有任何影响。如果要使某些操作在特定上下文/情况下不可用,则需要实现操作本身或其所属的操作列表或操作管理器的“OnUpdate”事件。

例如,使用操作管理器的以下 OnUpdate 事件,您可以使用 TCheckBox 来决定当前激活了两个操作中的哪一个。

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action2.Enabled:= True;
  end
  else
  begin
    Action1.Enabled:= True;
    Action2.Enabled:= False;
  end;

想象一下,两个动作都分配了快捷键“Ctrl+A”,这意味着按下 Ctrl+A 只会在未选中 CheckBox1 时激活 Action1。

但是,仍然存在一个问题。一旦在当前表单的动作管理器或动作列表中找到具有快捷方式的动作,VCL 将停止查找具有特定快捷方式的动作,即使找到的动作未启用。

要解决此问题,您可以使用 OnUpdate 事件动态设置和重置操作的 ShortCut 属性,如下所示:

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action1.ShortCut:= scNone;

    Action2.Enabled:= True;
    Action2.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end
  else
  begin
    Action2.Enabled:= False;
    Action2.ShortCut:= scNone;

    Action1.Enabled:= True;
    Action1.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end;

使用此代码,如果选中 CheckBox1,则按 Ctrl+A 将激活 Action2,如果未选中 CheckBox1,则将激活 Action1。您不需要显式调用操作列表或操作管理器的 OnUpdate 事件。当应用程序空闲并等待用户输入时,会定期触发该事件。

于 2009-05-04T20:13:14.790 回答
0

确保您要使用的操作已实际启用。
如果在禁用栏时禁用 ActionMainMenuBar 中的每个操作,那么您就有问题了。
还要确保使用可用的快捷方式,而不是与 Windows 全局快捷方式冲突。
除此之外,我不明白为什么它不起作用。我在 Delphi 中尝试了 2 个 ActionMainMenuBars 并且快捷方式有效。

于 2008-11-06T22:20:03.917 回答