Mega Code Archive

 
Categories / Delphi / VCL
 

Sort a tstringgrid by columns

type TMoveSG = class(TCustomGrid); // reveals protected MoveRow procedure {...} procedure SortGridByCols(Grid: TStringGrid; ColOrder: array of Integer); var i, j: Integer; Sorted: Boolean; function Sort(Row1, Row2: Integer): Integer; var C: Integer; begin C := 0; Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]); if Result = 0 then begin Inc(C); while (C <= High(ColOrder)) and (Result = 0) do begin Result := AnsiCompareStr(Grid.Cols[ColOrder[C]][Row1], Grid.Cols[ColOrder[C]][Row2]); Inc(C); end; end; end; begin if SizeOf(ColOrder) div SizeOf(i) <> Grid.ColCount then Exit; for i := 0 to High(ColOrder) do if (ColOrder[i] < 0) or (ColOrder[i] >= Grid.ColCount) then Exit; j := 0; Sorted := False; repeat Inc(j); with Grid do for i := 0 to RowCount - 2 do if Sort(i, i + 1) > 0 then begin TMoveSG(Grid).MoveRow(i + 1, i); Sorted := False; end; until Sorted or (j = 1000); Grid.Repaint; end; procedure TForm1.Button1Click(Sender: TObject); begin { Sort rows based on the contents of two or more columns. Sorts first by column 1. If there are duplicate values in column 1, the next sort column is column 2 and so on...} SortGridByCols(StringGrid1, [1, 2, 0, 3, 4]); end;