AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Beim Beenden alle MDIChilds schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Beim Beenden alle MDIChilds schließen

Ein Thema von Blechwolf · begonnen am 22. Sep 2003 · letzter Beitrag vom 29. Sep 2003
Antwort Antwort
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#1

Beim Beenden alle MDIChilds schließen

  Alt 22. Sep 2003, 12:10
Salut,
ich habe da mal folgendes Problem:
Wenn ich meine Application zu machen will, dann sollen alle MDI-Child Fenster geschloßen werden, aber nur, wenn sie alle gespeichert sind.
Ansonsten soll eine Abfrage kommen, daß die Daten nicht gespeichert sind, und ob der User fortsetzen will.
Ich habe das mal so gemacht:

Das ist der Aufruf aus der Main-Form
Delphi-Quellcode:
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   i : integer;
begin
   for i := MDIChildCount-1 downto 0 do
     self.MDIChildren[i].Close();

  if self.MDIChildCount = 0 then
     CanClose := true
  else
     CanClose := false;
end;

procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
   Application.Terminate();
end;
und so sieht das ganze in der Child-Form aus:
Delphi-Quellcode:
procedure TFrmSeries.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
   if not SaveState then
      if MessageDlg(Self.Caption+' - Data will be lost.'+#10+'Continue ?',
                            mtConfirmation,
                    [mbYes,mbNo],0) = mrYes then
       CanClose := true
    else
       CanClose := false
  else
     CanClose := true;
end;

procedure TFrmSeries.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TCGraph.FreeAllSeries();
  TCGraph.Free();
   Action := caFree;
end;
Since so well.
Was jetzt passiert ist das folgende:
Wenn ich die Child-Forms von Hand schließe, klappt alles wunderbar. Es kommt die entsprechende Abfrage, und es passiert auch das was soll, wenn ich auf Ja oder Nein klicke.
Wenn ich jetzt aber mein MainForm schließen will, dann fragt er mich die Fenster in der Reihenfolge von hinten nach Vorne ab (wie in der Schleife angegeben) und wenn ich angebe er soll das ganze löschen, dann macht der die Fenster nicht zu.
Nachdem er vorne angekommen ist, fragt er mich das ganze nochmal von vorne nach hinten, wobei es hier funktioniert, wenn ich ihm sage er soll die Daten löschen.
Das Hauptprogramm wird dann aber trotzdem nicht geschlossen.
Hat irgendjemand die zündende Idee ?

Grüße

Blechwolf
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Beim Beenden alle MDIChilds schließen

  Alt 25. Sep 2003, 14:33
Moin Blechwolf,

als erstes würde ich mal probieren

Delphi-Quellcode:
   Action := caFree;
   Application.Terminate();
aus dem Mainform Close rauszuschmeissen.
Ich habe den Verdacht, dass Delphi da durcheinander kommt, weil das schliessen des Hauptformulares, ja das beenden der Applikation und die Freigabe der Resourcen des Hauptfensters schon umfasst.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
DSeven

Registriert seit: 13. Aug 2003
114 Beiträge
 
#3

Re: Beim Beenden alle MDIChilds schließen

  Alt 25. Sep 2003, 21:29
Hallo

Hmm versthe nicht wieso du überhaupt irgend etwas im Mainform Close Query machst. Eigentlich solltest du alles dem MDIChild überlasen und dort alles unterbringen.
Die Freie Entwicklungsumgebung für PHP
Symtec Development Studio
auf http://www.nostalb.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Beim Beenden alle MDIChilds schließen

  Alt 26. Sep 2003, 00:26
Moin DSeven,

im Wesentlichen steht im OnCloseQuery des Hauptformulares, dass die MDI Children der Reihe nach geschlossen werden. Wie sollen die sich denn selber schliessen?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
DSeven

Registriert seit: 13. Aug 2003
114 Beiträge
 
#5

Re: Beim Beenden alle MDIChilds schließen

  Alt 26. Sep 2003, 13:04
Hallo

Hab es anderes gemacht. Undzwar beenden die MDIChilds sich von selbst wenn das Haupformular beendet wird. Mann muss bei den Childs in Close Event einfach Free schreiben.

Das Haupformular muss diese nicht beenden. Wieso denn auch wenn diese sich beim beeden des Hauptformulars sowieso selber schließen.
Probiers aus!!!. Anstatt hier große reden zu schwingen.

