1

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

谁能提供一个如何做到这一点的例子

4

1 回答 1

3

为了说明这一点,我创建了一个简单的应用程序,其中包含一个作为 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;
于 2017-11-28T11:14:48.973 回答