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

Forms 如何防止主窗体在另一个非模态窗体上捕获TMemo中的击键?,forms,delphi,keystroke,tmemo,non-modal,Forms,Delphi,Keystroke,Tmemo,Non Modal,我有一个从主窗体打开非模式窗体的应用程序。非模态形式上有一个TMemo。主窗体菜单使用“空格”作为其加速器字符之一 当非模式窗体打开且备忘录具有焦点时,每次我尝试在非模式窗体上的备忘录中输入空格时,“空格”快捷方式的主窗体事件都会触发 我已尝试在另一个窗体打开但没有骰子时将MainForm.KeyPreview:=设置为false 有什么想法吗?在备忘录有焦点时禁用主窗体上的菜单项,并在备忘录丢失时重新启用。您可以通过TMemo.oneter和TMemo.OnExit事件执行此操作 proced

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

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

我已尝试在另一个窗体打开但没有骰子时将MainForm.KeyPreview:=设置为false


有什么想法吗?

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

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

这可能是一个老话题,但我刚才遇到了同样的问题,并搜索了合适的解决方案。你的主题提出来了,但没有我想要使用的解决方案

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

我的解决方案:将子窗体设置为shortcut,这样在主窗体解释快捷方式之前,它将捕获快捷方式,并使用:

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

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

这可能是一个老话题,但我刚才遇到了同样的问题,并搜索了合适的解决方案。你的主题提出来了,但没有我想要使用的解决方案

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

我的解决方案:将子窗体设置为shortcut,这样在主窗体解释快捷方式之前,它将捕获快捷方式,并使用:

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

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

我认为相同的主题在这里:我认为相同的主题在这里:我不喜欢你要求表单控制你的主表单。感觉像是一个紧密的耦合。问题出在关键事件的某个地方。我同意,这有点不雅观,但我只是说:MyMainForm.MenuEntry1.Enabled:=false;在OnShow事件中,和MainForm.MenuEntry1.Enabled:=true;在OnClose事件中。似乎有点效果。@普雷斯顿:我也没有。但问题是OP希望使用非模态窗体,并且仅当该非模态窗体上的特定控件处于活动状态时才禁用快捷方式。非模态窗体是唯一可以执行此操作的地方,除非您在子窗体存在的整个期间禁用快捷方式(OP说这是不需要的)。我不喜欢您要求该窗体控制您的主窗体。感觉像是一个紧密的耦合。问题出在关键事件的某个地方。我同意,这有点不雅观,但我只是说:MyMainForm.MenuEntry1.Enabled:=false;在OnShow事件中,和MainForm.MenuEntry1.Enabled:=true;在OnClose事件中。似乎有点效果。@普雷斯顿:我也没有。但问题是OP希望使用非模态窗体,并且仅当该非模态窗体上的特定控件处于活动状态时才禁用快捷方式。非模态窗体是唯一可以执行此操作的地方,除非在子窗体存在的整个期间禁用快捷方式(OP说这不是所需的)。应该补充的是,我不需要子窗体中的任何快捷方式。因此,此解决方案可能不适用于具有自己快捷方式的子窗口。应该补充的是,我不需要子窗体中的任何快捷方式。因此,此解决方案可能无法用于具有自己快捷方式的子窗口。