![]() |
Unterschied zwischen nil, FreeAndNil und Free in TForm
In einer legacy Applikation habe ich an ganz vielen Orte
Delphi-Quellcode:
gesehen im
Form1 := nil
Delphi-Quellcode:
(
OnClose
Delphi-Quellcode:
), anstellen von
Form1.FormClose
Delphi-Quellcode:
.
Action := ca.Free
Was ist der Unterschied wenn ich in
Delphi-Quellcode:
FormClose
aufrufe? |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
In der alten Application (alte Delphiversion) gabs eventuell die Action noch nicht.
Grundsätzlich sollte ein .Free ja reichen. nil setzen manche, weil sie zur Laufzeit auf nil abfragen wollen...um zu vermeiden, ein fregegebenes oder noch nciht erzeugtes Objekt zu benutzen. Aber vom Prinzip her reicht Free vollkommen aus. Sherlock |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Zitat:
Das 2. setzt nur die Vraible auf Nil, ohne die Instant freizugeben, diese existiert weiterhin. Das 3. gibt die Instanz freu und setzt die Referenzvariable zurück. |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Der Unterschied ist, dass in
![]()
Immer unter dem Gesichtspunkt, dass die Form-Instanz auch wirklich freigegeben werden soll. Und in der Variablen
Delphi-Quellcode:
ist ja auch nicht gesichert die Instanz-Referenz zur aktuellen Instanz drin ;)
Form1
|
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
SUPER! Vielen Dank :-) :thumb:
|
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Vielleicht noch ein Beispiel:
Delphi-Quellcode:
Hier gibt es u. U. keine Fehlermeldung, obwohl das Objekt freigegeben wurde, bzw. es wurde nur das Objekt freigegeben, ohne jedoch die Adresse zu löschen. U.U. hat sl also noch die alte Adresse und die zeigt ins Nichts und das Programm funktioniert mit Fehler, liefert also falsche Daten.
var
sl: TStringList; begin sl := TStringList.Create; sl.Add('Hallo'); ShowMessage(IntToStr(sl.Count)); sl.Free; ShowMessage(IntToStr(sl.Count)); end;
Delphi-Quellcode:
Hier wird auch die Adresse von sl gelöscht, genilt, bzw. auf 0 gesetzt. Hier gibt es eine Fehlermeldung.
var
sl: TStringList; begin sl := TStringList.Create; sl.Add('Hallo'); ShowMessage(IntToStr(sl.Count)); FreeAndNil(sl); ShowMessage(IntToStr(sl.Count)); end; |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Delphi-Quellcode:
macht garnichts, außer die Variable auf nil zu setzen ... die Form interessiert das aber sowas von garnicht.
Form1 := nil
Wofür es aber hilft, wenn man irgendwo noch auf Form1 zugreift, nachdem die Form schon freigegeben wurde ... dann bekommt man verständlichere Exceptions mit "Zugriffsverletzung bei Adresse 0". |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Zitat:
Zitat:
Also "ungeschickt", "meistens falsch" oder "macht gar nichts" ist vielleicht ein wenig unüberlegt. Wäre natürlich auch denkbar, das der ursprüngliche Programmierer wirklich keinen blassen Schimmer hatte. |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Das Benutzen der globalen Variablen für die Forms ist unüberlegt.
Das Benutzen der globalen Variablen für diese Formklasse gleicht einem Schuss ins eigene Knie. |
AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
Zitat:
Interessant, was sich hier so tummelt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz