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 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 22:59
Im Prinzip wurden diese Variablen wohl nur angelegt, damit man die anderen Forms erreichen konnte, wenn man alle Forms automatisch erstellen lässt.

Aber am Liebsten würde ich die auch abschaffen oder zumindestens anders implementieren wollen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#12

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 7. Apr 2014, 23:16
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.
Wenn es wirklich 90% der Delphi Programmierer so machen (wovon ich nicht ausgehe), dann machen es 90% der Delphi Programmierer falsch. Da gibt es, so hart es klingt, nix dran zu rütteln. Die globale Form Variable, die bei jedem Erstellen einer neuen Formklasse standardmäßig in der Unit angelegt wird, kann man getrost löschen, wenn man diese Form nicht in den Projekteinstellungen in die "Wird beim Starten automatisch erzeugt" Liste aufnimmt, denn für nix anderes ist sie da (und selbst das hätte man vor über 15 Jahren anders designen können, aber nun haben wir halt den Salat).

Mit dieser Variablen zu arbeiten ist deshalb unüberlegt, weil man sich damit verwehrt, mal mehr als eine Instanz eines solchen Forms zu haben (das soll in der Tat vorkommen).
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Apr 2014 um 23:18 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 8. Apr 2014, 06:04
Moment. Bevor Ihr Euch weiter über die Vewendung globaler Variablen auslasst, lest zuvor bitte alle (!) existierenden Threads zu diesem Thema. Wenn Ihr danach dann noch etwas substantiell Neues beizutragen habt, dann gern her damit.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#14

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 8. Apr 2014, 08:30
Ich wollte keine Diskussion über Sinn und Unsinn globaler Variablen anzetteln, sondern die korrekte Beantwortung einer Frage in den Mittelpunkt stellen: Eine Frage nach dem Unterschied zwischen drei Codezeilen sollte man mit der Erklärung des Unterschiedes der drei Codezeilen beantworten und nicht mit einem "Alles Käse". Zumindest war das mein Eindruck der Antworten.

Wenn es wirklich 90% der Delphi Programmierer so machen (wovon ich nicht ausgehe)
Wieso nicht? Der weitaus größte Teil der Programmierer in der freien Wildbahn sind nach meinen Erfahrungen (und davon hab ich leider Einiges) keine gelernten IT-ler. Sie sind froh, das es läuft. Der Code, der sich in diesem Bereich tummelt, ist schmerzgrenzenausleuchtend. Aber es ist so, man kann nicht alles um- und neuschreiben und deshalb sollte man damit leben. Und Fragen aus diesem Bereich (von den armen Programmierern, die das ausbaden müssen) entsprechend beantworten.

Ach, und das es 'falsch' ist, kann auch nicht stimmen: Etwas 'falsches' funktioniert i.A. nicht (Das ist mein Verständnis von 'falsch'). Es ist einfach nicht state-of-the-art, ebenso wie ein Verbrennungsmotor, Plastiktüten oder Schnurrbärte (oder sind die wieder In?); Trotzdem lebt man damit. Man fährt auf lange Sicht nicht gut mit diesen Dingen, denn sie sind nicht nachhaltig, beinhalten Stolperfallen, machen einem das Leben schwer usw. Wobei Schnurrbärte auch bald wieder in Mode sein werden.
  Mit Zitat antworten Zitat
michele_tedesco

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 07:39
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.
@Sir
Kannst du ein konkretes Beispiel mit dem Unterschied zwischen "globalen Variablen für die Forms" und "globalen Variablen für diese Formklasse".
Und natürlich noch ein drittes Beispiel, wo aufzeigt wie du ein Form/eine Formklasse behandelst

Danke
  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
 
#16

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 11:17
Delphi-Quellcode:
type
  TForm1 = class( TForm )
    Edit1 : TEdit;
    procedure Foo;
  end;

var
  Form1 : TForm1;

implementation

uses
  Form2Unit;

procedure TForm1.Foo;
begin
  // globale Variable für die Forms

  Form2.Show;

  // globale Variable für diese Formklasse

  Form1.Edit1.Text := 'Foo'; // Bezug auf die Instanz, die in der Variablen Form1 hinterlegt ist

  // wenn schon, dann

  Self.Edit1.Text := 'Foo'; // Bezug auf die eigene Instanz

  // oder einfach

  Edit1.Text := 'Foo'; // Bezug auf die eigene Instanz
