Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Rekursives Freigeben einer TStringList // Compilerfehler (https://www.delphipraxis.net/204647-rekursives-freigeben-einer-tstringlist-compilerfehler.html)

Caps 16. Jun 2020 12:38

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Zitat:

Zitat von DeddyH (Beitrag 1467432)
Virtuelle und dynamische Methoden können überschrieben werden. Wenn eine solche Methode einer Instanz aufgerufen wird, wird die Virtual Method Table (VMT) durchlaufen, ausgehend von der Klasse der Instanz in der Hierarchie aufsteigend, bis eine Implementation gefunden wird. Die wird dann abgearbeitet. Normalerweise möchte man die Methode aber nicht komplett ersetzen, sondern nur erweitern, weswegen man dann inherited aufruft, um die nächste Implementation in den höher gelegenen Klassen auszuführen.

Ok, ich glaub das wird OT :o

Aber warum wird dann bei Objects [i].Free der Destruktor von TStringTree aufgerufen?
Woher weiß denn der Compiler, welcher Typ da drin steckt?
Also was ich meine ist: wenn ich von einer Basisklasse zwei verschiedene Klassen ableite, und dann den Destruktor der Basisklasse (TObject) aufrufe, dann kann der Compiler doch gar nicht entscheiden, welcher Typ nun wirklich an dem Zeiger dranhängt, oder bin ich völlig abwegig?
Vermutlich müsste das mal in einen anderen Thread (OOP oder so ^^)

himitsu 16. Jun 2020 13:23

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Da außen die Variable NIL werden soll, das aber beim Property "Objects" nicht geht, macht es sich mit "einer" Funktion nicht so gut.

Delphi-Quellcode:
procedure FreeStringList(const [ref] List: TStrings);
procedure Walk(Obj: TObject);
  begin
    if Obj is TStrings then
      for var Obj2 in TStrings(Obj).ToObjectArray do
        Walk(Obj2);
    Obj.Free;
  end;
begin
  // wie FreeAndNil : modern, typsicher mit CONST-REF -> https://dalijap.blogspot.com/2020/06/magic-behind-freeandnil.html
  var Temp := List;
  TObject(Pointer(@List)^) := nil;
  Walk(Temp);
end;
bzw.
Delphi-Quellcode:
procedure FreeStringList(var List{: TStrings});
procedure Walk(Obj: TObject);
  var
    i: Integer;
  begin
    if Obj is TStrings then
      for i := TStrings(Obj).Count-1 downto 0 do
        Walk(TStrings(Obj).Objects);
    Obj.Free;
  end;
var
  Temp: TStrings;
begin
  // wie FreeAndNil : alt, mit VAR im Funktionskopf
  Temp := TStrings(List);
  List := nil;
  Walk(Temp);
end;

DeddyH 16. Jun 2020 13:39

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Das wird Delphi 5 aber freuen, was es plötzlich so alles kann :stupid:

himitsu 16. Jun 2020 13:43

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Jupp :angle:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 Uhr.
Seite 4 von 4   « Erste     234   

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