StringGrid でソートをしたい(1)

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)」でやりたいと思います。


Return index page