Lazarus StringGrid重複するデータを削除

StringGridで、カラムの中で、重複する情報がある場合削除する処理を作ってみた

DBのSQL文のdistinct(重複レコードの削除)のような処理

処理は、まず指定カラムで、並び替えを行い
同じカラムの内容がつづいたものを、削除する処理とした

並び替えの処理は、Webにある既存の処理を使った

//http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/faq/00084.htm
ソート処理

Procedure GridSort(Grid : TStringGrid;SortCol : LongInt);
var
   St, St2 : TStringList;
   i : Integer;
begin
     St := TStringList.Create;
     ST.Assign(Grid.Cols[SortCol]);
     For i := 1 To Grid.FixedRows Do
        St.Delete(0);
     For i := Grid.FixedRows To Grid.RowCount - 1 Do
     Begin
                                            St2 := TStringList.Create;
       St2.Assign(Grid.Rows[i]);
       St.Objects[i - Grid.FixedRows] := St2;
     End;
     St.Sort;
     For i := Grid.FixedRows To Grid.RowCount - 1 Do
     Begin
        Grid.Rows[i].Assign(TStringList(St.Objects[i - Grid.FixedRows]));
        TStringList(St.Objects[i - Grid.FixedRows]).Free;
     End;
     St.Free;
end;

Procedure Distinct(Grid : TStringGrid;CutCol : LongInt);
var
   i,j : Integer;
begin
j:=1;
with  Grid  do
begin
 for i:=2 to rowcount-1 do begin
  if Cells[CutCol,j]<>Cells[CutCol,i] then begin
//    Cells[CutCol,j+1]:=Cells[CutCol,i];
// 行単位で複写
    Rows[j+1].Assign(Rows[i]);
    j:=j+1;
  end
 end;
// 重複した行の分に行数を合わせる(不要な行を削除)
 rowcount:=j+1;
end;
end;

// テストデータ作成
procedure TForm1.Button1Click(Sender: TObject);
begin
with  StringGrid1  do
 RowCount:=6;
 Cells[1,1]:='abc';
 Cells[1,2]:='abc-2';
 Cells[1,3]:='abc-1';
 Cells[1,4]:='abc-2';
 Cells[1,5]:='abc-3';
 Cells[2,1]:='1';
 Cells[2,2]:='2';
 Cells[2,3]:='3';
 Cells[2,4]:='4';
 Cells[2,5]:='5';
end;                
end;                

// 動作テスト
procedure TForm1.Button2Click(Sender: TObject);
begin
   GridSort(StringGrid1, 1); //1カラム目でソート
   Distinct(StringGrid1, 1); //1カラム目で重複削除
end;