![]() |
TObjectList prüfen ob Index exitstiert
Hi,
also ich habe eine Objekt list und erstelle da Objekte rein. Die Indizes der Objekte sind aber nicht in einer bestimmten Reihenfolge sondern sie haben durchaus Lücken (also 5, 8,9,10,12). So wie kann ich prüfen ob ein Element mit einem bestimmten Index schon vorhanden ist? So klappt es jedenfalls nicht: :? (beste ist vom Typ TObjectList, schritte hat hier den Wert 1 und anscheinend ist der index 1 noch nicht vergeben.)
Delphi-Quellcode:
Da meldet er den Fehler:
if beste.Items[schritte]=nil then
Zitat:
|
Re: TObjectList prüfen ob Index exitstiert
HI,
wie genau fügst du denn etwas in die Liste ein, so dass dort Lücken entstehen können? Eigentlich ist der Sinn der TObjectList ja gerade, dass man Lücken vermeidet. Gruß Der Unwissende [Edit]Zu der Fehlermeldung: Nicht vergeben ist schon irgendwie richtig, aber es gibt dann auch kein Element an einer Stelle > 0, liegt nicht daran dass du hier eine Lücke hast. Prüfen kannst du dass auch ganz leicht
Delphi-Quellcode:
if schritte < beste.Count then
begin if beste.Items[schritte]=nil then .... end else begin // ups, so viele Elemente hast du noch gar nicht eingefügt, // natürlich darf Schritte auch nicht kleiner 0 werden end; |
Re: TObjectList prüfen ob Index exitstiert
Moin,
wenn du 5 Elemente in der Liste hast, dann sind die Indize 0-4. Wenn du in der Mitte ein Element rausnimmst, dann geht der Rest einfach "nach vorne", d.h. du hast nie Luecken in der Liste. Pruefen kannst du es also so (ich gehe davon aus, dass auch "schritt" 0-basiert ist:
Delphi-Quellcode:
Die zweite Pruefung ist, ob du ueberhaupt ein Objekt da drin stehn hast. Nur weil der Index da ist, heisst noch lange nicht dass dort das drinsteht, was du erwartest. Ich kann ja auch einen Integer auf TObject casten und den reinschreiben; bei einem Objektzugriff auf dieses Element wuerde es dann dementsprechend krachen, genauso bei nil. Das hat aber nichts damit zu tun, ob der Index da ist ;)
if (schritt >= 0) and (schritt < liste.count)
Greetz alcaeus |
Re: TObjectList prüfen ob Index exitstiert
Hi,
ja das war mein Fehler :wall: ,dass es garkeine Lücken geben kann. Eigentlich schade. :( Danke für eure Hilfe. Wisst ihr vielleicht irgendein Objekt, dass so ähnlich wie Tobjectlist arbeitet, aber Lücken zulässt? Das wäre nämlich richtig praktisch :?: |
Re: TObjectList prüfen ob Index exitstiert
:gruebel: Wozu brauchst du Luecken?
Und sonst: array of TObject; ;) Greetz alcaeus |
Re: TObjectList prüfen ob Index exitstiert
Zitat:
Also eigentlich will ich eine Klasse erstellen. In der sind mehrere Rubriken, die durch eine Zahl zugänglich sind. Diese Rubriken enthalten ein array. Ich habe natürlich ein paar Ideen um das zu verwirklichen. Aber meistens ist eine schlechter als die andere. Eine Idee ist: Ich erstelle eine Klasse, darin ist ein 2-d array; eine set of byte; und ein paar procedures und properties. Dann werde ich die Elemente in dem Set of mit den Elementen im array verknüpfen. Und so eine nach aussen hin lückenhafte Arrays erstellen. Ich hatte gehofft eine TobjectList nimmt mir diese Arbeit ab. Aber das ist ja genau das gleiche wie ein array. :hi: Tschüss :hi: |
Re: TObjectList prüfen ob Index exitstiert
Hallo,
wo steht, daß eine TObjectList keine Lücken zuläßt?
Delphi-Quellcode:
Gruß Hawkeye
List := TObjectList.Create;
List.Add (TObject.Create); List.Add (TObject.Create); List.Add (TObject.Create); List.Add (TObject.Create); List.Add (TObject.Create); Count := List.Count; // Count=5 List[3] := NIL; Count := List.Count; // Count=5 List.Pack; Count := List.Count; // Count=4 List.Free; |
Re: TObjectList prüfen ob Index exitstiert
Zitat:
Aber ja, möglich ist es |
Re: TObjectList prüfen ob Index exitstiert
Zitat:
Wenn sich die Anzahl oft ändert ist die ObjectList doch besser :-D Gruß, pszopp |
Re: TObjectList prüfen ob Index exitstiert
Gut, angenommen die Anzahl der Elemente ändert sich häufig, wie genau möchte ich denn dann einen direkten Zugriff auf einen Index ermöglichen?
Einfachste Möglichkeit, ich lege ein Array an, dass von Anfang an sehr groß gewählt wird. Ok, jetzt können wir über die Speicherverschwendung reden, die liegt dann bei 4 Byte pro unbenutztem Feld, dass mein dyn. Array zu groß wäre, dürfte in den meisten Fällen also nur ein paar kByte max. ausmachen (zu vernachlässigen). Was macht nun eine TObjectList intern? Natürlich genau das gleiche, nur dass diese sich halt selbst um ihre Vergrößerung/Verkleinerung kümmert. Wenn ich aber auf einen beliebigen Index zugreifen will, ist es einfacher das per Hand und dyn. Arrays zu machen. Wenn sich die Anzahl der Elemente stark ändert (überhaupt nichts zum Anfang hin fest steht, so eignen sich nebenbei bemekrt Bäume deutlich besser) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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