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]);
}