1

records要約したいリストがありますTListView

レコードの構造は次のとおりです。

MyRecord = record
   SourceTable: string;
   SourceField: string;
   TargetTable: string;
   TargetField: string;
end;

レコードには、SourceTable / TargetTable の複数のインスタンスと、Source/Target Field の単一インスタンスが存在する場合があります

TListView各 SourceTable\TargetTable ペアを要約 する in vsReport スタイルを作成したいと思います。

理想的には、次のことをしたいと思います。

procedure SetTables;
var
   mp: MyPointer;
   LI: TListItem;
begin
   LI := LI.Create(nil);
   LI.Caption := ap^.SourceTable;
   LI.SubItems.Add(ap^.TargetTable);
   LI.Checked := not ap^.Updated;
   if lvMigration.Items.IndexOf(LI) = -1 then
       lvMigration.Items.AddItem(LI);
end;

つまり、スタンドアロンの TListItem を作成し、それがまだ存在しないことを確認してから、TListView に追加します。ただし、の割り当てで壊れますLI.Caption-本質的に割り当てるものは何もありません。問題の少なくとも一部は(nil)

TListItem の通常の作成は使用することですLI := lvMigration.Items.Add;が、これは私のユースケースには役立ちません。上記が行われているドキュメントが見つからないようです。

4

2 に答える 2

1

それ以外の:

LI := LI.Create(nil);

あなたは書くつもりだった

LI := TListItem.Create(nil);

これは本の中で最も古い Delphi の間違いであり、あなたも以前に犯したことがあると思います (誰もが犯したことがあります)。

ただし、コードの残りの部分は機能しません。TListItemを指定しないと、インスタンスで何もできませんOwner。たとえば、次の実装を見てくださいTListItem.SetCaption

procedure TListItem.SetCaption(const Value: string);
begin
  if Value <> Caption then
  begin
    FCaption := Value;
    if not Owner.Owner.OwnerData then
    .... 
  end;
end;

あなたのコードでOwnernil、このコードはアクセス違反につながるだけです。実際、インスタンス化するべきではありませんTListItem。これはコンテナ クラスによって行われます。

IndexOfただし、その問題がなくても、それはあなたが望むことをしないことがわかります. アイテムの値に対して検索を実行する必要があります。ただし、参照に対して検索を実行します。

必要なことは、リスト内の各アイテムを繰り返し処理し、そのキャプションとサブアイテム (またはアイテムを識別するもの) を新しい値と比較してチェックすることです。

より抜本的な変更、長期的には生活を楽にし、リストが大きくなった場合のパフォーマンスを向上させるような気分になっている場合は、仮想モードでリスト ビューを使用するように切り替えると役立ちます。TList<TMyItem>または同様のアイテムのリストを維持します。そして、オンデマンドで入力します。これを行うと、GUI コントロールではなく単純なコンテナーで作業することになるため、重複を検出するのがはるかに簡単になります。基本的に、GUI コントロールをコンテナー クラスとして使用することで、自分自身の生活を困難にしています。

于 2013-10-30T15:57:18.920 に答える
0

レコードのメイン リストを 2 番目のリストに並べ替えて、重複を除外し、2 番目のリストを使用して ListView に入力することをお勧めします。仮想モードで ListView を使用することもお勧めします (OwnerData プロパティを true に設定し、OnData... イベントを使用します)。これにより、ListView のパフォーマンスが大幅に向上し、メモリ内のレコードにアクセス/操作でき、UI によって速度が低下することはありません。

于 2013-10-30T16:10:08.910 に答える