我有一个应用程序,可以从主窗体中打开非模态窗体。非模态形式上有一个TMemo。主窗体菜单使用“space”作为其加速器字符之一。
当非模态窗体打开并且备忘录具有焦点时,每次我尝试在非模态窗体上的备忘录中输入空格时,“空格”快捷方式的主窗体事件将触发!
我试过转动MainForm.KeyPreview:= false,而另一个表格是开放但没有骰子。
有什么想法吗?
答案 0 :(得分:2)
这可能是一个古老的话题,但我刚才有同样的问题并寻找合适的解决方案。你的主题出现了,但没有我想要使用的解决方案。
我的问题是:我有一个带有很多快捷方式的主表单(Backspace,Delete等)和带有编辑框的第二个表单。编辑框没有得到任何关键操作,这些操作由主窗体快捷方式处理。
我的解决方案:设置子表单OnShortCut,它将在主表单解释之前捕获快捷键:
procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := True;
Self.DefaultHandler(Msg);
end;
这对我来说很有用,子表单捕获快捷方式并将它们作为常用密钥消息处理。编辑框可以按预期使用。
答案 1 :(得分:1)
在备忘录具有焦点时禁用主窗体上的菜单项,并在备忘录丢失时重新启用它。您可以通过TMemo.OnEnter
和TMemo.OnExit
活动执行此操作。
procedure TOtherForm.Memo1Enter(Sender: TObject);
begin
if Application.MainForm is TYourMainForm then
TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := False;
end;
procedure TOtherForm.Memo1Exit(Sender: TObject);
begin
if Application.MainForm is TYourMainForm then
TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := True;
end;
使用Application.MainForm
和类型转换是为了防止在子表单中使用表单变量名进行硬编码。