我已将应用程序从 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.
MDI客户端窗体是一个顶级窗口,它直接获取快捷方式,并将其交给ActionList。当表单的父级为 PageControl 时,快捷方式由主表单处理,主表单在询问任何 ActionList 之前优先选择自己的菜单。
您可以通过覆盖主要表单
IsShortCut
方法并编写一些代码来克服这个问题,这些代码首先检查操作列表,然后再返回菜单。对于代码,请查找原始的 IsShortCut
实现并根据您的需要进行调整。