我一直在开发 VCL 程序,并正在添加代码以放置列出一组文件的“最近的文件”下拉子菜单。对于这个程序,我填充了一个 tActionManager 和一个 tActionMainMenuBar。在使用标准 tMainMenu 组件中的 tmenuitems 之前,我已经创建了类似的菜单,在 FormCreate 事件过程中生成最近文件子菜单项的列表。但是,我不确定如何使用 Action 组件动态地进行此操作,也没有找到任何示例作为模型。
谁能提供一个如何做到这一点的例子
我一直在开发 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”的新菜单子项注意,如果出现以下情况,您可能需要给它一个唯一的名称您需要对其进行任何处理。
构建子菜单的方式基本相同,但有一个小技巧,即不通过操作管理器添加未使用且不可见的项目。它不必以这种方式完成 - 它只是获得我们想要的东西的简单方法。
这段代码展示了如何实现这一点:
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;