Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bei Array mit TStrings jede TStrings einzeln freigeben?


Frankieboy - So 02.08.09 10:22
Titel: Bei Array mit TStrings jede TStrings einzeln freigeben?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TGroessen = record
    Groesse: Int64;
    Dateien: TStrings;

var
  Liste2: Array of TGroessen;


Hallo,

ich habe ein dynamisches Array wie oben. Wenn ich jetzt eine Länge von ca. 500 des Arrays habe, mit 500 initialisierten TSTrings (Varibale Dateien) und ein String oder mehr pro Dateien, reicht es dann, mit setlength(Liste2,0) das Array zu löschen, oder sollte ich vorher jede einzelne Stringlist mit Dateien.Free freigeben?

Danke für die Hilfe,

Frank


jaenicke - So 02.08.09 10:25

Da musst du alles manuell freigeben.

Alternativ nimm einfach für die Dateiliste statt einem dynamischen Array eine TObjectList mit OwnsObjects auf True, dann musst du dich nicht darum kümmern, egal ob die Liste freigegeben wird oder einzelne Einträge gelöscht werden. :idea:
Und statt einem Record eine Klasse, mit Konstruktor und Destruktur. Dann musst du dich da nicht um alles einzeln kümmern.


Xentar - So 02.08.09 14:41

Man sollte generell nicht mit TStrings arbeiten, da diese nur abstrakte Methoden enthält, sondern mit TStringList.


jaenicke - So 02.08.09 15:52

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Man sollte generell nicht mit TStrings arbeiten, da diese nur abstrakte Methoden enthält, sondern mit TStringList.
Es ging bei der Aussage vermutlich um die Variablendeklaration, denn sonst würde es ja auch gar nicht funktionieren. Und diese sollten in der Tat als TStrings deklariert werden und nur eine TStringList hineingelegt werden.


Xentar - So 02.08.09 15:59

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und diese sollten in der Tat als TStrings deklariert werden und nur eine TStringList hineingelegt werden.

Hm? Warum das?
Ich hab zwar schon gesehen, dass in Funktionen die Parameter vom Typ TStrings sind, aber die ganze Variable von diesem Typ..?


jaenicke - So 02.08.09 16:05

Weil man dann auch andere TStrings reinpacken kann, je nach Wunsch. Denn diese Deklarationen sind ja nur die Basis, und später soll es ja vielleicht eine THashedStringList oder MemoX.Lines oder ähnliches sein (was da zugewiesen wird). Wenn man so etwas jetzt als TStringList deklariert, müsste man hinterher den kompletten Quelltext (von ggf. anderen Teammitgliedern) ändern...

Deshalb sollte man direkt immer TStrings als Variablen-/Feld-/Propertytyp benutzen und beim Erzeugen der Objekte den speziellen Typ benutzen.