Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   OnCloseQuery in einer MDI-Anwendung (https://www.delphipraxis.net/158344-onclosequery-einer-mdi-anwendung.html)

Codehunter 14. Feb 2011 12:41

OnCloseQuery in einer MDI-Anwendung
 
In einer MDI-Anwendung werfen ja zuerst alle geöffneten MDI-Childs ihr eigenes OnCloseQuery-Event bevor das OnCloseQuery-Event vom MDI-Parent ausgelöst wird.

Das Problem an der Sache: Haben mehrere der MDI-Childs intern den Status "Verändert und ungespeichert", so erzeugt jedes Child ein neues "Willste mich nicht lieber speichern?"-Fenster da das im OnCloseQuery so angelegt ist. Ich möchte es aber etwas differenzieren:

Wird nur ein ungespeichertes MDI-Child geschlossen, so soll nur gefragt werden ob diese eine Datei gespeichert werden soll. Wird aber die ganze Anwendung geschlossen, so soll ein anderes Fenster erscheinen, worin alle ungespeicherten Dateien (sprich MDI-Childs) aufgelistet und auswählbar sind. Bei letzterer Variante ist natürlich nicht nötig, dass jedes Child seinen eigenen, im OnCloseQuery-Eventhandler angelegten Nachfragedialog öffnet.

Gibt es eine Möglichkeit, innerhalb eines MDI-Child abzufragen, ob die Close-Anforderung nur das eine Child betrifft oder die gesamte Anwendung? Sprich: Hat der User auf das X vom Child geklickt oder auf das X der Anwendung?

EDIT: Ich habe eine halbwegs praktikable Lösung gefunden. Im WndProc des Hauptformulars fange ich WM_CLOSE ab. MainForm.WndProc wird zum Glück vor den Close-Prozeduren der MDI-Childs aufgerufen. Dadurch kann ich eine anwendungsglobale Variable setzen und im OnCloseQuery der MDI-Childs abfragen.

s.h.a.r.k 14. Feb 2011 16:54

AW: OnCloseQuery in einer MDI-Anwendung
 
Ich würde von vorn herein davon ausgehen, dass die MDI-Childs nichts über das Parent wissen, sondern lediglich eine Schnittstelle anbieten, um "anderen" die Möglichkeit zu bieten, zu erfahren, ob Änderungen im MDI-Child vorgenommen wurden -- eine Property bietet sich hier wunderbar an. Daraus folgt, dass ich alle "Wollen Sie die Änderungen speichern?"-Dialoge in das Parent-Window legen würde. Du kannst beim Erzeugen eines MDI-Childs ja folgendes machen:
Delphi-Quellcode:
procedure TParentForm.CreateChild();
var
  mdi : TMdiChild;
begin
  // Self = ParentWindow
  mdi := TMdiChild.Create(Self);
  mdi.OnCloseQuery := Self.OnMdiChildCloseQuery;
end;

procedure TParentForm.OnMdiChildCloseQuery(Sender: TObject);
begin
  if (TMdiChild(Sender).Changed) then
  begin
    { Abfrage, ob Änderungen des MDI-Childs gespeichert werden sollen }
  end;
end;

procedure TParentForm.OnCloseQuery();
var
  i : Integer;
  Changed : Boolean;
begin
  { Prüfen, ob irgendein MDI-Child geändert würde }
  Changed := False;
  for i := 0 to Self.MDIChildCount - 1 do
  begin
    if (TMdiChild(Self.MDIChildren[i]).Changed) then
    begin
      Changed := True;
      break;
    end;
  end;
  if (Changed) then
  begin
    // ...
  end;
end;

Codehunter 15. Feb 2011 11:53

AW: OnCloseQuery in einer MDI-Anwendung
 
Im Prinzip läuft es bei mir auch genau so. Nur dass das ParentForm in meinem Fall eben ein Property im ChildForm setzt wenn die Close-Anforderung für das ParentForm vorliegt. Hintergrund ist, dass es zwei verschiedene "Willste mich speichern?"-Dialoge gibt. Einen simplen, der sich nur auf das MDI-Child bezieht wenn es geschlossen wird und einen umfassenden, der eine Dateiliste der veränderten Dateien anzeigt. Das Problem war eben nur, im OnCloseQuery unterscheiden zu können, welche Art Close-Anforderung vorliegt. Sonst hätte man bei einem Application-weiten Close vor dem Erscheinen des umfassenden "Willste mich speichern?"-Dialoges erstnoch jede Menge Einzelnachfragen hätte wegklicken müssen.

Ich habs dann noch so weit verfeinert dass der ausführliche Speichern-Dialog nur dann erscheint wenn mehr als eine veränderte Datei vorliegt. Egal ob die Close-Anforderung nun global war oder nur auf das Child bezogen.

s.h.a.r.k 15. Feb 2011 12:45

AW: OnCloseQuery in einer MDI-Anwendung
 
So hast du das Parent und das Child aber sehr stark verzahnt. Mit meiner lösung übernimmt alles das Parent -- ich glaub sogar für diese technik gibts ein Pattern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz