名前 題名 ▼ おかぽんさん > こんにちは。 > > StringListでソートとなると、どうしても文字列のソートになってしまうから、 > あまり使わないので、自分の使う方法。 > > StringGridで表示する場合、大抵別のクラスで行ごとのデータを持っているから > > THoge=class > Col1: String; > Col2:Integer; > Col3:TDateTime; > end; > > とか宣言し、TClassListに全データ入れてしまう。 > > そして、StringGridへの初回表示は、以下のようにObjectsを使って、行と実データを > 関連付けしてしまう。 > > var > i: Integer; > begin > //行数確保 > StringGrid.RowCount := ClassList.Count + 1; > //0列にクラス参照設定 > for i := 1 to StringGrid.RowCount -1 do > begin > StringGrid.Objects[0,i] := ClassList.Items[i-1]; > RowUpdate(i); > end; > end; > > 各セルへの更新は 関連付けされたデータを参照して行う > procedure TForm1.RowUpdate(aRow: Integer); > var > hoge: THoge; > begin > hoge := StringGrid.Objects[0,aRow]; > StringGrid.Cells[0, aRow] := hoge.Col1; > StringGrid.Cells[1, aRow] := IntToStr(hoge.Col2); > StringGrid.Cells[2, aRow] := FormatDateTime('yyyy/mm/dd', hoge.Col3); > end; > > ソートは、StringList.CustomSort()を使う。 > > function StringListSortCompareA(List: TStringList; Index1, Index2: Integer): Integer; > begin > Result := AnsiCompareString(THoge(List.Objects[Index1]).Col1, > THoge(List.Objects[Index1]).Col2); > end; > function StringListSortCompareB(List: TStringList; Index1, Index2: Integer): Integer; > begin > // > end; > > var > stringList: TStringList; > i: Integer; > begin > stringList := TStringList.Create; > stringList.Assign(StringGrid.Cols[0]); > StringList.CustomSort(StringListSortCompareA); > StringGrid.Cols[0].Assign(stringList); > for i := 1 to StringGrid.RowCount -1 do RowUpdate(i); > stringList.Free; > end; > > TStringListSortCompareを使い、1対1の比較関数を作るので、複数列をキーに並び替えできる。 > 別途作成した機能で、THogeの内容を更新しても、RowUpdate関数で、内容を反映できる。 > > 個別の比較関数が必要になるので、汎用的ではありませんけど。 GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link