AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt?
Thema durchsuchen
Ansicht
Themen-Optionen

prüfen, ob dyn. zur Runtime erzeugte Form Speicher freigibt?

Ein Thema von Hansa · begonnen am 25. Feb 2004 · letzter Beitrag vom 26. Feb 2004
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Re: prüfen, ob dyn. zur Runtime erzeugte Form Speicher freig

  Alt 26. Feb 2004, 00:30
Ich noch mal. Also kucken wir mal:
Delphi-Quellcode:
var
  NewFormModal, NewFormNotModal: TForm;

procedure TForm1.Button1Click(Sender: TObject);
begin
  NewFormModal := TForm2.Create(self);
  try
    NewFormModal.ShowModal;
  finally
    FreeAndNil(NewFormModal);
  end;
end;
Hier wird der Speicher von Form2 bestimmt wieder freigegeben.

Anders sieht es hier aus:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  NewFormNotModal := TForm2.Create(self);
  NewFormNotModal.Show;
end;
Jetzt ist die Frage, ob das Close in Form zwei die Form auch wieder aus dem Speicher schmeißt.

Testen wir das mal:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  if not Assigned(NewFormNotModal) then
  begin
    NewFormNotModal := TForm2.Create(self);
    NewFormNotModal.Show;
  end;
end;
Form2 wird hier nur erzeugt, wenn die Objektvariable nicht nil ist. Folglich kann man die neue Form auch nur einmal erzeugen. Jetzt der Test, schließt man Form2 mit Close, kann liefert Assigned immer noch true.

Daraus lassen sich jetzt zwei Schlüsse ziehen: Entweder wird der Speicher freigegeben und der Zeiger nicht auf Nil gesetzt. Was ich für unwahrscheinlich halte. Ich denke, die Borländer hätten dann auch den Zeiger genillt. Oder aber der Speicher wird nicht wieder freigegeben.

Selbst ein
Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
im OnClose der Form2 ändert nichts an obigen verhalten.

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Close;
  FreeAndNil(Unit1.NewFormNotModal);
end;
Endet mit einer AccessViolation.

So weit meine Untersuchungen. Leider bin ich zu keinem vernünftigem Ergebnisgekommen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 18:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz