TMenuItem 和 TActionList 快捷键之间的冲突

问题描述 投票:0回答:1

我已将应用程序从 MDI 更改为 PageControl Embedded,在它完美运行之前,如果我在表单中有一个带有快捷方式的 TActionList,则会触发 TActionList 执行事件。由于我已切换到 PageControl 选项卡下的嵌入式表单,因此会触发 TMainMenu 快捷方式。如果我将启用的 TMenuItems 设置为 false,则会触发 TActionList。我有指向主表单的表单所有者和指向选项卡的父表单。

我尝试将启用的 TMenuItems 设置为 false,我还将表单的所有者更改为主表单。我正在寻找的是,当TActionList存在时,执行快捷方式TActionList并且不触发TMenuITem,如果不存在TActionList,则触发TMenuITem快捷方式。 我尝试使用 TApplicationEvents 和 Form.Keypreview=true 的 OnShortCut 事件表单,但它仍然从主表单执行 TMenuItem。

主要表格示例:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, System.Rtti, System.TypInfo,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.ExtCtrls;

type
  TFormBaseClass = class of TForm;

  TForm1 = class(TForm)
    PageControl1: TPageControl;
    MainMenu1: TMainMenu;
    mnuFile: TMenuItem;
    mnuOptionA: TMenuItem;
    mnuOptionB: TMenuItem;
    mnuOptionC: TMenuItem;
    Panel1: TPanel;
    Button1: TButton;
    procedure mnuOptionAClick(Sender: TObject);
    procedure mnuOptionBClick(Sender: TObject);
    procedure mnuOptionCClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  tsNew : TTabSheet;
  frmForm2:TForm2;
begin

  tsNew := TTabSheet.Create(Form1);
  tsNew.PageControl := Form1.PageControl1;
  frmForm2 := TForm2.Create(Form1);
  tsNew.caption := 'New Window';
  frmForm2.Hide;
  with frmForm2 do
  begin
    Parent := tsNew;
    Top := 10;
    Left := 10;
  end;
  frmForm2.Show;
  frmForm2.Align := alClient;
end;

procedure TForm1.mnuOptionAClick(Sender: TObject);
begin
  ShowMessage('Click from TMenu Control + A');
end;

procedure TForm1.mnuOptionBClick(Sender: TObject);
begin
  ShowMessage('Click from TMenu Control + B');
end;

procedure TForm1.mnuOptionCClick(Sender: TObject);
begin
    ShowMessage('Click from TMenu Control + C');
end;

end.

儿童表格示例:

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.ToolWin, Vcl.ActnMan,
  Vcl.ActnCtrls, Vcl.ActnMenus, System.Actions, Vcl.ActnList, StdStyleActnCtrls,
  Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    ActionList1: TActionList;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    Label1: TLabel;
    procedure Action1Execute(Sender: TObject);
    procedure Action2Execute(Sender: TObject);
    procedure Action3Execute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Action1Execute(Sender: TObject);
begin
  ShowMessage('Control + B from ActionList');
end;

procedure TForm2.Action2Execute(Sender: TObject);
begin
  ShowMessage('Control + A from ActionList');
end;

procedure TForm2.Action3Execute(Sender: TObject);
begin
  ShowMessage('Control + C from ActionList');
end;

end.
delphi rtti
1个回答
0
投票

MDI客户端窗体是一个顶级窗口,它直接获取快捷方式,并将其交给ActionList。当表单的父级为 PageControl 时,快捷方式由主表单处理,主表单在询问任何 ActionList 之前优先选择自己的菜单。

您可以通过覆盖主要表单

IsShortCut
方法并编写一些代码来克服这个问题,这些代码首先检查操作列表,然后再返回菜单。对于代码,请查找原始的
IsShortCut
实现并根据您的需要进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.