我有一个主窗体和一个非模态的 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 没有所有者,则它不起作用,因为从事件表单到事件控件的所有者链已“损坏”。我通常在 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;
关于delphi - 当子窗体在 Delphi 中可见时,如何防止父窗体中的操作执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375109/