Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Welchen Sinn macht dieser Code?

  Alt 30. Aug 2014, 14:05
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (30. Aug 2014 um 14:16 Uhr)
  Mit Zitat antworten Zitat