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/)
-   -   Reihenfolge des Aufrufes von OnCloseQuery (https://www.delphipraxis.net/178797-reihenfolge-des-aufrufes-von-onclosequery.html)

Codehunter 28. Jan 2014 12:50

Reihenfolge des Aufrufes von OnCloseQuery
 
Hallo!

Ich habe eine VCL-Anwendung, welche neben dem Hauptformular noch mehrere Childforms offen haben kann. Jedes Childform behandelt sein eigenes OnCloseQuery selbst. Auch das Mainform behandelt sein OnCloseQuery. Bisher ist es so, dass zuerst die OnCloseQuery-Handler der Childforms aufgerufen werden, wenn der User auf Schließen im Mainform klickt und erst als letztes das OnCloseQuery des Hauptformulars. Ich bräuchte es aber genau umgekehrt oder genauer gesagt ein zusätzliches Event im Mainform, welches vorrangig behandelt wird.

Gibt es eine Windows-Message die ich abfangen könnte bevor die Ereigniskette an die Childforms weiter geht? Wichtig wäre nur, dass ich die weitere Behandlung des Ereignisses bzw. der Message unterbrechen kann.

Sinn der Sache ist folgender: In jedem der Childforms gibt es Möglichkeiten, dass der User Einstellungen ändert etc. die evtl. noch nicht gespeichert sind. Es gibt eine zentrale Verwaltung ungespeicherter Objekte. Wird explizit nur ein Childform geschlossen, dann erscheint über OnCloseQuery eine Nachfrage zum Speichern genau der Objekte, die sich auf dieses Childform beziehen. Wird das Mainform geschlossen, erscheinen demzufolge mehrere Speichern-Abfragen nacheinander, was für den User lästig ist.

Entsprechend möchte ich beim Schließen des Mainforms eine zusammengefasste Liste aller zu speichernden Objekte anzeigen, die der User gebündelt bestätigen kann.

Grüße
Cody

himitsu 28. Jan 2014 12:57

AW: Reihenfolge des Aufrufes von OnCloseQuery
 
Du hast doch den VCL-Quellcode, warum dann nicht selber nachsehen?

OnCloseQuery kennst du und kannst danach suchen.
Es findet sich das CloseQuery.
Nun könnte man nach dem CloseQuery suchen und schauen wo es aufgerufen wird.
Das ist eine Menge und nicht Alle kommen direkt über eine Windowsmessage, welche man eventuell alle abfangen müsste.

Also bleibt nur CloseQuery.
Delphi-Quellcode:
    function CloseQuery: Boolean; virtual;

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;
Tja, das ist virtual, also lässt es sich überschreiben
und wenn du noch vor die Childs willst, dann kommt dein Code halt vor das inherited. :zwinker:

Codehunter 28. Jan 2014 13:10

AW: Reihenfolge des Aufrufes von OnCloseQuery
 
Hehe... Kennst du das? Man steht aufm Schlauch und braucht länger, hier eine Frage zu formulieren statt mal fix in die VCL-Sourcen zu gucken? :oops:

himitsu 28. Jan 2014 13:15

AW: Reihenfolge des Aufrufes von OnCloseQuery
 
Joar.

Kennst du das, man tippt mühevoll eine Frage zusammen und als man grade auf Antworten klicken will, fällt es einem ein. (manchmal auch erst kurz nach dem Klick)

Codehunter 28. Jan 2014 13:22

AW: Reihenfolge des Aufrufes von OnCloseQuery
 
Zitat:

Zitat von himitsu (Beitrag 1245664)
manchmal auch erst kurz nach dem klick

Nur zu gut... Deshalb gibts hier etliche Posts von mir mit einem EDIT hintendran, wo ich die Lösung gleich nachreiche. Ich könnt das Post auch gleich wieder löschen aber vielleicht hilfts ja dann wem anders.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr.

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