【问题标题】:How to add a drop down menu to an Action Item at Runtime如何在运行时向操作项添加下拉菜单
【发布时间】:2011-11-09 17:13:00
【问题描述】:

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

【问题讨论】:

  • 注解:ActionClient.Caption 设置为与操作相同的值时是多余的。

标签: delphi menu runtime taction


【解决方案1】:

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

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

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

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

【讨论】:

  • 不错的主意。我会在生产代码中添加注释并将设计时项称为“Placeholder 001”或类似的东西。
  • @Warren 是的,确实需要澄清一下。
【解决方案2】:

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

【讨论】:

  • 这听起来是个不错的解决方案。请详细说明如何做到这一点。从哪个 Delphi 版本可以使用 VCL?
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多