代码之家  ›  专栏  ›  技术社区  ›  Leigh S

如何在Delphi2010中以编程方式向操作管理器添加操作

  •  2
  • Leigh S  · 技术社区  · 15 年前

    我正在尝试动态添加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;
    

    但是,当action Execute方法激发时,我尝试从Sender对象获取ActionComponent,如下所示:

      if (Sender is TAction) then
      tag := (Sender As TAction).ActionComponent.Tag;
    

    但是ActionComponent总是空的。为什么ActionComponent没有初始化?

    1 回复  |  直到 14 年前
        1
  •  5
  •   bluish dmajkic    13 年前

    简短回答:

    你在期待 TActionClientItem ActionComponent 一个 TAction . 从那以后就不会这样了 触觉质 不会从 TComponent .

    更长的答案:

    我想你是在把你的东西加到菜单栏上。从设计上看 触觉 链接到菜单项将不支持 动作组件 . 菜单栏的项是 TActionClientItem . 这是“集合项”,不是“组件”。因此菜单不能填写 动作组件 调用 Execute 所选项目的操作链接的方法。如果这听起来让人困惑,我想下面从VCL来源引用的话会说得很清楚:

    TBasicActionLink.Execute 方法:

    function Execute(AComponent: TComponent = nil): Boolean; virtual;
    

    传递的组件被分配给 FAction.ActionComponent 在它被执行之前。

    怎么叫它来的 TCustomActionMenuBar.ExecAction :

    FSelectedItem.ActionLink.Execute;
    

    对于标题中的问题,除了设置 Caption ImageIndex 一个 触觉质 没有必要,因为 触觉 将显示的标题和图像。