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

问题描述 投票:0回答:2

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

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

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

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

sCaption := TActionClientItem(Sender).Caption;

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

我搜索了网络和Delphi帮助无济于事。我知道Caption是一个已发布的财产,但公共财产Index也失败了。

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

delphi-10.1-berlin action-menu
2个回答
0
投票

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

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

TActionClientItem(Sender)

它什么都没给你。

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

actionClientItem1.Action := Action1;

然后你会得到你对事件的标题

sCaption := TAction(Sender).Caption;

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(Sender).ActionComponent属性,因为在这些情况下TAction是发件人。“

© www.soinside.com 2019 - 2024. All rights reserved.