2011-07-07 8 views
2

私はデータのトレネルリストを持っています。特定のレコードと一致するツリーリストをループして、一般的なTList <>に追加しています。これは、すべてのレコード値がTList内のすべての項目に追加された最後のレコード値になることを除いて機能します。このようなレコードタイプのレコードをTList <>に追加するにはどうすればよいですか?

tlCompanyList.GotoBOF; 
    for i := 0 to tlCompanyList.Count-1 do 
    begin 
    if colCompanyChecked.Value then 
    begin 
     inc(ItemsChecked); 
     CompData.CompanyName := colCompanyName.Value; 
     CompData.CompanyDataPath := colCompanyDataPath.Value; 
     CompData.CompanyPath := colCompanyPath.Value; 
     CompData.CompanyVer := colCompanyVersion.Value; 
     AList.Add(CompData); 
    end; 
    tlCompanyList.GotoNext; 

...または追加したレコード:このような

type 
    TCompInfo = record 
    private 
    class var 
     FCompanyName : string; 
     FCompanyPath : string; 
     FCompanyDataPath: string; 
     FCompanyVer  : string; 
    public 
    class procedure Clear; static; 
    class property CompanyName : string read FCompanyName write FCompanyName; 
    class property CompanyPath : string read FCompanyPath write FCompanyPath; 
    class property CompanyDataPath : string read FCompanyDataPath write FCompanyDataPath; 
    class property CompanyVer : string read FCompanyVer write FCompanyVer; 
    end; 
    TCompList = TList<TCompInfo>; 

// variablies defined ... 
var 
    CompData : TCompData; 
    AList : TCompList; 

追加記録:まったく同じことで

tlCompanyList.GotoBOF; 
    for i := 0 to tlCompanyList.Count-1 do 
    begin 
    if colCompanyChecked.Value then 
    begin 
     inc(ItemsChecked); 
     AList.Count := ItemsChecked; 
     AList.Items[ItemsChecked-1].CompanyName := colCompanyName.Value; 
     AList.Items[ItemsChecked-1].CompanyDataPath := colCompanyDataPath.Value; 
     AList.Items[ItemsChecked-1].CompanyPath := colCompanyPath.Value; 
     AList.Items[ItemsChecked-1].CompanyVer := colCompanyVersion.Value; 
    end; 
    tlCompanyList.GotoNext; 

結果

はここにいくつかのコードです。 AList.Items [0 ... Count-1]はすべて同じ値を持ちます。私は正しいデータがキャプチャされていることがわかりますが、AListに新しいレコードを保存すると、以前のすべてのレコードは同じ値になります。これは、TListの各項目がメモリ内の同じレコードへのポインタであることを示しています。レコードが変更されているメモリの場合、すべての項目が変更されます。これは私が望むものではありません。 TList内の新しいレコードを異なるデータを保持するためにどのように割り当てるのですか?

私は他の方法で最終結果を達成することができ、確かに私が持っていることを知っています。ジェネリックスとレコードを使用している私にとって、これはもっと教育的なものになっています。私はDelphi XEを使用しています。

ありがとうございます。

答えて

13

あなたはレコードのすべてのフィールドを「クラスvar」と宣言しました。あるクラスでは、 "class var"の値はクラスのすべてのインスタンスで同じです。実際に私はレコードで "class var"を使用したことはありませんが、レコード型に対しても意味が同じであると思います。 1つのレコードのフィールドの値を変更するたびに、既存のすべてのレコードでフィールドの値が変更されることを意味します。

"class property"ではなく "class var"と単純な "property"を使用せずに試してみてください。

+2

+1私は 'class var'を見つけませんでした!私の脳はそれを許さないと思う!答えを得るためによくできました。 –

+0

ありがとう!それはそれをしました。 – jwilfong

関連する問題