Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - MDIForm reagiert auf letztes MDIChild
Jakane - Mi 07.08.13 15:48
Titel: MDIForm reagiert auf letztes MDIChild
Hallo liebe Delphi-Helfer :)
Ich möchte in meinem Programm, auf meinem Hauptformular meine Datenbank-Verbindung schließen,
sobald das letzte MDIChild-Fenster geschlossen wurde (Transaktionen abschliessen und Commiten).
Da mehrere MDIs offen sein können, und ich sehr viele MDIs habe, möchte ich das nicht in die MDI-OnClose-Ereignisse reinpacken.
Ich könnte das über einen Timer machen, der alle x Zeit prüft, ob noch MDIs aktiv sind,
aber ich hoffe das jemand etwas eleganteres weiss.
Freue mich auf Vorschläge :)
jaenicke - Mi 07.08.13 17:18
Am sinnvollsten dürfte ein gemeinsamer Vorfahr für alle deine Formulare sein. Dann kannst du dort DoClose überschreiben:
Delphi-Quelltext
1:
| procedure DoClose(var Action: TCloseAction); override; |
Irgendwie musst du die Formulare aber bereits verwalten, oder laufen die einfach so vor sich hin?
Bentissimo - Do 08.08.13 12:32
Ich habe das wie folgt gelöst:
MDIChild:
------------
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| const WM_MDI_CHILD_CLOSE = WM_USER + 777;
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;
procedure TMDIChild.FormDestroy(Sender: TObject); begin PostMessage(Application.MainFormHandle, WM_MDI_CHILD_CLOSE, 0, 0); end; |
MDIForm:
------------
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| protected procedure TMDIForm.WMMDIChildClose(var Msg: TMessage); message WM_MDI_CHILD_CLOSE;
procedure TMDIForm.WMMDIChildClose(var Msg: TMessage); begin if MDIChildCount = 0 then TheDatabase.Disconnect; end; |
TheDatabase ist bei mir eine eigene Klasse, die die Kommunikation mit der tatsächlichen Datenbank übernimmt (z.B. FireBird über UniDAC).
Viele Grüsse.
Delete - Do 08.08.13 18:04
Bentissimo hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| protected procedure TMDIForm.WMMDIChildClose(var Msg: TMessage); message WM_MDI_CHILD_CLOSE;
procedure TMDIForm.WMMDIChildClose(var Msg: TMessage); begin if MDIChildCount = 0 then TheDatabase.Disconnect; end; | |
Kann es sein, daß zum Zeitpunkt, wen du MDIChildCount auf 0 prüfst, das letzt MDIChild noch existiert? Wenn ja, solltest du vielleicht auf 1 prüfen ... :roll:
jaenicke - Do 08.08.13 23:00
Da er PostMessage und nicht SendMessage benutzt, bezweifle ich, dass es da noch existiert. ;-)
Da SendMessage auf die Verarbeitung wartet, wäre das hier auch nicht günstig.
Bentissimo - Fr 09.08.13 09:53
In der Tat gab es das Problem mit SendMessage. Ebenso, als ich das Versenden der Message direkt in FormClose eingebaut hatte.
In der aktuellen Form funktioniert es einwandfrei.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!