Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectlist, wie funktioniet sie wirklich? (https://www.delphipraxis.net/83510-tobjectlist-wie-funktioniet-sie-wirklich.html)

Antigo 3. Jan 2007 21:16


TObjectlist, wie funktioniet sie wirklich?
 
Hi,
Ich habe schon öfters die TObjectlist benutzt um eine Vielzahl Objekte vom selben Typ zu verwalten, da sie einfach angenehmer als ein Array ist, alleine durch Insert und delete.

Aber, was macht sie wirklich, und wie bediene ich sie richtig?

Ich weiss, das Objekte nur Zeiger auf einen Speicherbereich sind, und man sie deshalb auch nicht ohne weiteres kopieren kann ala objekt1:=objekt2 da dann objekt1 nur auf Objekt2 zeigen würde und eine Änderung in einem der beiden würde daher beides betreffen.

So nun möchte ich gerne eine ganze Menge Objekte in der TObjectlist speichern. Folgendes funktioniert aber beispielsweise nicht.

Delphi-Quellcode:
  //Pseudocode
  var Objekt: TObjekt;
   liste:TObjectlist;
  begin
    TObjekt:=TObjekt.create('Test1');
    liste.add(TObjekt);
    TObjekt:=TObjekt.create('Test2');
    liste.add(TObject);
  end;
In beiden Elementen der Liste würde nun Test2 stehen.

Ist es daher richtig zu sagen, in einer TObjectlist werden nur Zeiger gespeichert? Wenn ja wie befülle ich dann am elegantesten eine TObjectlist mit vielen Elementen in einer einzelnen Prozedur. Wenn ich jedesmal nur ein Objekt reinspeichere funktioniert es, da die lokale temporäre Variable scheinbar bei jedem Aufruf eine andere Speicheradresse hat auf die ich dann über die TObjectlist zugreifen kann.

Aber ich schreibe eigentlich zuviel. Kann mir jemand erklären wie das ganze mit der TObjectlist funktioniert, also wie ich Objekte am besten lade und speichere, oder mir einen link geben wo die funktionsweise und das was dahinter steckt beschrieben wird?


Vielen Dank schonmal :)

Muetze1 3. Jan 2007 21:40

Re: TObjectlist, wie funktioniet sie wirklich?
 
Zitat:

Zitat von Antigo
So nun möchte ich gerne eine ganze Menge Objekte in der TObjectlist speichern. Folgendes funktioniert aber beispielsweise nicht.

In beiden Elementen der Liste würde nun Test2 stehen.

Falsch!

Delphi-Quellcode:
  //Pseudocode
  var Objekt: TObjekt;
      liste:TObjectlist;
  begin
    liste := TObjectList.Create;
    Try
      Objekt := TObjekt.create('Test1');
      liste.add(TObjekt);

      Objekt := TObjekt.create('Test2');  // Objekt bekommt hier eine neue Instanz zugewiesen, somit eine neue "Adresse auf die Objekt" zeigt.
      liste.add(TObject);
    finally
      list.free;
    end;
  end;
Daher sind es 2 unterschiedliche Zeiger die die Objektliste da bekommt und speichert. In beiden Einträgen stehen unterschiedliche Adresse. Der Code funktioniert so...

Zitat:

Zitat von Antigo
Ist es daher richtig zu sagen, in einer TObjectlist werden nur Zeiger gespeichert?

Ja.

Zitat:

Zitat von Antigo
Wenn ja wie befülle ich dann am elegantesten eine TObjectlist mit vielen Elementen in einer einzelnen Prozedur.

So wie du es selber gepostet hast.

Zitat:

Zitat von Antigo
Wenn ich jedesmal nur ein Objekt reinspeichere funktioniert es, da die lokale temporäre Variable scheinbar bei jedem Aufruf eine andere Speicheradresse hat auf die ich dann über die TObjectlist zugreifen kann.

Er speichert nirgendwo die lokale temporäre Variable sondern deren Inhalt!

Kann es sein, dass deine TObjectList genauso lokal deklariert ist wie in deinem Beispiel?

Khabarakh 3. Jan 2007 21:49

Re: TObjectlist, wie funktioniet sie wirklich?
 
Zitat:

Zitat von Antigo
Ich weiss, dass Objekte nur Zeiger auf einen Speicherbereich sind, [...]

Das Objekt _ist_ der Speicherbereich. Aber die Variable enthält eben nur einen Zeiger auf eben diese Instanz.

Phoenix 3. Jan 2007 21:57

Re: TObjectlist, wie funktioniet sie wirklich?
 
Warum nicht gleich:
Delphi-Quellcode:
var
   liste:TObjectlist;
begin
  liste.add(TObjekt.create('Test1'));
  liste.add(TObjekt.create('Test2'));
end;
?

Antigo 3. Jan 2007 22:11

Re: TObjectlist, wie funktioniet sie wirklich?
 
Zitat:

Objekt := TObjekt.create('Test2'); // Objekt bekommt hier eine neue Instanz zugewiesen, somit eine neue "Adresse auf die Objekt" zeigt.
ah ok, das wusste ich nicht.

Zitat:

Kann es sein, dass deine TObjectList genauso lokal deklariert ist wie in deinem Beispiel?
ähh nein, ich hab derzeit kein konkretes Problem, habs bisher immer >irgendwie hingekriegt, wollte nur wissen, was ich eigentlich tue ;)


Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Antigo
Ich weiss, dass Objekte nur Zeiger auf einen Speicherbereich sind, [...]

Das Objekt _ist_ der Speicherbereich. Aber die Variable enthält eben nur einen Zeiger auf eben diese Instanz.

Ja das meinte ich, war etwas dämlich ausgedrückt :oops:
Zitat:

Zitat von Phoenix
Warum nicht gleich:
Delphi-Quellcode:
var
   liste:TObjectlist;
begin
  liste.add(TObjekt.create('Test1'));
  liste.add(TObjekt.create('Test2'));
end;
?

oh das geht auch? ist eigentlich noch besser :)


gut vielen dank für eure Hilfe, ich glaub jetzt bin ich etwas sicherer im Umgang mit der Objectlist :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz