Delphi 如何在ActionMainMenuBar的主菜单(=类别,通过TAction子菜单)上添加OnClick事件?

Delphi 如何在ActionMainMenuBar的主菜单(=类别,通过TAction子菜单)上添加OnClick事件?,delphi,delphi-xe3,tactionmanager,Delphi,Delphi Xe3,Tactionmanager,我正在用TActionMainMenuBar替换我原来的TMainMenu,但它有一些问题 我目前正在为我的主菜单项使用“OnClick”处理程序,但我找不到一种方法来使用tractionMainMenuBar重现相同的行为 例如,我使用类别“Sample”创建了一个TAction测试,并将其拖放到TActionMainMenuBar上。我可以向子菜单“Test”的执行处理程序添加代码,因为它有一个TAction分配给它,但我不能向主菜单项“Sample”添加事件代码,因为它只是“Test”的一

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

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

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

我试图将一个操作分配给这个
tactionclientem
,但Delphi XE3说“您不能设置属性…”,当我点击它时,它会给我一个对话框“当前框架未实现的操作‘无’”


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

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

procedure TForm1.MyMainMenuItemClick(Sender: TObject);
begin
  SomeMenuItem.Enabled := SomeConditionTest;
  SomeToolButton.Enabled := SomeMenuItem.Enabled;
  AnotherMenuItem.Enabled := AnotherConditionTest;
  AnotherToolButton.Enabled := AnotherMenuItem.Enabled;
end;
对于
tractionMainMenuBar
项,您可以在
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
的时间相同。

欢迎使用StackOverflow。请花点时间将你的问题适当地格式化,并将其分成段落,而不是张贴一大堆文字。如果我们看不懂你的问题,很难回答。您可以在以所见即所得方式实时撰写文章时预览文章,方法是查看正在键入的文本区域下方,这样您就可以看到文章在发布时对我们的影响。有关格式设置的帮助,请单击文本区域右上角上方的橙色
按钮。谢谢。事实上,我使用OnClick处理程序启用或检查标记(子)菜单项,或者动态创建子菜单。您的解决方案非常适合我的需要,但“旧”OnClick方法的优点是,与特定菜单相关的所有内容都被分组在一起。@Gunter:“新”操作功能的更大优点是,与操作相关的所有内容都被分组在一起。菜单项、弹出菜单项、工具按钮和所有内容,您不必单独更新它们-您只需处理操作本身,它会自动将所有其他内容更新为相同的值。如果将图像指定给动作,则菜单项和工具栏按钮上会显示相同的图像。“一旦你习惯了,它比旧的方式有用得多。”肯:这是一个老话题,但只是插嘴,因为我刚刚遇到了同样的问题。您不能总是在操作中执行此操作,例如,“编辑”菜单可能包含剪切/复制/粘贴项,这些项取决于所显示对象的类型。它可能是一个文本编辑器,它可能是一个图表,它可能是一个示意图。因此,onclick事件需要检查当前活动的窗口类型,并询问该窗口是否选择了某些内容(以启用复制菜单)等,并且对于每个活动窗口/对象类型,这些对象可能不同。菜单下拉时,操作起来容易多了。