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を利用する必要がないような…。
もっとスマートな方法がある気がする。
