TListViewのソート方法については、ヘルプのコード例を見てもいまいち分からなかったので整理してみる。(Style:vsReportの場合)。
まだ正確に把握しきってない可能性はあるが…。
まず、ListViewでは以下の3方法のSortが可能。
stText…いわゆる文字列ソート。ListItemのCaption順にソートする
stData…ListItemに格納されたDataを比較する
stBoth…上記両方でソート(たぶん)
1.stSort
これは単純。TListViewのSotrTypeプロパティにstTextを指定するだけ。コードを書く必要はない。
2.stData
こっちは、事前にListItemのDataプロパティに何かの値をセットしておく必要がある。
たとえばクラスのポインタとか。
実例として、各ItemのDataが、intメンバを持つクラスのポインタを保有している場合。(エラー処理は省略)
1 2 3 4 5 |
void __fastcall TForm1::ListViewCompare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare) { Compare = Item1->Data->getValue() - Item2->Data->getValue(); } |
Compoare値が0より大きいか小さいか、でソート順が決まる。
3.stBoth
ここがちょっと分かりにくいパターン。
基本的に、まずデータを比較し、同じ場合はTextを比較するという手順を踏む(たぶん)
コード例。
1 2 3 4 5 6 7 8 9 10 11 |
void __fastcall TForm1::ListViewCompare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare) { Compare = Item1->Data->getValue() - Item2->Data->getValue(); // Dataの値が同じ時だけ、Itemのキャプションを比較 if( !Compare ) { Compare = CompareText( Item1->Caption, Item2->Caption ); } } |
4.実行時にTSortTypeを変えたい場合
アプリケーションのオプション設定等でSortTypeを変更したい場合は、ちょっと面倒。
ここで気になるのがListViewのOnCompareイベントの引数
int Data
とは何だろうってこと。
ヘルプをざっと見た限りだと、こういう事らしい。
Data == 0 なら、stTextかstNone
Data != 0 なら、stDataかstBoth
ということで、仮に実行時にSortTypeを変更し、反映したい場合は、以下のようなコードになるはず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void __fastcall TForm1::ListViewCompare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare) { // stNoneでも、ListItemの変更があると呼ばれる(らしい)ので、ここではねる if( ListView->SortType == TSortType::stNone ) return; // stTextならCaption文字列を比較 if( !Data ) // SortType == stText: { Compare = CompareText( Item1->Caption, Item2->Caption ); } // SortTypeにデータ要素がある場合 else // SortType == stData or stBoth: { // まずDataの持つ値を比較 Compare = Item1->Data->getValue() - Item2->Data->getValue(); // Data値が同じで、かつstBothの場合は、Captionの文字列を比較 if( !Compare && ListView->SortType == TSortType::stBoth ) { Compare = CompareText( Item1->Caption, Item2->Caption ); } } } |
うーん、このコードだと、そもそも引数のDataを利用する必要がないような…。
もっとスマートな方法がある気がする。