2010-03-03 18 views
1

我有一個主窗體和一個非模態的浮動子窗體。主窗體有一個稱爲DeleteAction的TAction,它具有Delete,因爲它是快捷方式。當浮動窗體可見並按下Delete時,主窗體的DeleteAction被執行。如何防止子窗體在Delphi中可見時執行父窗體中的操作

如何防止通過子窗體傳遞給父窗體的快捷方式?我可以驗證子表單在Delete操作的OnExecute處理程序中或操作的ActionManager的OnUpdate處理程序中沒有重點,但我有很多其他操作,並且必須爲它們複製此解決方案。我也有其他可以看到的浮動窗體。

這是用Delphi 2010

回答

1

檢查爲重點,因爲按刪除父窗體上會導致給父窗體焦點是行不通的。

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

然後在行動的OnAction事件處理程序,設置它的啓用屬性的AllowActions的結果;

您也可以在下面的行添加到該行動OnExecute事件處理程序:

if not AllowActions then Exit; 

我建議把有關何時允許操作的功能,如果你改變這些規則的規則,因爲你表示多項行動可能遵循相同的規則。

+0

我很害怕這種情況。也許應該有像「ParentRequireFocus」這樣的Action屬性或什麼東西來控制它何時被觸發。 – 2010-03-04 18:47:39

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控件的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; 
相關問題