代码之家  ›  专栏  ›  技术社区  ›  rossmcm

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

  •  0
  • rossmcm  · 技术社区  · 15 年前

    我有一个从主窗体打开非模态窗体的应用程序。非模态窗体上有一个tmemo。主窗体菜单使用“空格”作为其加速器字符之一。

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

    我尝试在另一个窗体打开但没有骰子时将mainform.keypreview:=false。

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Kromster Satyajit    6 年前

    当备忘录有焦点时禁用主窗体上的菜单项,当备忘录丢失时重新启用。你可以从 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 排版是为了防止在子窗体中以窗体变量名硬编码。

        2
  •  2
  •   Hugie    11 年前

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

    我的问题是:我有一个有很多快捷方式的主窗体(退格键、删除等),还有一个有编辑框的第二个窗体。编辑框没有获得任何由主窗体快捷方式处理的键操作。

    我的解决方案是:将子窗体设置为快捷方式,wich将捕获快捷方式,然后使用主窗体对其进行解释:

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

    对我来说就是这样,子窗体捕获快捷方式,并将其作为公共密钥消息处理。编辑框可以按预期使用。

    推荐文章