如何以编程方式将操作添加到Delphi 2010中的操作管理器

时间:2010-11-26 08:08:01

标签: delphi delphi-2010 taction tactionmanager

我正在尝试动态添加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没有初始化?

1 个答案:

答案 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将显示的标题和图片。