gpt4 book ai didi

delphi - 如何获得在单个表单中使用多个 TActionMainMenuBar 对象的快捷方式?

转载 作者:行者123 更新时间:2023-12-03 15:01:45 34 4
gpt4 key购买 nike

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

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

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

但是问题是这些操作似乎不响应任何快捷键按下。

有谁知道什么可能导致操作不触发?

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

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

彼得MJ

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

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

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

最佳答案

启用/禁用或显示/隐藏 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”,这意味着在未选中 CheckBox1 时按 Ctrl+A 只会激活 Action1。

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

要解决此问题,您可以使用 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 事件。当应用程序空闲并等待用户输入时,会定期触发该事件。

关于delphi - 如何获得在单个表单中使用多个 TActionMainMenuBar 对象的快捷方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/268543/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com