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/)
-   -   Delphi Form freigeben <> Memory Leak (https://www.delphipraxis.net/54215-form-freigeben-memory-leak.html)

mumu 29. Sep 2005 21:00


Form freigeben <> Memory Leak
 
also ich rufe aus Form1 heraus z.b. bei nem button click folgendes auf:

Delphi-Quellcode:
Procedure TForm1.ButtonClick(Sender: TObject);
var Form2: TTestForm;
Begin
  Form2 := TTestForm.Create(Self);
  try
    Form2.Show;
    ...
    Form2.StartProcedure;
    ...
  finally
    FreeAndNil(Form2);
  end;
end;
so, wenn jetzt in Form2 die StartProcedure beendet wurde, dann möchte ich gerne, dass das Formular jedoch noch geöffnet bleibt und erst durch einen user click beendet wird. da jedoch anschließend die zeile FreeAndNil(Form2) aufgerufen wird, terminiert sich Form2 ohne user einwirkung. soll ich jetzt das FreeAndNil rausnehmen? oder wie soll ich das sonst lösen? und entstehen durch das herausnehmen von freeandnil nicht speicherlöcher?!

Sanchez 29. Sep 2005 21:22

Re: Form freigeben <> Memory Leak
 
Hi,
Wenn du ein Formular auf diese Weise
Delphi-Quellcode:
  Form2 := TTestForm.Create(Self);
erzeugst, dann übernimmt der übergebene Parameter das Aufräumen. Bei self wirds automatisch freigegeben, wenn self freigegeben wird, bei Application wenn die Anwenung beendet wird, nur bei nil muss man sich selbst ums Aufräumen kümmern.

Zusätzlich gibts noch die Möglichkeit, im OnClose des Form durch setzen von
Delphi-Quellcode:
  action := caFree;
für eine automatische Freigabe bei Schließen des Fensters zu sorgen.

grüße, daniel

shmia 30. Sep 2005 08:49

Re: Form freigeben <> Memory Leak
 
So geht's:
Delphi-Quellcode:
Procedure TForm1.ButtonClick(Sender: TObject);
var Form2: TTestForm;
Begin
  Form2 := TTestForm.Create(nil); // nil als Owner, da wir selber freigeben
  try
    Form2.Show;
    ...
    Form2.StartProcedure;
    Form2.Hide;
    Form2.Showmodal; // nicht unbedingt elegant, aber funktioniert
    ...
  finally
    Form2.Free; // FreeAndNil ist hier unnötig, da Form2 sowieso "out of Scope" gerät
  end;
end

Bernhard Geyer 30. Sep 2005 08:54

Re: Form freigeben <> Memory Leak
 
Zitat:

Zitat von mumu
also ich rufe aus Form1 heraus z.b. bei nem button click folgendes auf:

Delphi-Quellcode:
Procedure TForm1.ButtonClick(Sender: TObject);
var Form2: TTestForm;
Begin
  Form2 := TTestForm.Create(Self);
  try
    Form2.Show;
    ...
    Form2.StartProcedure;
    ...
  finally
    FreeAndNil(Form2);
  end;
end;
so, wenn jetzt in Form2 die StartProcedure beendet wurde, dann möchte ich gerne, dass das Formular jedoch noch geöffnet bleibt und erst durch einen user click beendet wird. da jedoch anschließend die zeile FreeAndNil(Form2) aufgerufen wird, terminiert sich Form2 ohne user einwirkung. soll ich jetzt das FreeAndNil rausnehmen? oder wie soll ich das sonst lösen? und entstehen durch das herausnehmen von freeandnil nicht speicherlöcher?!

Für modale-Dialog pass folgende Vorlage:
Delphi-Quellcode:
Form := TMyForm.Create(self);
try
  Form.ShowModal;
finally
  Form.Free;
end;
Für nicht-modal angezeigte Formulare passt dies nicht:
Delphi-Quellcode:
Form := TMyForm.Create(self);
Form.Show;
Und die freigabe erfolgt i.d.R. im OnClose-Ereignis.
Eine Freigabe mittels Free ist gefährlich, da hier evtl. noch nicht alle Messages in der message-Schleife abgearbeitet sind. Form.Release sorgt dafür das alle vor der freigabe abgearbeitet werden.

mumu 21. Okt 2005 12:51

Re: Form freigeben <> Memory Leak
 
danke hat einwandtfrei funktioniert :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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