Как добавить записи типа запись в TList <>? - PullRequest
2 голосов
/ 07 июля 2011

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

Спасибо

1 Ответ

13 голосов
/ 07 июля 2011

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

Попробуйте это без "class var" и простого "свойства" вместо "свойства класса".

...