Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Unterschied zwischen nil, FreeAndNil und Free in TForm (https://www.delphipraxis.net/179859-unterschied-zwischen-nil-freeandnil-und-free-tform.html)

michele_tedesco 7. Apr 2014 13:54

Unterschied zwischen nil, FreeAndNil und Free in TForm
 
In einer legacy Applikation habe ich an ganz vielen Orte
Delphi-Quellcode:
Form1 := nil
gesehen im
Delphi-Quellcode:
OnClose
(
Delphi-Quellcode:
Form1.FormClose
), anstellen von
Delphi-Quellcode:
Action := ca.Free
.

Was ist der Unterschied wenn ich in
Delphi-Quellcode:
FormClose
  • Delphi-Quellcode:
    Action := ca.Free
  • Delphi-Quellcode:
    Form1 := nil
  • Delphi-Quellcode:
    FreeAndNil(Form1)

aufrufe?

Sherlock 7. Apr 2014 13:59

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

mkinzler 7. Apr 2014 13:59

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Zitat:

Zitat von datasportdev (Beitrag 1254922)
In einer legacy Applikation habe ich an ganz vielen Orte
Delphi-Quellcode:
Form1 := nil
gesehen im
Delphi-Quellcode:
OnClose
(
Delphi-Quellcode:
Form1.FormClose
), anstellen von
Delphi-Quellcode:
Action := ca.Free
.

Was ist der Unterschied wenn ich in
Delphi-Quellcode:
FormClose
  • Delphi-Quellcode:
    Action := ca.Free
  • Delphi-Quellcode:
    Form1 := nil
  • Delphi-Quellcode:
    FreeAndNil(Form1)

aufrufe?

Das erste gibt beim Schließen die Formularklasse frei (.Free wird aufgerufen)
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.

Sir Rufo 7. Apr 2014 14:01

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Der Unterschied ist, dass in Delphi-Referenz durchsuchenTForm.OnClose
  • immer falsch
    Delphi-Quellcode:
    FreeAndNil( Form1 );
  • meistens falsch
    Delphi-Quellcode:
    Form1 := nil;
    , auf jeden Fall ungeschickt und die Instanz wird nicht freigegeben
  • richtig
    Delphi-Quellcode:
    Action := caFree;
ist.

Immer unter dem Gesichtspunkt, dass die Form-Instanz auch wirklich freigegeben werden soll.

Und in der Variablen
Delphi-Quellcode:
Form1
ist ja auch nicht gesichert die Instanz-Referenz zur aktuellen Instanz drin ;)

michele_tedesco 7. Apr 2014 15:00

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
SUPER! Vielen Dank :-) :thumb:

Popov 7. Apr 2014 15:20

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Vielleicht noch ein Beispiel:
Delphi-Quellcode:
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('Hallo');
  ShowMessage(IntToStr(sl.Count));

  sl.Free;

  ShowMessage(IntToStr(sl.Count));
end;
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.

Delphi-Quellcode:
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('Hallo');
  ShowMessage(IntToStr(sl.Count));

  FreeAndNil(sl);

  ShowMessage(IntToStr(sl.Count));
end;
Hier wird auch die Adresse von sl gelöscht, genilt, bzw. auf 0 gesetzt. Hier gibt es eine Fehlermeldung.

himitsu 7. Apr 2014 15:41

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Delphi-Quellcode:
Form1 := nil
macht garnichts, außer die Variable auf nil zu setzen ... die Form interessiert das aber sowas von garnicht.

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".

Dejan Vu 7. Apr 2014 18:21

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Zitat:

Zitat von Sir Rufo (Beitrag 1254926)
[*]meistens falsch
Delphi-Quellcode:
Form1 := nil;
, auf jeden Fall ungeschickt und die Instanz wird nicht freigegeben

Zitat:

Zitat von himitsu (Beitrag 1254951)
Delphi-Quellcode:
Form1 := nil
macht garnichts, außer die Variable auf nil zu setzen ...

Die Intention der Anweisung scheint nicht ganz klar zu sein: "Die Form1 ist ab jetzt ungültig und soll nicht mehr verwendet werden." Wenn ich die Instanz auf nil setze und an anderer Stelle prüfe, ob diese Instanz != nil ist (und nur dann eine bestimmte Aktion ausführe), scheint das eine durchaus einfache Möglichkeit zu sein, sicherzustellen, das nur bei einer sichtbaren/gültigen/aktiven Form bestimmte Aktionen ausgeführt werden.

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.

Sir Rufo 7. Apr 2014 18:53

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.

Dejan Vu 7. Apr 2014 22:00

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm
 
Zitat:

Zitat von Sir Rufo (Beitrag 1254959)
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.

Das ist RAD à la Delphi, mit dem so 90% der Programmierer arbeiten. Die nun alle als 'unüberlegt' und Schützen'ins eigene Knie' zu bezeichnen ist auch eine Form der Respektbekundung.

Interessant, was sich hier so tummelt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz