Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

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

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

  Alt 26. Feb 2004, 01: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