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