unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ComCtrls, Mask, Grids;type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}(*//
标题:字符网格排序
说明:升序、降序;示例点击标题排序
设计:Zswang
日期:2002-04-27
支持:[email protected]
//*)///////Begin Source
function StringGridRowSwap(mStringGrid: TStringGrid;
  mFromRow, mToRow: Integer): Boolean;
var
  S: string;
begin
  Result := False;
  if (mToRow = mFromRow) then Exit;
  if not Assigned(mStringGrid) then Exit;
  if (mFromRow < 0) or (mFromRow >= mStringGrid.RowCount) then Exit;
  if (mToRow < 0) or (mToRow >= mStringGrid.RowCount) then Exit;
  try
    S := mStringGrid.Rows[mFromRow].Text;
    mStringGrid.Rows[mFromRow].Text := mStringGrid.Rows[mToRow].Text;
    mStringGrid.Rows[mToRow].Text := S;
  except
    Exit;
  end;
  Result := True;
end; { StringGridRowSwap }function StringGridRowSort(mStringGrid: TStringGrid;
  mColIndex: Integer; mDesc: Boolean = False): Boolean;
var
  I, J: Integer;
begin
  Result := False;
  if not Assigned(mStringGrid) then Exit;
  if (mColIndex < 0) or (mColIndex >= mStringGrid.ColCount) then Exit;
  for I := mStringGrid.FixedRows to mStringGrid.RowCount - 2 do
    for J := I + 1 to mStringGrid.RowCount - 1 do
      if mDesc then
        if mStringGrid.Cells[mColIndex, I] < mStringGrid.Cells[mColIndex, J] then
          StringGridRowSwap(mStringGrid, I, J)
        else
      else if mStringGrid.Cells[mColIndex, I] > mStringGrid.Cells[mColIndex, J] then
        StringGridRowSwap(mStringGrid, I, J);
  Result := True;
end; { StringGridRowSort }
///////End Source///////Begin Demo
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
{$J+}
const
  vOldCol: Integer = -1;
{$J-}
var
  vCol, vRow: Integer;
begin
  if Button = mbRight then Exit;
  TStringGrid(Sender).MouseToCell(X, Y, vCol, vRow);
  if (vRow < 0) or (vRow >= TStringGrid(Sender).FixedRows) then Exit;
  StringGridRowSort(TStringGrid(Sender), vCol, vOldCol = vCol);
  if vOldCol = vCol then
    vOldCol := - vOldCol
  else vOldCol := vCol;
end;
///////End Demoend.