【问题标题】:How to add Submenus to TActionMainMenuBar programatically?如何以编程方式将子菜单添加到 TActionMainMenuBar?
【发布时间】:2017-11-28 02:26:15
【问题描述】:

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

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

【问题讨论】:

    标签: delphi menu tactionmanager


    【解决方案1】:

    为了说明这一点,我创建了一个简单的应用程序,其操作管理器为 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;
    

    【讨论】:

    • 感谢您的回答。我不清楚如何将“文件 1”等动作作为子菜单项添加到“打开”或“弗雷德”等另一个动作中。
    • @Ashlar - 抱歉,我现在直到明天才离开我的电脑。我会尝试扩展。
    • 它有效!非常简单的例子
    猜你喜欢
    • 2013-12-16
    • 2015-08-17
    • 1970-01-01
    • 2013-10-29
    • 2015-01-04
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多