[C++Builder]リストビュー(TListView)のグループ化を有効にしている時、リストの項目(TListItem)のIndexプロパティはリスト項目の位置を示さない

リストビュー(TListView)のグループ化を有効にしている時、リストの項目(TListItem)のIndexプロパティはリスト項目の位置を示さないようです。

TListViewの項目(TListItem)のIndexプロパティについて、ヘルプには次のように記載されています。

Index は,リストビュー内の項目を検索することができます。
最初の項目のインデックスは 0,2 番めの項目のインデックスは 1 などとなります。

ComCtrls.TListItem.Index – XE API Documentation』より

最初に、リストビューにTListItemのIndexプロパティの値を表示するようにします。
リストビューのOwnerDrawプロパティをtrueに設定して、OnDrawItemを記述します。

void __fastcall TForm1::ListView1DrawItem(TCustomListView *Sender, TListItem *Item,
          TRect &Rect, TOwnerDrawState State)
{
  ListView1->Canvas->FillRect(Rect);
  UnicodeString text = UnicodeString().sprintf(
    L"Caption=%s, Index=%d", Item->Caption, Item->Index);
  ListView1->Canvas->TextOut(Rect.Left, Rect.Top, text);
}

リストビューのランダムな位置に項目を追加してみます。

//リストビューに項目を追加する
for (int i = 0; i < 10; ++i)
  ListView1->Items->Insert(Random(ListView1->Items->Count))->Caption = IntToStr(i);

実行結果で表示されるIndexの値は、上から順番に大きくなっており、TListItemのIndexプロパティがリスト項目の位置を示していることを確認できます。

次に、グループ化を有効にして試してみます。

const int GROUP_SIZE = 3; //グループの数
ListView1->GroupView = true;  //リストビューのグループを有効にする
//グループを作成する
for (int i = 0; i < GROUP_SIZE; ++i)
  ListView1->Groups->Add()->Header = L"Group" + IntToStr(i);

//リストビューに項目を追加する
for (int i = 0; i < 10; ++i)
{
  TListItem* item = ListView1->Items->Insert(Random(ListView1->Items->Count));
  item->Caption = IntToStr(i);
  item->GroupID = Random(GROUP_SIZE);
}

実行結果で表示されるIndexの値には規則性がなく、ランダムに並んでいます。

リストビュー(TListView)のグループ化を有効にしている時、リストの項目(TListItem)のIndexプロパティはリスト項目の位置を示さないようです。

コメントを残す

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

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