工具栏中的主菜单无法按预期工作

时间:2015-05-02 06:43:52

标签: delphi menu toolbar

我创建了一个VCL表单应用程序,添加一个主菜单并从菜单模板中插入“MDI Frame Menu”。我运行程序并使用加速键。一切都按预期工作。

我现在添加一个工具栏,断开主菜单与表单的连接并将其链接到工具栏。我运行程序。现在只需按下相应的键即可激活菜单项,而无需按Alt键(例如,按“W”键可打开Windows菜单项。 如何让工具栏上的菜单显示为没有它的主菜单?

1 个答案:

答案 0 :(得分:0)

我为我的问题创建了一个答案(可能有更简单和更优雅的答案)。在工具栏中创建TMainMenu的步骤与表单上的TMainMenu相同:

  • 在MainForm上放置一个TMainMenu
  • 根据需要填充MainMenu
  • 在表单上放置一个ActionList
  • 确保所有菜单项都通过ActionList
  • 执行
  • 清除MainForm的菜单属性
  • 在表单上放置一个TToolbar
  • 将MainMenu分配到工具栏
  • 编写程序DeleteHotKeysOfToolbarMenu(Sender:TObject); (请参阅下面的代码段)
  • 编写ActionList.OnExecute事件的代码,如下所示
  • 将MainForm的KeyPreview属性设置为true
  • 编写MainForm.OnKeyPress事件,如下所示
  • 在MainForm的Create过程中调用DeleteHotKeysOfToolbarMenu以启动没有任何可见热键的程序
  • 就是这样

以下是代码段:

procedure TMainForm.DeleteHotKeysOfToolbarMenu(Sender: TObject);
var
   m: integer;
begin
   for m := 0 to Toolbar.ButtonCount-1 do
     Toolbar.Buttons[m].Caption := StripHotKey(Toolbar.Buttons[m].Caption);
end;

procedure TMainForm.ActionListExecute(Action: TBasicAction; var Handled: Boolean);
begin
   if Action.ActionComponent.ClassType = TMenuItem then
   DeleteHotKeysOfToolbarMenu(Self);
end;

TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   if (ssAlt in Shift) or (Key = VK_F10) then
   begin
     Toolbar.Menu := nil;
    Toolbar.Menu := MainMenu;
  end;
  if Key = VK_Escape then DeleteHotKeysOfToolbarMenu(Self);
end;