我使用以下方法在运行时创建一个带有操作的 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;
如果列表中已经有一个项目,这可以正常工作,但如果没有,则根本不起作用
例如如果我在设计时添加一个项目,那么我可以在运行时添加更多项目
但是如果我在设计时不添加任何内容,则没有下拉菜单来显示项目列表,添加项目后也不会出现下拉菜单。
这不必通过操作来完成,但菜单系统的其余部分使用操作,我不认为我可以将标准菜单项添加到操作下拉列表中。
德尔福2005
最佳答案
VCL 自动创建按钮控件,其类型取决于项目是否具有子元素。默认情况下(取决于 ActionManager 的样式设置),对于具有子项的 ActionClientItem,将创建一个 TXPStyleDropDownBtn
按钮,对于无子项的 ActionClientItem,将创建一个 TXPStyleButton
.
因此,当在运行时添加第一个子项时,按钮的类型是错误的。更改该按钮的类型将需要销毁当前按钮并完整且手动地实例化新按钮。这应该是可能的,但没有尝试过,因为:
真正最简单的解决方案是通过在设计时添加子项来欺骗 VCL,并在表单创建时删除该项:
procedure TForm1.FormCreate(Sender: TObject);
begin
aToolBarFile.ActionClient.Items[0].Items[0].Free;
end;
关于delphi - 如何在运行时向操作项添加下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8068808/