2013-09-03 14 views
5

Leute, ich möchte, wenn jemand irgendein Ereignis oder eine Methode kennt, die ich abfangen kann, wenn alle MDI-Formulare geschlossen wurden.Ereignis, wenn alle MDI-Formulare geschlossen sind

Beispiel:

Ich möchte ein Ereignis in meinem Hauptformular implementieren, wo, wenn ich alle MDI-Formulare zu schließen, ein solches Ereignis ausgelöst wurde.

Dankbar, wenn jemand helfen kann.

Antwort

7

MDI Kind Formen (in der Tat jede Form), während zerstört wird, wird das Hauptformular benachrichtigen. Sie können diesen Benachrichtigungsmechanismus verwenden. Beispiel:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure Notification(AComponent: TComponent; Operation: TOperation); 
     override; 

    .. 

procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation); 
begin 
    inherited; 
    if (Operation = opRemove) and (AComponent is TForm) and 
     (TForm(AComponent).FormStyle = fsMDIChild) and 
     (MDIChildCount = 0) then begin 

    // do work 

    end; 
end; 
+0

+1 Nice! Besser als meins. ;-) – NGLN

+0

@NGLN - Danke! Dein ist jedoch mächtiger, falls du wissen musst, wann ein Kind das und das tut ... :) –

+1

NGLN, Sertac Akyus und Remy Lebeau. Danke für deine Antworten, alle exzellent. Sie sind sehr gut. Für diese Situation war der beste Code Sertac Akyuz. Ist einfacher und hat mein Problem gelöst. NGLN und Remy, ich habe deinen Code für zukünftige Situationen gespeichert. Vielen Dank. – Delphiman

4

Catch the WM_MDIDESTROY Nachricht an die MDI-Client-Fenster senden:

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    FOldClientWndProc: TFarProc; 
    procedure NewClientWndProc(var Message: TMessage); 
    end; 

... 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    if FormStyle = fsMDIForm then 
    begin 
    HandleNeeded; 
    FOldClientWndProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC)); 
    SetWindowLong(ClientHandle, GWL_WNDPROC, 
     Integer(MakeObjectInstance(NewClientWndProc))); 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(FOldClientWndProc)); 
end; 

procedure TForm1.NewClientWndProc(var Message: TMessage); 
begin 
    if Message.Msg = WM_MDIDESTROY then 
    if MDIChildCount = 1 then 
     // do work 
    with Message do 
    Result := CallWindowProc(FOldClientWndProc, ClientHandle, Msg, WParam, 
     LParam); 
end; 
2

Sie können die Mainform ein OnClose oder OnDestroy Ereignishandler erstellt es zu jedem MDI Kind zuweisen. Jedes Mal, wenn ein MDI-Client geschlossen/zerstört wird, kann der Handler prüfen, ob noch weitere untergeordnete MDI-Formulare geöffnet sind, und wenn nicht, dann tun Sie, was immer Sie tun müssen.

procedure TMainForm.ChildClosed(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 

    // the child being closed is still in the MDIChild list as it has not been freed yet... 
    if MDIChildCount = 1 then 
    begin 
    // do work 
    end; 
end; 

Oder:

const 
    APPWM_CHECK_MDI_CHILDREN = WM_APP + 1; 

procedure TMainForm.ChildDestroyed(Sender: TObject); 
begin 
    PostMessage(Handle, APPWM_CHECK_MDI_CHILDREN, 0, 0); 
end; 

procedure TMainForm.WndProc(var Message: TMessage); 
begin 
    if Message.Msg = APPWM_CHECK_MDI_CHILDREN then 
    begin 
    if MDIChildCount = 0 then 
    begin 
     // do work 
    end; 
    Exit; 
    end; 
    inherited; 
end;