Как мне добавить записи типа запись в TList ‹›?

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

Спасибо


person jwilfong    schedule 07.07.2011    source источник


Ответы (1)


Вы объявили все поля записи как «class var». В классе значение "class var" одинаково для всех экземпляров класса. На самом деле я никогда не использовал "class var" с записями, но полагаю, что семантика одинакова и для типов записей. Это означает, что всякий раз, когда вы меняете значение поля в одной записи, оно будет изменяться во всех существующих записях.

Попробуйте без «class var» и простого «property» вместо «class property».

person Toto    schedule 07.07.2011
comment
+1 Я не заметил class var! Думаю, мой мозг не впустил бы это! Молодцы, что получили ответ. - person David Heffernan; 07.07.2011