AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi SortedList oder iDictionary in Delphi (ohne .net!)
Thema durchsuchen
Ansicht
Themen-Optionen

SortedList oder iDictionary in Delphi (ohne .net!)

Ein Thema von Berlinermauer · begonnen am 22. Sep 2010 · letzter Beitrag vom 26. Sep 2010
 
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#21

AW: SortedList oder iDictionary in Delphi (ohne .net!)

  Alt 26. Sep 2010, 17:04
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (26. Sep 2010 um 19:11 Uhr)
  Mit Zitat antworten Zitat
 


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 02:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz