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]