AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Unterschied zwischen nil, FreeAndNil und Free in TForm
Thema durchsuchen
Ansicht
Themen-Optionen

Unterschied zwischen nil, FreeAndNil und Free in TForm

Ein Thema von michele_tedesco · begonnen am 7. Apr 2014 · letzter Beitrag vom 14. Apr 2021
Antwort Antwort
Seite 1 von 3  1 23      
michele_tedesco

Registriert seit: 19. Mär 2014
50 Beiträge
 
#1

Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 14:54
In einer legacy Applikation habe ich an ganz vielen Orte Form1 := nil gesehen im OnClose ( Form1.FormClose ), anstellen von Action := ca.Free .

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

aufrufe?

Geändert von michele_tedesco ( 7. Apr 2014 um 14:55 Uhr) Grund: form1 korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#2

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 14:59
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 14:59
In einer legacy Applikation habe ich an ganz vielen Orte Form1 := nil gesehen im OnClose ( Form1.FormClose ), anstellen von Action := ca.Free .

Was ist der Unterschied wenn ich in FormClose
  • Action := ca.Free
  • Form1 := nil
  • 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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 15:01
Der Unterschied ist, dass in Delphi-Referenz durchsuchenTForm.OnClose
  • immer falsch FreeAndNil( Form1 );
  • meistens falsch Form1 := nil; , auf jeden Fall ungeschickt und die Instanz wird nicht freigegeben
  • richtig Action := caFree;
ist.

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

Und in der Variablen Form1 ist ja auch nicht gesichert die Instanz-Referenz zur aktuellen Instanz drin
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)
  Mit Zitat antworten Zitat
michele_tedesco

Registriert seit: 19. Mär 2014
50 Beiträge
 
#5

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 16:00
SUPER! Vielen Dank
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 16:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 16:41
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".
$2B or not $2B
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 19:21
[*]meistens falsch Form1 := nil; , auf jeden Fall ungeschickt und die Instanz wird nicht freigegeben
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 19:53
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.
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)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 23:00
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.
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