![]() |
Generische TObjectlist erzeugt AVs
Hi,
Folgender Testcode erzeugt bei mir eine Zugriffsverletzung:
Delphi-Quellcode:
Das sollte eigentlich nicht so sein oder? :?
type
TTest = class end; var test: TObjectList<TTest> procedure TForm1.Button1Click(Sender: TObject); var tmp: TTest; begin test := TObjectList<TTest>.Create; tmp := TTest.Create; test.Add(tmp); Caption := IntToStr(test.IndexOf(tmp)); // <--- IndexOf ! test.Free; end; Gruß Neutral General |
Re: Generische TObjectlist erzeugt AVs
Ja, da scheint wohl irgendwas (in D2009) schiefzugehn
hier wird zwar Count beim .Add gesetzt, aber SetLength ändert anscheinend die FItems nicht :shock: Jedefalls stimmt .Count, aber in FItems ist einfach nichts drin, weswegen dann die Bereichsprüfung zuschlägt. komisch ... jetzt geht es plötzlich ... also das.Count und FItems stimmen, aber die Exception kommt immernoch :shock: edit: hab's (glaub ich) FComparer ist NIL
Delphi-Quellcode:
function TList<T>.IndexOf(const Value: T): Integer;
var i: Integer; begin for i := 0 to Count - 1 do if FComparer.Compare(FItems[i], Value) = 0 then Exit(i); Result := -1; end; |
Re: Generische TObjectlist erzeugt AVs
Also was mir auch aufgefallen ist... (grml zu langsam.. aber egal :mrgreen: )
Delphi-Quellcode:
Ich glaube FComparer ist nil. Man kann einen im constructor übergeben...
function TList<T>.IndexOf(const Value: T): Integer;
var i: Integer; begin for i := 0 to Count - 1 do if FComparer.Compare(FItems[i], Value) = 0 then Exit(i); Result := -1; end; Ich hab das jetzt so gemacht:
Delphi-Quellcode:
Jetzt kommt keine AV mehr, sondern ein abstrakter Fehler :roll:
test := TObjectList<TTest>.Create(TComparer<TTest>.Create)
Edit: Klar... Compare ist bei TComparer auch noch abstract -.- ABER: Das heißt ja ich muss mir entweder ne Klasse von TComparer ableiten oder ich muss mir sone Compare function schreiben und einem TDelegatedComparer im constructor übergeben. Der Aufwand macht die generischen Listen ja schon wieder fast unnötig :? |
Re: Generische TObjectlist erzeugt AVs
Delphi-Quellcode:
da comp=nil wird hier jetzt der Default-Comparer installiert,
var tmp: TTest;
comp: IComparer<TTest>; begin test := TObjectList<TTest>.Create(comp); blöder Weise wurde dieses beim "normalen" .Create vergessen :wall: [add] so geht es auch
Delphi-Quellcode:
test := TObjectList<TTest>.Create(IComparer<TTest>(nil));
|
Re: Generische TObjectlist erzeugt AVs
Ok danke, klappt jetzt :roll:
|
Re: Generische TObjectlist erzeugt AVs
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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 by Thomas Breitkreuz