如何查找在运行时创建的操作菜单的参数

时间:2017-12-20 20:31:27

标签: delphi-10.1-berlin action-menu

我的程序在运行时创建操作菜单项,每个项的标题设置为数据库查询返回的值。

所有项目的OnExecute程序都相同。

当我点击某个项目时,我想获取要在OnExecute程序中使用的项目标题。

我尝试了以下内容(类似于TMenuItem的弹出式菜单):

sCaption := TActionClientItem(Sender).Caption;

但是,这总是返回一个空字符串。

我搜索过网络和Delphi帮助无济于事。我知道Caption是已发布的属性,但公共属性Index也失败。

我认为我在这里做错了什么,但无法弄清楚是什么。

2 个答案:

答案 0 :(得分:0)

提供的信息不是那么详细,但我想你所描述的OnExecute程序是来自TActionManager中包含的TAction的事件。

问题是OnExecute事件的发件人是刚刚点击它的TAction!因此,当您将TActionClientItem强制转换为发件人时

TActionClientItem(Sender)

它什么也没给你。

快速解决方案将首先创建TAction,给他们您想要的标题,然后将这些TA分配给您的TActionClientItem。他们将自动获得指定操作的标题。

actionClientItem1.Action := Action1;

然后你会得到关于事件的标题

sCaption := TAction(Sender).Caption;

答案 1 :(得分:0)

为每个项目创建一个Action的建议答案的问题是我希望对许多项目使用相同的操作(由数据库查询计数确定的数字)。然后,该操作将由标题的值修改,该值是数据库查询的每条记录的值。

但是,有人向我建议了以下答案。我测试了这个并且它有效:

"如果项目在TActionMainMenuBar组件上,那么您可以执行以下操作:

type
  TCustomActionMenuBarAccess = class(TCustomActionMenuBar);

在Action Execute中,您可以执行以下操作:

  if TCustomActionMenuBarAccess(ActionMainMenuBar1).FSelectedItem <> nil then
    ShowMessage('Selected Item: ' + TCustomActionMenuBarAccess(ActionMainMenuBar1).FSelectedItem.Caption);

其中ActionMainMenuBar1是表单上TActionMainMenuBar组件的名称。

如果项目是在工具栏上创建的,那么您可以使用TAction(发件人).ActionComponent属性,因为TAction在这些情况下是发件人。&#34;