如何在运行时向操作项添加下拉菜单

时间:2011-11-09 17:13:00

标签: delphi menu runtime taction

我正在使用以下方法在运行时创建一个带Action的ActionClient。

procedure TMainForm.AddToProjectHistory(Path: string);
var
    NewOption: TAction;
    ActionClient: TActionClientItem;
begin
    NewOption := TAction.Create(self);
    NewOption.ActionList := ActionManager1;
    NewOption.Caption := Path;
    NewOption.OnExecute := ProjectHistoryExecute;
    ActionClient := TActionClientItem(aToolBarFile.ActionClient.Items[0].Items.Add);
    ActionClient.Action := NewOption;
    ActionClient.Caption := Path;
end;

如果列表中已有项目,则此工作正常,但如果没有

则根本不起作用

e.g。如果我在设计时添加一个项目,那么我可以在运行时添加更多项目

enter image description here enter image description here

但是如果我在设计时没有添加任何内容,则没有下拉显示项目列表,添加项目后不会显示下拉列表。

enter image description here

这不必使用Actions,但菜单系统的其余部分使用操作,我认为我不能将标准的MenuItem添加到操作下拉列表中。

Delphi 2005

2 个答案:

答案 0 :(得分:2)

VCL会自动创建一种类型的按钮控件,该控件取决于该项是否具有子元素。默认情况下(并且取决于ActionManager的样式设置),对于具有子项的ActionClientItem,将创建TXPStyleDropDownBtn按钮,对于无子动作的ActionClientItem,将创建TXPStyleButton

因此,当在运行时添加第一个子项时,该按钮的类型错误。更改该按钮的类型将需要销毁当前按钮以及新按钮的完整和手动实例化。这应该是可能的,但还没试过,因为:

最简单的解决方案是通过在设计时添加子项来欺骗VCL,并在表单创建时删除该项:

procedure TForm1.FormCreate(Sender: TObject);
begin
  aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;

答案 1 :(得分:0)

如果你创建一个类型为" context"的动作客户端,则不必更改按钮类型。当您右键单击按钮时,菜单将会下拉。