AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Rekursives Freigeben einer TStringList // Compilerfehler

Rekursives Freigeben einer TStringList // Compilerfehler

Ein Thema von Caps · begonnen am 15. Jun 2020 · letzter Beitrag vom 16. Jun 2020
Antwort Antwort
Seite 4 von 4   « Erste     234
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
277 Beiträge
 
#31

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12:38
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

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 ^^)
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.149 Beiträge
 
Delphi 10.4 Sydney
 
#32

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:23
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Jun 2020 um 14:49 Uhr) Grund: den Code aufgeteilt (neu und alt getrennt)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.041 Beiträge
 
Delphi 10.3 Rio
 
#33

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:39
Das wird Delphi 5 aber freuen, was es plötzlich so alles kann
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.149 Beiträge
 
Delphi 10.4 Sydney
 
#34

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:43
Jupp
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf