Moin,
[...]Nein, ein Destroy vor dem Erneuten Create, d.h. wenn das Object schon in der String Liste ist, wird es zerstört und neu created. Ich könnte es auch am ende zerstören, aber da ich das object noch anderseitig brauche, geht das nicht.[...]
Mal nicht so abstrakt:
Wenn du sowas hast:
Delphi-Quellcode:
var
x : THaus;
begin
x := THaus.Create;
x.Free;
Dann erstellst du ein Haus und speicherst du Adresse wo das Haus ist in x. Danach nimmst du die Adresse und sagst: Da wo das Haus ist gebe das Frei (= zerstöre es).
Jetzt hast du sowas:
Delphi-Quellcode:
var
x, y : THaus;
begin
x := THaus.Create;
y := x;
x.Free;
Dann ist erstmal alles gleich. Aber gleichzeitig kennt y auch die Adresse vom Haus. Das heißt in x und y stehen die gleichen Adressen. Wenn du jetzt aber
x.Free;
aufrufst, dann wird das Haus was an der Adresse x steht zerstört. Und damit auch das Haus was bei y drin steht, weil beide ja auf die gleiche Adresse zeigen.
Das heißt y und x sind sozusagen gleich und du hast keinen Unterschied. Du könntest sagen: y.maleAn(Grün) und auch das Haus auf das x zeigt ist danach grün.
Und so was ähnliches machst du ja. Nur das y halt in der Liste steht: In der Liste stehen die Adressen aller Häuser, aber leider zerstörst du die meisten Häuser nachdem du sie erzeugt hast.
Was du anstelle machen kannst:
Delphi-Quellcode:
var
x, y : THaus;
begin
x := THaus.Create; // Erstellt Haus 1 und speichert die Adresse in X
y := x; // Speichert die Adresse die in X steht (= die von Haus 1) in der Adresse Y
x := THaus.Create; // Erstellt Haus 2 und speichert die Adresse in X (in Y steht aber weiterhin die alte Adresse)
x.Free; // Gibt das Haus das an der Adresse, die in X steht frei
Hier hast du zwei Häuser die nicht die gleiche Adresse haben. Das heißt das erste Haus steht weiterhin, während das zweite Haus zerstört ist.
Das bezeichnet man als
Aliasing bzw. Alias.
Übrigens benutze nicht direkt
x.Destroy;
sondern
x.Free;
oder
FreeAndNil(x)
.
Und wie du das dann mit den freigeben erledigst musst du sehen:
Eventuell bietet dir die Liste an, die Objekte selber freizugeben (.OwnObjects auf true setzen), ansonsten kannst du auch selber eine zweite Liste haben in der alle Elemente drin stehen die auch mit OwnObjects = true die Elemente freigibt.
MfG
Fabian