Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Generische TObjectlist erzeugt AVs (https://www.delphipraxis.net/142711-generische-tobjectlist-erzeugt-avs.html)

Neutral General 2. Nov 2009 10:51


Generische TObjectlist erzeugt AVs
 
Hi,

Folgender Testcode erzeugt bei mir eine Zugriffsverletzung:

Delphi-Quellcode:
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;
Das sollte eigentlich nicht so sein oder? :?

Gruß
Neutral General

himitsu 2. Nov 2009 11:08

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;

Neutral General 2. Nov 2009 11:16

Re: Generische TObjectlist erzeugt AVs
 
Also was mir auch aufgefallen ist... (grml zu langsam.. aber egal :mrgreen: )

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;
Ich glaube FComparer ist nil. Man kann einen im constructor übergeben...

Ich hab das jetzt so gemacht:

Delphi-Quellcode:
test := TObjectList<TTest>.Create(TComparer<TTest>.Create)
Jetzt kommt keine AV mehr, sondern ein abstrakter Fehler :roll:

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 :?

himitsu 2. Nov 2009 11:22

Re: Generische TObjectlist erzeugt AVs
 
Delphi-Quellcode:
var tmp: TTest;
  comp: IComparer<TTest>;
begin
  test := TObjectList<TTest>.Create(comp);
da comp=nil wird hier jetzt der Default-Comparer installiert,
blöder Weise wurde dieses beim "normalen" .Create vergessen :wall:


[add]
so geht es auch
Delphi-Quellcode:
test := TObjectList<TTest>.Create(IComparer<TTest>(nil));

Neutral General 2. Nov 2009 11:25

Re: Generische TObjectlist erzeugt AVs
 
Ok danke, klappt jetzt :roll:

himitsu 2. Nov 2009 11:30

Re: Generische TObjectlist erzeugt AVs
 
hab erstmal schnell sowas gemacht ._.
http://www.delphipraxis.net/internal...t.php?t=167833


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