データのツリーリストがあります。ツリー リストをループして特定のレコードを照合し、それらをジェネリック TList<> に追加しています。これは、すべてのレコード値が TList 内のすべての項目に追加された最後の値になることを除いて機能します。
ここにいくつかのコードがあります:
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);
CompData.CompanyName := colCompanyName.Value;
CompData.CompanyDataPath := colCompanyDataPath.Value;
CompData.CompanyPath := colCompanyPath.Value;
CompData.CompanyVer := colCompanyVersion.Value;
AList.Add(CompData);
end;
tlCompanyList.GotoNext;
...または次のようにレコードを追加します。
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 を使用しています。
ありがとう