2010-11-18 7 views
3

Delphi 2009のジェネリックの多くのバグを見てきましたが、Update 3ではそれほど基本的なものがないとは思えませんでした。リストは、1つの以上の項目が含まれている場合は、汎用のTListまたはTObjectListを上IndexOfメソッドを呼び出すと、アクセス違反が発生します。Delphi 2009の一般的なTList <> 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; 

例外は「EAccessViolationです。モジュールのアドレス0048974Cでアクセス違反 『testbed.exe』アドレスの読み取りデバッグDCUをしてコンパイル00000000"

はgenerics.collections.pasで問題につながる - FComparerメンバーが割り当てられていない:

はもちろんの
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; 

これは、一般的なTListのはほぼ完全に役に立たないことができます。 Update 3ではこのバグは修正されていないようですが、XEにアップグレードする以外の手段がありますか?

答えて

8

この質問を見てください。特にWhy is TList.Remove() producing an EAccessViolation error?

、「あなたは本当にあなたがとにかくジェネリックで作業したい場合はD2009の乗り降りしたいと思う」については、この

TList<TTest>.Create(TComparer<TTest>.Default); 
+0

+1この問題を解決するには、ありがとう、ロディ! –

5

これはデフォルトのコンストラクタのバグで、TObjectList<T>です。私はそれがアップデート3で修正されたと思いました。まだ見ている場合は、別のコンストラクタを使用するか、D2010またはXEに更新してください。 (とにかくジェネリックで作業したいのであれば、実際にD2009から降りたいと思うでしょう)

+2

1のようなあなたのTListを作成してみてください。私はまだD2009にいて、それらを使用しようとして多くの問題に遭遇しました。あまりにも多くのことが働くべきではありません。 – lkessler

+3

私は知っている、私は知っている:)しかし、XEのアップグレードの価格は愛好家のためのポケット変更ではありません。私はたくさんのTObjectListを使用していて、ジェネリックスが定数型キャストを避けることを望んでいました。私は本当に問題が早い時期に起こるとは予想していませんでした。 –

関連する問題