2

我正在使用以下方法在运行时创建一个带有 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;

如果列表中已经有一个项目,这可以正常工作,但如果没有,则根本不起作用

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

在此处输入图像描述 在此处输入图像描述

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

在此处输入图像描述

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

德尔福 2005

4

2 回答 2

2

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

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

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;
于 2011-11-09T19:33:48.163 回答
0

如果您创建“上下文”类型的操作客户端,则不必更改按钮类型。当您右键单击按钮时,菜单将下拉。

于 2016-10-29T05:53:43.523 回答