Außer natürlich er nmöchte eine "Alles schließen" funktion erstellen dann muss man es anders machen.
Die Freie Entwicklungsumgebung für PHP
Symtec Development Studio
auf http://www.nostalb.de
  Mit Zitat antworten Zitat
Benutzerbild von Sourcemaker
Sourcemaker

Registriert seit: 3. Sep 2003
Ort: Westoverledingen
264 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Beim Beenden alle MDIChilds schließen

  Alt 26. Sep 2003, 13:27
Hallo Blechwolf,

ändere den Code doch vielleicht so ab:
Delphi-Quellcode:
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   i : integer;
begin
   for i := MDIChildCount-1 downto 0 do
   begin
     if TMyForm(self.MDIChildren[i]).SaveState then
        self.MDIChildren[i].Close()
     else begin
        if TMyForm(self.MDIChildren[i]).AbbruchFrage then
          close;
        break;
     end;
  end;

  if self.MDIChildCount = 0 then
     CanClose := true
  else
     CanClose := false;
end;
Das ist nicht getestet aber ich denke das Problem liegt daran das die Schleife weiterläuft obwohl die Abfrage da ist das oder ein ähnlicher Seiteneffekt.

Mfg.

Frank
Frank
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Beim Beenden alle MDIChilds schließen

  Alt 26. Sep 2003, 17:39
Moin DSeven,

Zitat von DSeven:
Das Haupformular muss diese nicht beenden. Wieso denn auch wenn diese sich beim beeden des Hauptformulars sowieso selber schließen.
Ganz einfach, weil das Schliessen des Hauptformulares bei Blechwolfs Programm davon abhängig ist, dass alle MDIChildren geschlossen wurden. Damit bleiben alle Fenster offen:
Die MDIChildren werden automatisch geschlossen, wenn sich das Hauptformular schliesst, dieses darf sich aber erst schliessen, wenn alle MDIChildren geschlossen sind.
Da nun aber beim Druck auf X zum Beenden des Programmes erst einmal alle vorhandenen OnCloseQuery Prozeduren abgearbeitet werden, und anschliessend erst die OnClose Prozeduren, würde das Hauptformular sich nicht schliessen, da dessen OnCloseQuery Prozedur aufgerufen wird, bevor die OnClose Prozeduren der MDIChildren aufgerufen wurden, wodurch der Zähler MDIChildCount nicht gleich 0 ist.

In einem Punkt hast Du allerdings Recht: Man muss im OnClose der MDIChildren self.Free verwenden statt Action := caFree, da letzteres, aus irgendeinem Grunde, nicht die gewünschte Wirkung hat. Man behält als MDIChildCount immer 1 übrig.

Wenn man nun also die Abfrage und das Schliessen der MDIChildren in das OnCloseQuery des Hauptformulares legt

Delphi-Quellcode:
procedure TfrmMAIN.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   i : integer;
begin
   for i := MDIChildCount-1 downto 0 do begin
     if MessageDlg(MDIChildren[i].Caption+' - Data will be lost.'+#10+'Continue ?',
                            mtConfirmation,
                    [mbYes,mbNo],0) = mrYes then begin
       MDIChildren[i].Close;
     end;
   end;
  if self.MDIChildCount = 0 then
     CanClose := true
  else
     CanClose := false;
end;
und in das OnClose eines jeden MDI-Formulares

Delphi-Quellcode:
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.free;
end;
sollte es wie gewünscht funktionieren.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#8

Re: Beim Beenden alle MDIChilds schließen

  Alt 29. Sep 2003, 09:36
Salut,

erstmal vielen Dank für die kreativen Vorschläge. Ich habe letztlich eine Kombination aus Christian Seehases und Sourcemakers Lösung verwendet. Jetzt habe ich allerdings das Problem, daß ich die MDI-Fenster schließen kann, ohne das an dieser Stelle eine Abfrage erscheint, ob ich die ungespeicherten Daten sichern will.
Aber ich habe da schon eine grobe Idee, wie ich das lösen könnte. Der Tip, daß zuerst ALLE OnCloseQuery-Prozeduren abgearbeitet werden, und dann erst die OnClose-Prozeduren ist da schon ziemlich hilfreich glaube ich.

Grüße
Blechwolf
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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