TListViewを仮想リストビューにして、多くの項目を高速に追加する

TListViewにたくさんの項目を追加していくと、速度がどんどん遅くなります。
仮想リストビューすると、多くの項目を高速に追加することができます。

通常の方法。
追加する項目が多くなると遅くなる。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for (int i = 0; i < 10000; ++i) {
    TListItem* item = ListView1->Items->Add();
    item->Caption = IntToStr(i);
    item->SubItems->Add(IntToStr(i));
  }
}

TListViewを仮想リストビューにするには、OwnerDataプロパティをtrueにします。

ListView2->OwnerData = true;

項目を追加するには、項目数を設定します。

ListView2->Items->Count = 10000;

リスト項目が描画される時にOnDataイベントが発生します。
OnDataイベントでリスト項目の情報を設定します。

void __fastcall TForm1::ListView2Data(TObject *Sender, TListItem *Item)
{
  int index = Item->Index;
  Item->Caption = IntToStr(index);
  Item->SubItems->Add(IntToStr(index));
}

OnDataHintイベントは、リストビューの内容が変更されたときに発生します。
OnDataイベントが発生する前に一定範囲の項目を更新できます。

void __fastcall TForm1::ListView2DataHint(TObject *Sender, int StartIndex, int EndIndex)
{
  //更新の必要がなければ処理をスキップする
  if (/* 更新が必要かどうかのチェック */) return; //必要なければ終了

  //リスト項目に表示するデータを用意する
  for (int i = StartIndex; i <= EndIndex; ++i) {
    this->FCaptions[i] = IntToStr(i);
    this->FSubCaptions[i] = IntToStr(i+10000);
  }
}
void __fastcall TForm1::ListView2Data(TObject *Sender, TListItem *Item)
{
  //用意した表示用データからリスト項目の表示設定を行う
  int index = Item->Index;
  Item->Caption = this->FCaptions[index];
  Item->SubItems->Add(this->FSubCaptions[index]);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください