Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Mi 07.08.13 15:48 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 08.08.13 12:32 
Ich habe das wie folgt gelöst:

MDIChild:
------------

ausblenden 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:
------------

ausblenden 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.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 08.08.13 18:04 
user profile iconBentissimo hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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.