J'ai vu beaucoup de mentions de bogues dans les génériques de Delphi 2009, mais je ne m'attendais jamais à quelque chose d'aussi basique dans la mise à jour 3, pas moins. Appel IndexOf sur un TList générique ou TObjectList provoque une violation d'accès si la liste contient 1 ou plusieurs éléments:Générique TList <> dans Delphi 2009 planter sur IndexOf
type
TTest = class(TObject);
procedure DoTest;
var
list : TObjectList<TTest>;
t : TTest;
begin
list := TObjectList<TTest>.Create;
try
t := TTest.Create;
list.IndexOf(t); // No items in list, correct result -1
list.Add(t);
list.IndexOf(t); // Access violation here
finally
list.Free;
end;
end;
L'exception est « EAccessViolation: violation d'accès à l'adresse 0048974C dans le module « testbed.exe » Lire d'adresse. 00000000"
Compiler avec débogage DCU conduit à un problème dans Generics.Collections.pas - le membre FComparer n'est pas affecté:
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;
Bien sûr, rend le TList générique presque complètement inutile. Puisque la mise à jour 3 ne semble pas avoir corrigé ce bug, ai-je un recours autre que la mise à niveau vers XE?
+1 pour avoir donné une solution immédiate au problème. Merci, Roddy! –