[gelöst] identifikation von Listenobjekten.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Arthur Dent
Beiträge: 21
Registriert: Mi 15. Feb 2012, 22:17

[gelöst] identifikation von Listenobjekten.

Beitrag von Arthur Dent »

Hallo Zusammen!

Ich hab eine kurze Verständnisfrage dazu wie Pascal unterschiedliche Instanzen auseinanderhält. Anlass ist das Löschen spezifischer Objekte aus einer generischen Liste. Ich habe dazu folgenden Schnipsel:

Code: Alles auswählen

 
  procedure TModel3D.deleteItem(item: TItem3D);
  begin
    self.items.Remove(item);
  end;   
 

Meine Frage ist nun ob gemäß meiner Annahme einzelne Objekte unverwechselbar identifiziert werden Können. Mit anderen Worten: Ich gehe davon aus das Objekte bei der Erzeugung eine spezifische ID erhalten.
Oder werden sie nur über ihre Daten identifiziert. Dann würde im Fall identischer Daten nicht das spezifische Objekt sondern nur das erste mit den selben Daten entfernt werden?
Vielen Dank im Voraus!
Zuletzt geändert von Arthur Dent am So 19. Aug 2018, 18:46, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: identifikation von Listenobjekten.

Beitrag von Socke »

Arthur Dent hat geschrieben:Meine Frage ist nun ob gemäß meiner Annahme einzelne Objekte unverwechselbar identifiziert werden Können. Mit anderen Worten: Ich gehe davon aus das Objekte bei der Erzeugung eine spezifische ID erhalten.

Im Allgemeinen werden Objekte über ihre Position im Speicher unterschieden. Es gibt keine globale ID oder ähnliches. Die Adresse eines Objektes wird in einer Objektvariablen abgelegt:

Code: Alles auswählen

var
  myObject, mySecondObject: TObject;
begin
  myObject := TObject.Create;
  // myObject enthält jetzt die Adresse des neu erzeugten Objektes
  mySecondObject := TObject.Create;
  // mySecondObject und myObject enthäten jeweils die selben Daten, sind aber unterschiedliche Objekte, da sie an anderen Speicherstellen liegen
  mySecondObject := myObject;
  // mySecondObject zeigt jetzt auf das zuerst erstellte Objekt. Auf das zweite erstelle Objekt kann jetzt nicht mehr zugegriffen werden
end;


Du kannst also zu einer Liste auch ein Objekt mehrfach hinzufügen, sofern das Listenobjekt das nicht verhindert (z.B. an Position 2 und 5). Löscht du das Objekt einmal aus der Liste wird i.d.R. nicht alle Zeiger (2 und 5) auf das Objekt aus der Liste entfernt sondern nur der zuerst gefundene (Listenposition). Welche Listenposition (2 oder 5) zuerst gefunden wird, hängt von dem verwendeten Suchalgorithmus ab (z.B. Linar von vorne, hinten, Binäre Suche etc.). Selbstverständlich kann es auch Listen geben, die alle Vorkommen eines Objektes aus der Liste entfernen.

Im Speziellen kann das anders aussehen; so werden bei TCollection bzw. TCollectionItem eine Nummer pro Listenelement vergeben und im Listenelement selbst gespeichert (Eigenschaft ID).

Spezifischer Antworten kann es leider nur geben, wenn du uns erzählst, welche Listen und welche Objekte (Klassen) verwendet werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Arthur Dent
Beiträge: 21
Registriert: Mi 15. Feb 2012, 22:17

Re: [gelöst] identifikation von Listenobjekten.

Beitrag von Arthur Dent »

Passt schon :)

Identische Objekte in einer Liste sollten für meinen Zweck nicht vorkommen. Irgendwie ist die Antwort derart einleuchtend dass mir die Frage fasst peinlich ist.
Ich merk halt immer wieder, dass ich es nicht gewoht bin über Schpeicherverwaltung nachzudenken.

Vielen Dank nochmal !

Antworten