StringGrid を使っているとソートが欲しくなることもありますよね。
まあ、実装して見ましょうかって言うことです。
何も考えずにソースといきましょうか。
procedure TForm1.Sort(ACol: Integer);
var
ARow: Integer;
Buffer: TStringList;
begin
with StringGrid1 do
begin
Buffer := TStringList.Create;
//Buffer に key とそれに対応する Rows を格納する
for ARow := TopRow to RowCount - 1 do
begin
Buffer.AddObject(Cells[ACol, ARow], TStringList.Create);
TStringList(Buffer.Objects[ARow - TopRow]).Assign(Rows[ARow]);
end;
//Buffer を実際にソートする
Buffer.Sort;
//ソートしたデータを Grid に書き戻す
for ARow := TopRow to RowCount - 1 do
begin
Rows[ARow].Assign(TStringList(Buffer.Objects[ARow - TopRow]));
TStringList(Buffer.Objects[ARow - TopRow]).Free;
end;
Buffer.Free;
end;
end;
ToprRow
やら StringGrid1
が決め打ちだというのは、引数を増やして対応すればいいだけなので大した事ではありませんね。
本質的に問題なのはソートが QuickSort(=不安定なソート)だという点です。
これで何が問題になるかというのは「StringGrid でソートをしたい(2)」でやりたいと思います。