Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wann is Class von TObject abgeleitet (FreeAndNil) (https://www.delphipraxis.net/203827-wann-class-von-tobject-abgeleitet-freeandnil.html)

norwegen60 29. Mär 2020 19:42

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Alles klar und vielen Dank.
Meine Fragen sind ausreichend beantwortet.

DeddyH 29. Mär 2020 19:43

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Die haben bei mir den Weg von GoTo und With genommen, d.h. in meinem Wortschatz existieren sie nicht :mrgreen:

norwegen60 29. Mär 2020 19:47

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
GoTo ist klar. Aber was spricht gegen With?
Ausser dass man dann im Code nicht gleich sieht, wo das Property/Object her kommt.
Gibt es noch andere Gründe?

PS: Mein Problem ist auch gefunden. Er ist nie in die FreeAndNil-Zeile gekommen :oops:

himitsu 29. Mär 2020 23:38

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
In etwas neueren Delphis, wenn für Nextgen mit ARC kompiliert, dort gibt es Weak-Referenzen, die automatisch auf NIL gesetzt werden, wenn das Objekt freigegeben wird.

Erstmal werden beim ARC die Referenzen gezählt und das Objekt die Instanz des Objektes wird erst freigegeben, wenn alle Variablen weg sind.
Free, FreeAndNil und Destroy machen dort absolut garnichts (ja, das ist ein extrem blödes Verhalten und der Mist mit dem DisposeOf ist schwachsinn)

Jedenfalls gibt es dort das Attribut
Delphi-Quellcode:
[Weak]
, was auch extrem krank ist, denn das Attribut kann man auch bei Nicht-ARC angeben, aber es wird dort ohne Fehlermeldung einfach still und heimlich ignoriert. (ja, ich würde den Erfinder gern mal grün nd blau hauen, aber so richtig)

Delphi-Quellcode:
{$IFNDEF AUTOREFCOUNT} {MESSAGE Fatal 'du kommst hier net rein'} {$ENDIF}

var
  x, y: TObjekt;
  [Weak] z: TObjekt;

x := TObject.Create;
y := x; // diese Referenz wird gezählt
z := x; // diese Weak-Referenz wird nicht gezählt und automatisch NIL
if z = nil then ; // nee

x := nil; // das automatische x.Free, aber da Y noch existiert
y := nil; // jetzt wirklich das automatische Free und Z wird genilt
if z = nil then ; // jupp, ist auch weg


Im Prinzip bekommt die Objektinstanz hier eine Adress-Liste wo alle Weak-Referenzen liegen und beim Destroy werden sie auf NIL gesetzt.



Bei ARC muß man extrem aufpassen keine Kreisreferenzen zu bekommen
Delphi-Quellcode:
type
  TChild = class;

  TOwner = class
    FChild: TChild; // oder gat viele Childs
  end;

  TChild = class
    [Weak] FTOwner: TOwner;
  end;
Ohne WEAK würden im ARC sich die beiden Instanzen gegenseitig halten, selbst wenn es extren keine Referenzen/Variablen mehr gibt.
Im Prinzip arbeiten alle Objekte dort wie Interfaces.

Jasocul 30. Mär 2020 07:43

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von norwegen60 (Beitrag 1460772)
Aber was spricht gegen With?

1. Versuche mal, solche Stellen zu debuggen.
2. Manchmal soll es auch vorkommen, dass der Compiler da was verwechselt.

Da ich with aus dem ersten Grunde schon nicht verwende, habe ich keine praktischen Erfahrungen mit dem zweiten Phänomen.

Uwe Raabe 30. Mär 2020 09:50

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von Jasocul (Beitrag 1460783)
2. Manchmal soll es auch vorkommen, dass der Compiler da was verwechselt.

Das wird dann wohl eher der Entwickler sein.

himitsu 30. Mär 2020 12:01

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von Jasocul (Beitrag 1460783)
2. Manchmal soll es auch vorkommen, dass der Compiler da was verwechselt.

Jo, der Entwickler, bzw. das arme Schwein, was später das mal lesen soll.

Zitat:

Zitat von Jasocul (Beitrag 1460783)
Zitat:

Zitat von norwegen60 (Beitrag 1460772)
Aber was spricht gegen With?

1. Versuche mal, solche Stellen zu debuggen.

Erstmal das und dann das beste Beispiel
Delphi-Quellcode:
var R: TRect;

with R do
  {Self.}Width := {R.}Right - {R.}Left; // was der Entwickler sich dachte und wie es früher war
 
{with R do}
  R.Width := R.Right - R.Left; // Was Delphi jetzt macht, seitem TRect mit einem Helper verbessert wurde
 
{Self.}Width := R.Width; // und was man jetzt auch machen kann

dummzeuch 30. Mär 2020 12:38

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von DeddyH (Beitrag 1460771)
Die haben bei mir den Weg von GoTo und With genommen, d.h. in meinem Wortschatz existieren sie nicht :mrgreen:

With ist böse, klar, aber was spricht gegen Goto?

SCNR ;-)

uligerhardt 30. Mär 2020 13:22

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Zitat:

Zitat von dummzeuch (Beitrag 1460769)
Wow, die guten alten Turbo-Pascal Objekte sind inzwischen offiziell dokumentiert? Ich dachte, die hätten schon seit 20 Jahren den Status "der Compiler unterstützt sie noch, aber wenn Du ein Problem hast, hast Du halt Pech gehabt". Manchmal wären die echt noch praktisch, aber ich traue mich nicht, sie einzusetzen.

So aus Neugier: Wofür würdest du sie denn nutzen? Nach meiner Erfahrung kann man alles, was man mit old-style-objects machen kann, auch mit Records mit Methoden erledigen, oder class-Typen sind eh die bessere Wahl. Ausnahmen wären vielleicht polymorphe Objekte auf dem Stack oder so?

himitsu 30. Mär 2020 13:27

AW: Wann is Class von TObject abgeleitet (FreeAndNil)
 
Nichts?
IF ist ein oder zwei versteckte GOTO, CASE ist mehrere GOTO, WHILE und REPEAT sind GOTO, ... (bzw. alle sind JUMPs)

Und WITH ist auch nur eine unsichtbare temporäre Variable, der man leider nicht ansieht, wo die nun alles dranhängt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr.
Seite 2 von 3     12 3      

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