【问题标题】:How to add OnClick event on main menu (=Category, via TAction submenu) on ActionMainMenuBar?如何在 ActionMainMenuBar 上的主菜单(=类别,通过 TAction 子菜单)上添加 OnClick 事件?
【发布时间】:2013-09-06 17:58:11
【问题描述】:

我正在用 TActionMainMenuBar 替换旧的 TMainMenu,但它有一些问题。

我目前正在为我的主菜单项使用“OnClick”处理程序,但我找不到使用TActionMainMenuBar 重现相同行为的方法。

例如,我创建了一个类别为“示例”的TAction“测试”,然后将其拖放到TActionMainMenuBar 上。我可以将代码添加到子菜单“Test”的执行处理程序,因为它分配了一个TAction,但我不能将事件代码添加到主菜单项“Sample”,因为它只是一个类别/ “测试”的 TActionClientItem 没有事件。

我试图为这个TActionClientItem 分配一个动作,但Delphi XE3 说“你不能设置属性...”,当我点击它时,它会给我一个对话框“当前框架没有实现的动作'无' ”。

另一种方法是两个TActions,“Sample”和“Test”以及“(无类别)”,但我不能将“Test”拖放为“Sample”的子菜单TActionMenuBar 之前。看起来我只能拖放主菜单项,而不能在空的主菜单项上拖放子菜单项。

【问题讨论】:

  • 欢迎来到 StackOverflow。请花时间正确格式化您的问题,并将其分成几段,而不是张贴一大堆文字。如果我们无法阅读您的问题,则很难回答。您可以通过查看您正在输入的文本区域下方以所见即所得的方式实时预览您的帖子,这样您就可以看到它在发布时对我们的看法。如需帮助格式化,请单击文本区域右上角上方的橙色 ? 按钮。谢谢。

标签: delphi delphi-xe3 tactionmanager


【解决方案1】:

使用主菜单项的OnClick 处理程序的目的通常是确定子菜单项是启用/禁用还是可见。它通常也是您启用/禁用执行相同功能的工具栏按钮之类的地方:

procedure TForm1.MyMainMenuItemClick(Sender: TObject);
begin
  SomeMenuItem.Enabled := SomeConditionTest;
  SomeToolButton.Enabled := SomeMenuItem.Enabled;
  AnotherMenuItem.Enabled := AnotherConditionTest;
  AnotherToolButton.Enabled := AnotherMenuItem.Enabled;
end;

对于TActionMainMenuBar 项目,您可以在OnUpdate 事件中的单个操作中执行此操作。这样做的好处是,当您启用/禁用该操作时,与该操作相关的所有控件也会同时启用/禁用。

procedure TForm1.SomeActionUpdate(Sender: TObject);
begin
  SomeAction.Enabled := SomeConditionTest;  // Also controls the toolbutton
end;

procedure TForm1.AnotherActionUpdate(Sender: TObject);
begin
  AnotherAction.Enabled := AnotherConditionTest; // Toolbutton too.
end;

在子项显示之前调用OnUpdate 事件,这与调用旧主菜单项的OnClick 的时间相同。

【讨论】:

  • 确实,我使用 OnClick 处理程序来启用或检查标记(子)菜单项,或动态创建动态子菜单。您的解决方案非常适合我的需要,但“旧” OnClick 方法的优势在于,与该特定菜单有关的所有内容都被组合在一起。
  • @Gunter:但“新”动作功能的更大优势在于与动作相关的所有内容都组合在一起。菜单项、弹出菜单项、工具按钮和所有内容,您不必单独更新它们 - 您只需处理操作本身,它自动将其他所有内容更新为相同的值。如果将图像分配给操作,则菜单项和工具栏按钮上会显示相同的图像。一旦你习惯了,它就会比旧方法有用得多。
  • @ken 老话题,但只是插话,因为我刚刚遇到了同样的问题。您不能总是在操作中执行此操作,例如,编辑菜单可能具有剪切/复制/粘贴项目,这些项目取决于所显示对象的类型。它可能是文本编辑器,可能是图表,可能是示意图。因此,onclick 事件需要检查当前处于活动状态的窗口类型并询问该窗口是否选择了某些内容(以启用复制菜单)等,并且这些对象对于每个活动窗口/对象类型可能不同。当菜单下拉时更容易做到。
猜你喜欢
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多