我正在尝试动态添加actionitems,我可以添加项目,当我这样做时它会起作用:
HostActionItem := ActionManager.ActionBars[0].Items[0].Items[2];
NewItem := HostAction.Items.Add;
NewItem.Action := MyActionToPerform;
NewItem.Caption := Description;
NewItem.ImageIndex := 1;
NewItem.Tag := 13;
但是,当操作Execute方法触发时,我尝试从Sender对象获取ActionComponent,如下所示:
if (Sender is TAction) then
tag := (Sender As TAction).ActionComponent.Tag;
但ActionComponent总是为零。为什么ActionComponent没有初始化?
答案 0 :(得分:5)
简短回答:
您希望TActionClientItem
显示为ActionComponent
的{{1}}。这不会发生,因为TAction
不会从TActionClientItem
下降。
更长的回答:
我相信您正在将项目添加到菜单栏中。设计似乎是链接到菜单项的TComponent
不支持TAction
。菜单栏的项目为TActionClientItem
类型。这是一个“集合项”,而不是“组件”。因此,在调用所选项目的操作链接的Execute
方法时,菜单无法使用菜单项填充ActionComponent
参数。如果这听起来令人困惑,我想VCL来源的以下引用会清楚说明:
ActionComponent
方法:
TBasicActionLink.Execute
传递的组件在执行之前会被分配给function Execute(AComponent: TComponent = nil): Boolean; virtual;
。
如何从FAction.ActionComponent
调用:
TCustomActionMenuBar.ExecAction
对于标题中的问题,我不认为你做错了什么,除了设置FSelectedItem.ActionLink.Execute;
的{{1}}和Caption
是不必要的,因为它是ImageIndex
将显示的标题和图片。