end;
Wenn man basierend auf dem RAD Ansatz programmiert ist daran erst einmal nichts auszusetzen, leider verstehen die wenigsten diesen Ansatz, brechen die Vereinbarungen (auf die man sich mit RAD einlässt) und wundern sich warum das nicht funktioniert.

RAD-Vereinbarungen:
  • Die Form-Instanzen werden beim Start der Anwendung initialisiert und die Referenzen dazu werden in globalen Variablen gespeichert
  • Die globalen Variablen dürfen nur lesend benutzt werden
  • Diese Instanzen dürfen niemals freigegeben werden (darum kümmert sich die Anwendung selber beim Beenden)
  • Von jeder Form-Klasse darf es nur eine Instanz (die beim Start erzeugte) geben
Folgende Codeteile brechen diesen Ansatz (kein Anspruch auf Vollständigkeit):
  • Form1 := nil;
  • FreeAndNil( Form1 );
  • Form1.Free;
  • Delphi-Quellcode:
    procedure TForm1.Form1Close( Sender:TObject; var Action : TCloseAction );
    begin
      Action := caFree;
    end;
  • Delphi-Quellcode:
    procedure Foo;
    var
      LForm : TForm1;
    begin
      LForm := TForm1.Create( nil );
      try
        LForm.ShowModal;
      finally
        LForm.Free;
      end;
    end;
Wenn die Anwendung diese Vereinbarungen einhalten kann, dann spricht nichts gegen diesen Ansatz (ausser die Anforderung von morgen ...)
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 (10. Apr 2014 um 11:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 11:47
Zitat:
Bezug auf die Instanz, die in der Variablen Form1 hinterlegt ist
Besonders gut zu beobachten war es da, wo ausversehn irgendwie das FormCreate für Form1 doppelt in die DPR reingekommen ist.
Sichtbar war dabei die erste Instanz, aber in der Variable stand die zweite Instanz, weil die ja zuletzt die Variable überschrieb.

Der Benutzer schrieb also was in Instanz 1, aber via Form1-Variable war das Geschriebene ntürlich nicht vorhanden.


Oder man erstellt die Form mal dynamisch, weist aber nix der globalen Variable zu, sondern nutzt z.B. nur eine lokale Variable, oder gar blos ein WITH, weil die Form nur innerhalb einer Ereignismethode "kurz" verwendet und dann die Form sofort wieder freigegeben wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#18

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 12:07
Um ehrlich zu sein bin ich seit Tagen etwas verwirrt, weil ich nicht wirklich weiß ob ich das Problem verstehe. Geht es bei den globalen Form-Variablen um Grundlagen-Fragen, so dass ich die Frage nur an der falschen Stelle, also zu hoch ansetzte? Oder geht es hier um höhere Programmierung, ich also das Spezielle nicht erkenne?
  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
 
#19

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 13:10
Wenn es sich um eine RAD-Anwendung handelt, dann ist die Verwendung der globalen Form-Variablen erlaubt (gehören ja zum Konzept), aber nur lesend und die Instanzen müssen tabu sein (gehört ebenfalls zum Konzept).

Die Ausgangsfrage:
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?
In einer RAD-Anwendung sind alle drei Punkte falsch, denn alle verletzen die Vereinbarung, die ich mit RAD eingehe.

In einer nicht RAD-Anwendung ist der erste Punkt erlaubt aber die anderen beiden Punkte sind falsch, denn dort sind die globalen Form-Variablen absolut tabu (am besten werden die sofort gelöscht).

Es gibt auch noch so einen Mischmasch aus RAD und nicht RAD, den würde ich aber dringend empfehlen zu eliminieren. Also nur das Haupt-Formular (auch zu finden auch unter Application.MainForm ) wird zum Anwendungsstart erzeugt, alle anderen dynamisch.
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 (10. Apr 2014 um 13:12 Uhr)
  Mit Zitat antworten Zitat
michele_tedesco

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

AW: Unterschied zwischen nil, FreeAndNil und Free in TForm

  Alt 10. Apr 2014, 13:24
Danke für die super und sehr ausführliche Erklärung Sir Rufo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 02:40 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