У меня есть список данных. Я перебираю древовидный список для соответствия определенным записям и добавляю их в общий список 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.
Спасибо