2017-03-03 1 views
-1

Unsere Anwendung verwendet 'MDI' (mit den meisten der in TForm Descedants behobenen Probleme). In den meisten Formularen, wenn die Daten geändert wurden, verweigert sie das Schließen (mithilfe von closequery) und fordert den Benutzer zum Speichern oder Abbrechen auf. Das funktioniert gut.Wie bekomme ich MDIMain Formular, um Anwendung zu erhalten, schließen Sie Nachricht vor mdichild Formen

Aber im Gegensatz zu anderen Menschen möchte ich dies überspringen, wenn die Anwendung stirbt. Dies könnte daran liegen, dass der Benutzer auf die X auf der MainForm geklickt hat. Ich möchte nur die Anwendung zu sterben - keine Speicherung von Daten usw.

Das Problem ist, dass die CloseQuery der MainForm nach all den mdichild Formen ausgelöst wird. Ich habe wm_close, wm_quit und sogar windproc im MainForm ausprobiert. Aber sie feuern nicht rechtzeitig.

Wenn ich eine FormcloseQuery im Mdichild bekomme ich keine Möglichkeit zu wissen, ob das Formular vom Benutzer getötet wird oder wenn es die Anwendung ist, die getötet wird.

Sicher gibt es eine einfache Möglichkeit, dies zu tun. Was habe ich verpasst?

+0

zeigen Ihnen, wie Sie damit umgehen WM_CLOSE in deiner Hauptform –

+0

@ken es ist MS, zurück compat ist König, funktioniert wie immer, flüstere es, aber meine App ist mdi ..... –

+0

@David: Ja, ich weiß. Hast du das nicht am Ende gesehen? –

Antwort

2

Die Erklärung für dieses Verhalten kann bei der Umsetzung von TCustomForm.CloseQuery, gefunden werden, die wie folgt aussieht:

function TCustomForm.CloseQuery: Boolean; 
var 
    I: Integer; 
begin 
    if FormStyle = fsMDIForm then 
    begin 
    Result := False; 
    for I := 0 to MDIChildCount - 1 do 
     if not MDIChildren[I].CloseQuery then Exit; 
    end; 
    Result := True; 
    if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result); 
end; 

Der Code ruft CloseQuery auf jedem der MDI Kinder, die feuern alle OnCloseQuery Ereignisse an den MDI Kinder und löst dann das Ereignis OnCloseQuery für das MDI-Hauptformular aus.

So können Sie die Dinge in Ihre eigenen Hände nehmen, indem Sie einfach CloseQuery in Ihrem Haupt-MDI-Formular überschreiben und Schritte unternehmen, um dieses Verhalten zu verhindern.

Zum Beispiel könnten Sie tun dies in der Hauptform:

// in the form type declaration: 
function CloseQuery: Boolean; override; 

// in the implementation section: 
function TMainForm.CloseQuery: Boolean; 
begin 
    Result := True; 
    if Assigned(OnCloseQuery) then OnCloseQuery(Self, Result); 
end; 

Oder vielleicht wie folgt aus:

function TMainForm.CloseQuery: Boolean; 
begin 
    while MDIChildCount > 0 do 
    MDIChildren[0].Free; 
    inherited; 
end; 

Oder auch:

function TMainForm.CloseQuery: Boolean; 
begin 
    Application.Halt; 
end; 
Verwandte Themen