如何在单个表单中获取多个TActionMainMenuBar对象的快捷方式?

时间:2008-11-06 12:43:22

标签: delphi c++builder

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

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

然后显示菜单栏+启用并隐藏+禁用,以便一次只能看到一个菜单栏。这样做效果很好,如果点击操作或者使用ALT导航操作,然后使用箭头键或标题中带下划线的字符。

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

有谁知道可能导致行动不被解雇的原因?

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

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

PeterMJ

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

我还简化了测试应用程序中的问题,使用了两个TActionMainMenuBars,并且所有操作共享一个操作管理器。在这种情况下,我有两个具有相同快捷方式的操作。它们放在不同的菜单上。然后一次启用一个菜单。在这种情况下,快捷方式可以正常工作,但是当使用公共快捷方式时,仅触发第一个菜单中的操作,当禁用保留菜单时,甚至

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

2 个答案:

答案 0 :(得分:3)

启用/禁用或显示/隐藏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事件。当应用程序空闲并等待用户输入时,将定期触发该事件。

答案 1 :(得分:0)

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