Natürlich kann auch eine Liste Element 100 direkt ansprechen da ja der Speicherverbrauch eines Pointers bekannt ist. TList macht das schon so...
und wie ?
ich habe eine kleine unit geschrieben die genauso arbeitet wie TObjectlist nur halt mit doppelt verketten liste. und dazu habe ich eine eigene TStringlist geschrieben abgeleitet von TStringlist. die meine Doppel Verkette Liste intern nutzt.
Wenn ich Eintrag 100 ansprechen möchte, muss ich doch eine schleife starten.
Die Größe des Pointers könnte ich ja heraus finden mit Sicherheit.
Code: Alles auswählen
function TmyObjectList.GetMyListItem(Index: Integer): TObject;
var
i:Integer;
obj:TmyObjectListItem;
begin
if Index <=Count-1 then begin
// Optimierung: Damit nicht bei jeder anfrage
// Neu gesucht werden muss
if (oldItemindex > -1) and (index = oldItemIndex) then begin
obj:=oldObject;
end
else begin
obj:=First;
oldItemIndex:=index;
for i:=0 to index-1 do begin
if obj.nex <> NIL then
obj:=obj.nex;
end;
oldObject:=obj;
end;
FehlerIndex:=frNone;
result:=obj.inhalt;
end
else begin
if Count-1 > 0 then FehlerIndex:=frHihgIndex;
if Count-1 = 0 then FehlerIndex:=frClearList;
result:=niL;
end;
end;
so mache ich das im Moment.
Code: Alles auswählen
TmyObjectListItem = class
private
parent:TObject;
public
prv,nex:TmyObjectListItem;
inhalt:TObject;
protected
published
end;
und sie sieht die Strucktur aus, worauf der "normale" User eigentlich nie von direkt drauf zugreifst. Wie könnte ich jetzt die Speicher Adresse berechnen ? für Element 100 ?
(wobei ja auch unterschiedliche Objekte gespeichert werden könnten, die unterschiedlich groß sind)