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, 00);
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

user profile iconBentissimo hat folgendes geschrieben Zum zitierten Posting springen:

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.