TListViewをGroup名順に並び替える[Vcl]

C++BuilderでTListViewをStyle:vsReportで使用している場合、Group名順に並び替えるには、GoupItemのIndexプロパティを変更するだけでいい。(GroupViewプロパティはTrue)

以下のコードでは、std::mapにGroup名とTListGroup(のポインタ)を格納して、自動的に名前順に並び替えている。

なお、このサンプルでは、名前のないGroupが先頭に来てしまう。名前のないGroupを最後にするには、Indexを明示的に付けなけれぱOK。自動的に最後になる。(正確に言うと自動的にカウントアップされたIndexが割り振られる)

以下、蛇足。

Indexプロパティって何?

ListViewにGroupを動的に追加する場合、GroupIDは自分で設定するけど、Indexは特に指定しない。
Indexプロパティは、GroupがAddされるたびに自動的に連番で振られる(らしい)。
ちなみに以下のようにループを回すと、GroupID順でなくIndex順にアクセスされる。(GroupID順だと思い込んでバグったことがある)

なおIndexを指定する場合、ダブりを気にする必要はない。

つまり

グループ0Index = 0
グループ1Index = 1
グループ2Index = 2

この「グループ2」のIndexを0に変更すると、以下のように全グルーブのIndexが割り振り直される。
グループ0Index = 1
グループ1Index = 2
グループ2Index = 0

なので、Groupの最後を先頭に持ってくるのは以下のコードですむ。

(なお”Group->Count-1″を超えるIndexを指定すると例外が投げられる。)

ここらへん、TListGroupsの継承元のTCollectionクラスあたりの仕様を把握していると直感的に分かるのかもしれないけど、ちょっと苦労した。

Windows7(64bit)/C++Builder Berlin(Update1)で確認

コメントを残す

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