如何防止主窗体在另一个非模态窗体上捕获TMemo中的击键?

时间:2010-04-21 05:41:35

标签: forms delphi keystroke tmemo non-modal

我有一个应用程序,可以从主窗体中打开非模态窗体。非模态形式上有一个TMemo。主窗体菜单使用“space”作为其加速器字符之一。

当非模态窗体打开并且备忘录具有焦点时,每次我尝试在非模态窗体上的备忘录中输入空格时,“空格”快捷方式的主窗体事件将触发!

我试过转动MainForm.KeyPreview:= false,而另一个表格是开放但没有骰子。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这可能是一个古老的话题,但我刚才有同样的问题并寻找合适的解决方案。你的主题出现了,但没有我想要使用的解决方案。

我的问题是:我有一个带有很多快捷方式的主表单(Backspace,Delete等)和带有编辑框的第二个表单。编辑框没有得到任何关键操作,这些操作由主窗体快捷方式处理。

我的解决方案:设置子表单OnShortCut,它将在主表单解释之前捕获快捷键:

procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := True;
  Self.DefaultHandler(Msg);
end;

这对我来说很有用,子表单捕获快捷方式并将它们作为常用密钥消息处理。编辑框可以按预期使用。

答案 1 :(得分:1)

在备忘录具有焦点时禁用主窗体上的菜单项,并在备忘录丢失时重新启用它。您可以通过TMemo.OnEnterTMemo.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和类型转换是为了防止在子表单中使用表单变量名进行硬编码。