Se seu DBGrid pega dos dados de um ClientDataset voce pode usar esta função 
aqui ó:

procedure OrdenaDataSetGrid(var CDS: TClientDataSet; Column: TColumn; var 
dbgPrin: TDBGrid);
const
  idxDefault = 'DEFAULT_ORDER';
var
  strColumn : string;
  i : integer;
  bolUsed : boolean;
  idOptions : TIndexOptions;
begin

  strColumn := idxDefault;
  if Column.Field.FieldKind in [fkCalculated, fkLookup, fkAggregate, 
fkInternalCalc] then Exit;
  if Column.Field.DataType in [ftBlob, ftMemo] then Exit;
  //
//  for i := 0 to dbgPrin.Columns.Count -1 do 
dbgPrin.Columns[i].Title.Font.Style := [];
  for i := 0 to dbgPrin.Columns.Count -1 do  
dbgPrin.Columns[i].Title.Font.Color := clActiveCaption;
  //
  bolUsed := (Column.Field.FieldName = CDS.IndexName);
  //
  CDS.IndexDefs.Update;
  for i := 0 to CDS.IndexDefs.Count - 1 do
  begin
    if CDS.IndexDefs.Items[i].Name = Column.Field.FieldName then
    begin
      strColumn := Column.Field.FieldName;
      case (CDS.IndexDefs.Items[i].Options = [ixDescending]) of
         True : idOptions := [];
         False : idOptions := [ixDescending];
      end;
    end;
  end;
  //
  if (strColumn = idxDefault)  or (bolUsed) then
  begin
    if bolUsed then CDS.DeleteIndex(Column.Field.FieldName);
    try
      CDS.AddIndex(Column.Field.FieldName, Column.Field.FieldName, idOptions, 
'', '', 0);
      strColumn := Column.Field.FieldName;
    except
      if bolUsed then strColumn := idxDefault;
    end;
  end;
  //
  try
   CDS.IndexName := strColumn;
   Column.Title.Font.Color := clRed;
   Column.Title.Caption := Column.Title.Caption;
   Column.Title.Font.Style := [fsbold];
  except
   CDS.IndexName := idxDefault;
  end;
  //
end;


Voce executa ela, no evento OnClick do Titulo do DBGrid

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  ClientDataSet: TClientDataSet;
begin
  if (DbGrid1.DataSource.DataSet is TClientDataSet) then
  begin
    ClientDataSet := (DbGrid1.DataSource.DataSet as TClientDataSet);
    OrdenaDataSetGrid(ClientDataSet, Column, DBGrid1);
  end;
end;



[]s
 
 
Walter Alves Chagas Junior
Belo Horizonte - MG - Brazil
wchag...@bol.com.br
http://www.geocities.com/SiliconValley/Bay/1058
http://delphitocorporerm.blogspot.com/
MSN: whitesock...@hotmail.com
SKYPE: WalterChagasJr


  ----- Original Message ----- 
  From: gugavolcom 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Thursday, August 13, 2009 3:20 PM
  Subject: [delphi-br] Problemas ao ordenar dbgrid pela coluna


    Pessoal, estou desenvolvendo um projeto em Delphi 7 Enterprise, e estou 
montando um código pra ordenar a dbgrid pela coluna que o usuário clicar, estou 
usando um adoquery, e supondo que o conteúdo da sql seja: SELECT * FROM 
PRODUTOS.
  Nao retorna erro algum, só que a dbgrid fica vazia, não aparece nada, já dei 
um showmessage na propriedade sql do adoquery pra ver se estava montando a 
consulta corretamente, e está, mas não está retornando nenhum resultado.

  Dá uma olhada no código, é simples, não é muito prático, mas eu fiz dessa 
maneira, por ser mais simples, não preciso de muitas validações!

  o código é o seguinte:

  procedure Tfrmconsproduto.DBGrid1TitleClick(Column: TColumn);
  var
  campo:string;
  cons:string;
  begin
  cons:=qconsulta.sql.Text;//recebe o sql do adoquery, da consulta feita
  campo:=column.fieldname; // CAMPO RECEBE O NOME DA COLUNA CLICADA,
  application.processmessages; // para considerar algo que aconteça no dbgrid
  qconsulta.sql.clear; // LIMPA A QUERY
  qconsulta.sql.add(cons+' order by '+campo); // ESCREVE O SELECT COM O ORDER BY
  qconsulta.open; // ABRE A QUERY COM A ORDEM ESCOLHIDA.
  lblordenado.caption:='Classificado por : [ '+Column.Title.Caption+' 
]';//escreve na label por qual coluna foi ordenado
  qconsulta.SQL.text:=cons;//Retorna pro sql a consulta sem o order by
  end;

  o que pode ser???

  Abraços galera



  

[As partes desta mensagem que não continham texto foram removidas]

Responder a