delphi - 当子窗体在 Delphi 中可见时,如何防止父窗体中的操作执行

标签 delphi

我有一个主窗体和一个非模态的 float 子窗体。主窗体有一个名为DeleteAction 的TAction,其快捷方式为Delete。当 float 窗体可见并且按下删除键时,将执行主窗体的DeleteAction。

如何防止快捷方式通过子窗体传递到父窗体?我可以验证子表单在删除操作的 OnExecute 处理程序或操作的 ActionManager 的 OnUpdate 处理程序中没有焦点,但我还有很多其他操作,也必须为它们复制此解决方案。我还有其他可见的 float 表单。

这是使用 Delphi 2010。

最佳答案

这是我使用的解决方案:

type
  TMyMainForm = class(TForm)
  ...
  public
    function IsShortCut(var Message: TWMKey): Boolean; override;
  end;

function TMyMainForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  // Work around to avoid main form stealing shortcuts from active, non-modal forms.
  if (Screen.ActiveForm <> nil) and (Screen.ActiveForm <> Self) then
    Result := Screen.ActiveForm.IsShortCut(Message)
  else
    Result := inherited;
end;

这适用于焦点控件由事件表单直接或间接拥有的所有情况。

有一种罕见的特殊情况无法通过上述方法处理。例如,如果 DevExpress TcxPopupEdit 控件的 popupcontrol 没有所有者,则它不起作用,因为从事件表单到事件控件的所有者链已“损坏”。我通常在 TAc​​tion.OnUpdate 处理程序中逐案处理:

procedure TMyMainForm.ActionSomeThingUpdate(Sender: TObject);
begin
  TAction(Sender).Enabled := (SomeThingSomeThing) and
    // Prevent action from stealing shortcut from edit fields on non-modal forms
    (Screen.ActiveForm is TWhatEverFormThisActionAppliesTo);
end;

关于delphi - 当子窗体在 Delphi 中可见时,如何防止父窗体中的操作执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375109/

相关文章:

delphi - 类应该在哪里释放其私有(private)变量?

delphi 仅调试我的源代码

delphi - Delphi 2006中调试 ‘WITH’语句的问题

delphi - 导入系统功能(windows-ntsystem.dll)以供内联汇编使用

Delphi 匿名方法 - 优点和缺点。在 Delphi 中使用闭包(匿名方法)的良好实践

c++ Excel OLE 自动化。设置整个单元格范围的值 'at once'

delphi - 很棒的 Delphi 源代码,值得阅读和学习

sql - 选择 AS 在 interbase 中不起作用

delphi - 如何实现从outlook邮件或thunderbird拖放到delphi表单?

delphi - 使用 ASM 调用对象方法 - 第 2 部分