Eigentlich ist es ganz einfach was da passiert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Erzeugen einer Instanz und die Referenz wird in Form2 gespeichert
Form2 := TForm2.Create(Self);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Erzeugen einer Instanz und die Referenz wird in Form2 gespeichert
Form2 := TForm2.Create(Application);
Form2.ShowModal;
Form2.Release;
end;
Nachdem dem Aufruf von
TForm1.FormCreate
haben wir also eine Instanz-Referenz in
Form2
stehen.
Jetzt kommt der Aufruf von
TForm1.Button1Click
und es wird eine neue Instanz erzeugt, die Referenz in
Form2
gespeichert und am Ende wird die Instanz freigegeben.
Jeder Zugriff auf die Instan, deren Referenz in
Form2
steht, würde jetzt aber eine Zugriffsverletzung auslösen, denn
diese Instanz wurde ja freigegeben.
Es dümpelt zwar irgendwo noch eine Instanz von
TForm2
herum, aber wir haben ja - vorsorglich - die Referenz darauf vergessen (dann kann die auch nicht kaputt gehen)
Einen Memoryleak haben wir nicht, denn beim Beenden der Anwendung wird diese
vergessene Instanz durch die Owner-Beziehung korrekt freigegeben.
Nein, Sinn macht das ganze nicht, es sei denn, man möchte einfach nur Speicher belegen.
EDIT:
Hier mal eine kleine Erweiterung
Delphi-Quellcode:
type
TForm1 = class( TForm )
Button1 : TButton;
Button2 : TButton;
procedure FormCreate( Sender : TObject );
procedure Button1Click( Sender : TObject );
procedure Button2Click( Sender : TObject );
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
uses
Unit2;
procedure TForm1.Button1Click( Sender : TObject );
begin
Form2 := TForm2.Create( Application );
Form2.ShowModal;
Form2.Release;
end;
procedure TForm1.Button2Click( Sender : TObject );
begin
Form2.ShowModal;
end;
procedure TForm1.FormCreate( Sender : TObject );
begin
Form2 := TForm2.Create( Self );
end;
Nach dem Start einfach mal auf den Button2 klicken und wunderbar, es funktioniert.
Jetzt auf Button1 (geht auch) und dann wieder auf Button2 -> Zugriffsverletzung (wie zu erwarten)
EDIT2:
Und korrekterweise sollte das dann so aussehen:
Delphi-Quellcode:
procedure TForm1.Button3Click( Sender : TObject );
var
LForm : TForm2;
begin
// wozu einen Owner, wenn wir es eh wieder freigeben wollen?
// die Referenz in einer lokalen Variable speichern
// try..finally um die Instanz gesichert wieder freizugeben
LForm := TForm2.Create( nil );
try
LForm.ShowModal;
finally
LForm.Free;
end;
end;