我的程序在运行时创建Action Menu项,每个项的标题设置为数据库查询返回的值。
OnExecute
程序对所有项目都是相同的。
当我点击一个项目时,我想获得要在OnExecute
程序中使用的项目标题。
我尝试了以下(类似于TMenuItem
的弹出菜单):
sCaption := TActionClientItem(Sender).Caption;
但是,这总是返回一个空字符串。
我搜索了网络和Delphi帮助无济于事。我知道Caption
是一个已发布的财产,但公共财产Index
也失败了。
我认为我在这里做错了什么,但无法弄清楚是什么。
提供的信息不是那么详细,但我想你所描述的OnExecute过程是来自TActionManager中包含的TAction事件。
问题是OnExecute事件的发件人是刚刚点击它的TAction!因此,当您将TActionClientItem强制转换为发件人时
TActionClientItem(Sender)
它什么都没给你。
快速解决方案将首先创建TAction,给他们您想要的标题,然后将这些TA分配给您的TActionClientItem。他们将自动获得指定操作的标题。
actionClientItem1.Action := Action1;
然后你会得到你对事件的标题
sCaption := TAction(Sender).Caption;
为每个项目创建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是发件人。“