我有一个主窗体和一个非模态的浮动子窗体。主窗体有一个名为DeleteAction 的TAction,其快捷方式为Delete。当浮动窗体可见并且按下删除键时,将执行主窗体的DeleteAction。
如何防止快捷方式通过子窗体传递到父窗体?我可以验证子表单在删除操作的 OnExecute 处理程序或操作的 ActionManager 的 OnUpdate 处理程序中没有焦点,但我还有很多其他操作,也必须为它们复制此解决方案。我还有其他可见的浮动形式。
这是使用 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)