AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form freigeben <> Memory Leak

Ein Thema von mumu · begonnen am 29. Sep 2005 · letzter Beitrag vom 21. Okt 2005
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Form freigeben <> Memory Leak

  Alt 29. Sep 2005, 21:00
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?!
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2

Re: Form freigeben <> Memory Leak

  Alt 29. Sep 2005, 21:22
Hi,
Wenn du ein Formular auf diese Weise
  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
  action := caFree; für eine automatische Freigabe bei Schließen des Fensters zu sorgen.

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Form freigeben <> Memory Leak

  Alt 30. Sep 2005, 08:49
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Form freigeben <> Memory Leak

  Alt 30. Sep 2005, 08:54
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#5

Re: Form freigeben <> Memory Leak

  Alt 21. Okt 2005, 12:51
danke hat einwandtfrei funktioniert
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:21 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