Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - create und free von Objekten


Gausi - Mi 12.03.03 22:49
Titel: create und free von Objekten
Ich hab mal wieder ein Problem bei meinem Dienstplan-Programm.

Ich habe eine TObjectlist, die ich unter gewissen Umständen leeren möchte. Problem ist folgendes: Ich kann
tobjectlist1.clear kann ich nicht benutzen, weil jedes Object in der Liste unter anderem eine weitere TObjectlist enthält, und deren Objecte dürfen dabei NICHT verlorengehen.

Wenn ich jetzt mit ne Schleife

Quelltext
1:
2:
for i:=0 to tobjectlist1.count-1 do
      objectlist1.extract(objectlist1.first)

die Liste leere, verliere ich sämtliche Referenzen auf die Objekte, d.h. ich kann sie hinterher nicht mehr explizit freigeben.
Wird das beim beenden des Programms automatisch erledigt (wäre eine unschöne Lösung), oder MUSS ich mir da was einfallen lassen? (z.B. eine Abfallliste einbauen und die am Ende clearen)


AndyB - Do 13.03.03 00:29

Wieso leerst du die Liste, wenn du sie doch nicht leeren willst? Oder sind die Items der Unterliste noch in einer anderen Liste gespeichert?

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Liste1[]
  List2[]
    Item1
    Item2
  List3[]
    Item3

AlleListe[]
  Item1
  Item2
  Item3

Wenn dem so ist, dann kannst du beim erzeugen der Unterliste dem Konstruktor den Wert False übergeben. Damit sagst du der ObjectList, dass ihr die Elemente nicht gehören und sie diese auch nicht freigeben darf.


Gausi - Do 13.03.03 12:16

genau, die items der Unterliste sind noch in einer anderen Liste, und sollen da auch bleiben. Hab das Problem jetzt durch deine Anregung gelöst bekommen (hoffe ich):
Ich hatte mir ja extra einen Destructor für die Items in der Liste geschrieben, in dem ich die Unterliste mit zerstöre. (Das war zu einem früheren Entwicklungsstand des Programms nötig.)
Die Zeile hab ich dann mal einfach weggelassen, und lösch die Objekte der Unterliste durch den entsprechenden Destruktor für die Liste, in die die eigentlich reingehören. Aber erst am Programmende, nicht beim leeren der Liste.