【问题标题】:How to prevent action in parent form executing when child form is visible in Delphi当子窗体在 Delphi 中可见时,如何防止父窗体中的操作执行
【发布时间】:2010-03-03 21:27:45
【问题描述】:

我有一个主窗体和一个非模态的浮动子窗体。主窗体有一个名为 DeleteAction 的 TAction,它的快捷方式是 Delete。当浮动窗体可见并按下 Delete 时,将执行主窗体的 DeleteAction。

如何防止快捷方式通过子表单传递给父表单?我可以验证子表单在 Delete 操作的 OnExecute 处理程序或操作 ActionManager 的 OnUpdate 处理程序中没有焦点,但我还有许多其他操作,并且也必须为它们复制此解决方案。我还有其他可以看到的浮动表单。

这是使用 Delphi 2010。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    这是我使用的解决方案:

    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;
    

    【讨论】:

      【解决方案2】:

      检查焦点不起作用,因为在父表单上按 Delete 会导致父表单获得焦点。

      function AllowActions: Boolean;
      begin
        Result := not ChildFloatingForm.Visible;
      end;
      

      然后在动作 OnAction 事件处理程序上,将其 Enabled 属性设置为 AllowActions 的结果;

      您还可以将以下行添加到该操作的 OnExecute 事件处理程序:

      if not AllowActions then Exit;
      

      我建议将有关何时允许操作的规则放在函数中,以防您更改这些规则,因为您说过多个操作可能遵循相同的规则。

      【讨论】:

      • 我害怕那个。也许应该有一个 Action 的属性,比如“ParentRequireFocus”或者当它被触发时可以控制的东西。
      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2015-05-02
      相关资源
      最近更新 更多