Para ordenar por un campo en concreto debes capturar el evento apropiado del grid, depende del que uses, puede ser algo así como: "HeadClick", "TitleClick", etc.
Por ejemplo, imagina que tienes un dbgrid asociado a un dataset mediante su correspondiente datasource, el dataset tiene una sentencia parecida a esta:
Código:
Select Codigo, Nombre, Salario from tbEmpleados order by Codigo
Quieres ordenar por "salario" y pinchas sobre el título del grid, haces algo parecido a esto:
Código:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
dataset.close;
case Column of
0: dataset.sql.text:='Select Codigo, Nombre, Salario from tbEmpleados order by Codigo';
1: dataset.sql.text:='Select Codigo, Nombre, Salario from tbEmpleados order by Nombre';
2: dataset.sql.text:='Select Codigo, Nombre, Salario from tbEmpleados order by Salario';
end;
dataset.open;
end;
Esto es una manera un poco "chapuza" de código, pero es sólo para que lo entiendas.
Para pintar la flechita o lo que quieras puedes hacer algo parecido:
Código:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
Rect: TRect; State: TGridDrawState);
begin
if Col=2 then
with StringGrid1.Canvas do
Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);
end;
Seguro que si haces una búsqueda por los foros encuentras multitud de ejemplos que te pueden ser de ayuda.