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

标签 delphi menu runtime taction

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

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

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

enter image description here enter image description here

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

enter image description here

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

德尔福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/

相关文章:

delphi - MessageBoxEx 停止更新操作

TWSDLLookup.Destroy 方法中的 Delphi XE 内存泄漏

delphi - 显示 bpl 入口点的工具?

jquery - 带有链接到页面部分的菜单滑动流畅

c++ - 为什么我看不到运行时间(纳秒)?

Python heapq 模块,对象上的 heapify 方法

delphi - 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

iphone - iOS滑动/滑动菜单,如Facebook应用程序

asp.net - 自定义菜单/上下文菜单将鼠标悬停或右键单击

swift 结构 : adding new parameters at runtime