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.