在Delphi中可以看到子表单时,如何防止父表单中的操作执行

时间:2010-03-03 21:27:46

标签: delphi

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

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

这是使用Delphi 2010。

2 个答案:

答案 0 :(得分:1)

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

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

然后在 OnAction 操作处理程序上,将其已启用属性设置为 AllowActions 的结果;

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

if not AllowActions then Exit;

我建议在你更改这些规则的情况下制定关于何时允许函数中的操作的规则,并且因为你说多个操作可能遵循相同的规则。

答案 1 :(得分: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没有所有者,那么它不起作用,因为从活动表单到主动控件的所有者链被打破&#34;。我通常在TAction.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;