问题描述
在 MDI VCL 应用程序中,当我显示非模态窗体时,MainForm 菜单的键盘快捷键会将焦点切换到 MainForm 并执行菜单项操作 - 这绝不是我想要的。
在早期版本的 Delphi 中,可以覆盖 MainForm 的 IsShortCut()
方法(如 answered here),但这在 Delphi 10.4.2 中不再有效。
我尝试了使用 OnShortCut
和 IsShortCut()
中的 TApplication
和 TForm
的各种排列,但没有成功。
覆盖非 MainForm 的 IsShortCut()
以对 Alt+ 键盘组合返回 true 确实可以阻止 MainForm 菜单,但它也会阻止操作表单中的本地热键,所以不是很有帮助。
现在有更好的(或任何!)方法来做到这一点吗?
解决方法
我发现当快捷方式被调用时,主窗体(或活动的 MDI 窗体)在测试快捷方式的分配之前调用容器菜单项的 OnClick
。所以对我有用的是在菜单项的容器菜单的 OnClick
处理程序中启用菜单项(例如,对于文件菜单上的项目,为文件菜单项本身设置 OnClick
事件)。例如。像这样
procedure TMyForm.FileMenuClick(Sender: TObject);
begin
MyMenu.Enabled := Screen.ActiveForm = self;
end;
MyMenu 的相应快捷方式然后不被表单处理,并且可以被活动窗口正确使用。