0

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

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

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

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

sCaption := TActionClientItem(Sender).Caption;

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

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

我想我在这里做错了什么,但不知道是什么。

4

2 回答 2

0

提供的信息不是那么详细,但我猜您所描述的 OnExecute 过程是来自 TAction 的事件,该事件包含在 TAc​​tionManager 中。

问题是 OnExecute 事件的 Sender 是它刚刚被点击的 TAction!因此,当您将 TActionClientItem 投射到发件人时

TActionClientItem(Sender)

它什么也没给你。

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

actionClientItem1.Action := Action1;

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

sCaption := TAction(Sender).Caption;
于 2017-12-21T11:41:49.533 回答
0

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

但是,已向我建议以下答案。我已经对此进行了测试,并且可以正常工作:

“如果项目位于 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 是发送者。”

于 2017-12-22T04:12:10.420 回答