這是我使用的解決方案:
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控件的popup控件沒有所有者,那麼它不起作用,因爲從活動窗體到活動控件的所有者鏈都是「斷開」的。我通常在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;
我很害怕這種情況。也許應該有像「ParentRequireFocus」這樣的Action屬性或什麼東西來控制它何時被觸發。 – 2010-03-04 18:47:39