gpt4 book ai didi

delphi - 如何以编程方式将子菜单添加到 TActionMainMenuBar?

转载 作者:行者123 更新时间:2023-12-02 02:40:13 25 4
gpt4 key购买 nike

我一直在开发一个 VCL 程序,并且正在添加用于放置列出一组文件的“最近文件”下拉子菜单的代码。对于这个程序,我填充了 tActionManager 和 tActionMainMenuBar。在标准 tMainMenu 组件中使用 tmenuitems 之前,我已经创建了类似的菜单,在 FormCreate 事件过程中生成最近文件子菜单项的列表。但是,我不确定如何使用 Action 组件动态地进行此操作,并且还没有找到任何示例来作为模型。

任何人都可以提供一个如何完成此操作的示例

最佳答案

为了说明这一点,我创建了一个简单的应用程序,其中包含一个操作管理器作为 TActionMainToolBar,并使用标准项目“打开”、“另存为”和“退出”(无分隔符)以及一个速度按钮添加了一个简单的文件菜单。

速度按钮添加两个分隔符和一个文件操作,其 OnClick 事件如下所示...

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
iActionClientItem : TActionClientItem;
iFileAction : TCustomAction;
begin
// Edit2.Text := BaseToBase( Edit1.Text, SpinEdit1.Value , SpinEdit2.Value );
ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1), FALSE );
iActionClientItem := ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1) );
iFileAction := TCustomAction.Create( self ); // we want to put in same collection
iFileAction.Caption := 'Fred';
// etc.. to build what is wanted
iActionClientItem := ActionManager1.AddAction( iFileAction, iActionClientItem ) ;
end;

运行程序并打开文件菜单会显示三个预期条目。单击按钮后(不要执行两次 - 这是为了演示其工作原理),您将获得两个分隔符和一个带有标题“Fred”的新菜单子(monad)项。请注意,如果出现以下情况,您可能需要为其指定一个唯一的名称:您需要对其进行任何处理。

编辑

构建子菜单的方法基本相同,但有一个小技巧,即不通过操作管理器添加未使用且不可见的项目。不必以这种方式完成 - 这只是获得我们想要的东西的简单方法。

这段代码展示了如何实现这一点:

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
iActionClientItem : TActionClientItem;
iSubMenuItem : TActionClientItem;
iFileAction : TCustomAction;
iChildMenu : TActionBarItem;
begin
ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1), FALSE );
iActionClientItem := ActionManager1.AddSeparator( ActionManager1.FindItemByAction(FileExit1) );
iFileAction := TCustomAction.Create( self ); // we want to put in same collection
iFileAction.Caption := 'Fred';
// etc.. to build what is wanted
iActionClientItem := ActionManager1.AddAction( iFileAction, iActionClientItem ) ;

//*********************************
// Build sub menu (from Fred) - stage 1 add the visual element - a new action bar
iChildMenu := ActionManager1.ActionBars.Add;
iActionClientItem.ChildActionBar := iChildMenu.ActionBar;

// we add a dummy entry that we can build from.
// We could set the properties manually, but when we use the action manager
// it does that automatically, so it is easier just to set this item to not visible
// then use action manager to do the rest.
iSubMenuItem := iActionClientItem.Items.Add;
iSubMenuItem.Visible := FALSE;

// Now the real build...

iFileAction := TCustomAction.Create( self ); // we want to put in same collection
iSubmenuItem := ActionManager1.AddAction( iFileAction, iSubMenuItem );
iSubmenuItem.Caption := 'Fred 1';
// etc

iFileAction := TCustomAction.Create( self ); // we want to put in same collection
iSubmenuItem := ActionManager1.AddAction( iFileAction, iSubMenuItem );
iSubmenuItem.Caption := 'Fred 2';
// etc
end;

关于delphi - 如何以编程方式将子菜单添加到 TActionMainMenuBar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com