Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#2

AW: Welchen Sinn macht dieser Code?

  Alt 30. Aug 2014, 13:47
Die Sache mit dem Owner hast du aber verstanden?

Create(Self) besagt, daß hier Form1 der Owner ist und wenn Form1 freigegeben wird, dann wird dvon auch Form2 freigegeben.
Ich hoffe nur, daß hier die Variable Form2 auch eine Private der Form1 ist und nicht die Globale.

Und beim Anderen ist die Application der Owner, womit das freigegeben würde, wenn die Anwendng beendet wird.
Rein formal wäre es hier aber auch besser das Self zu übegeben, da die Form2 dort ja nur aktiv ist, solange es Form1 gibt, bzw. nur solange der Button-Klick ausgeführt wird.
Womit man das auch eigentlich nil lassen könnte, da die Form ja manuell freigegeben wird und sich "eigentlich" kein anderer um die Freigabe kümmern müsste.

Da man dort aber den Resourcenschutzblock vergessen hat, kümmert sich dann die Applikation um die Freigabe, wenn es im ShowModal knallt (Exception), was schnell passiert, wenn z.B. TForm2.Visible=True ist.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Form2: TForm2;
begin
  Form2 := TForm2.Create(Application); // Hier eigentlich besser Self, da eine Methode Dieses ja das Ding erstellt und freigibt. Oder nil, da es manuell freigegeben wird und kein Owner nötig ist.
  try
    Form2.ShowModal;
  finally
    Form2.Release; // Das ist fast sowas wie Form2.Free; nur daß beim Free die Form sofort freigegeben wird und beim Release erst später, wenn das Programm Lust dazu hat.
  end;
end;
Und auch da ist wieder der Schrott mir der globalen Variable, denn die Form wird hier nur lokal erstellt und gleich wieder freigegeben.


PS: Man kann eine Form mehrfach erstellen und gleichzeitig anzeigen.
Und gerade deswegen waren auch die bösen Kommentare zu der globalen Form2-Variable.

Im TForm1.FormCreate wird deas Fenster einmal erstellt und in Button2.Click nochmal.
Wenn man jetzt noch die automatische Erstellung im Projekt aktiv lässt, dann gibt es diese Form 2 bis 3 Mal.

Wenn jetzt noch die globale Variable Form2 für alles verwendet wird, dann rate mal welche Form darin verlinkt ist und auf was man zugreift, wenn man diese benutzt.
Tipp: Nach dem Buttonklick, steht da schrott drin, nämlich die veraltete Referenz auf die Form von dort, welche es nicht mehr gibt.


Und dann noch das TForm2.Visible:
Wenn das auf False steht dann wird die Instanz aus FormCreate nicht angezeigt, da dort das Show, bzw. Visible:=True fehlt.
Und wenn das True ist, dann wird die Instanz aus FormCreate angezeigt, aber der Aufruf im Button1Click schlägt fehlt, denn eine sichtbare Form kann nicht Modal werden,
weswegen auch der Hinweis auf den Resourcenschutzblock war, da dann die Form nicht mehr freigegeben wird. (Release wird ja nicht mehr ausgeführt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Aug 2014 um 13:58 Uhr)
  Mit Zitat antworten Zitat