我有数据的树形表。我循环遍历树列表以匹配某些记录并将它们添加到通用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。
由于
答案 0 :(得分:13)
您已将记录的所有字段声明为“class var”。在类中,“class var”的值对于类的所有实例都是相同的。实际上我从来没有使用带有记录的“class var”,但我认为记录类型的语义也是一样的。这意味着每当您更改一个记录中的字段值时,它将在所有现有记录中更改。
尝试不使用“class var”和简单的“property”而不是“class property”。