4

データのツリーリストがあります。ツリー リストをループして特定のレコードを照合し、それらをジェネリック 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 を使用しています。

ありがとう

4

1 に答える 1

13

レコードのすべてのフィールドを「class var」として宣言しました。クラスでは、「class var」の値はクラスのすべてのインスタンスで同じです。実際、レコードで「class var」を使用したことはありませんが、セマンティックはレコードタイプでも同じだと思います。つまり、1 つのレコードでフィールドの値を変更すると、既存のすべてのレコードでも変更されます。

「クラスプロパティ」の代わりに「クラス変数」と単純な「プロパティ」なしで試してください。

于 2011-07-07T07:01:30.493 に答える