O DBGrid está ligado a um DataSource, que por sua vez está ligado a um ClientDataSet. Levando em conta este fato, e tb que a classe TColumn possui uma propriedade chamada Grid, da classe TCustomDBGrid, que representa o DBGrid a qual mesma pertence, tem como achar o ClientDataSet usado pelo DBGrid sem precisar fazer essa lambança de criar um novo ClientDataSet. Desse jeito, vais acabar tendo um consumo de memória desnecessário.
Exemplo: procedure TfrmBasico_ComGrid.DBGrid1TitleClick(Column: TColumn); var lCds: TClientDataSet; begin if Column.Grid.DataSource.DataSet is TClientDataSet then begin lCds := TClientDataSet(Column.Grid.DataSource.DataSet); if FOldColumn <> Column then begin FOldColumn := Column; lCds.IndexFieldName := Column.FieldName; end; end; end; Basicamente, é isso. No código acima, assume-se que FOldColumn é um campo privado que guarda a coluna pela qual o dataset do grid (e não o próprio grid) era anteriormente ordenado. Como sugestão de melhoria (aí é por sua conta!), poderíamos acrescentar a alternância da ordenação para ascendente ou decrescente caso a coluna clicada seja a mesma que a anteriormente selecionada. Sds. ________________________________ To: [EMAIL PROTECTED] From: [EMAIL PROTECTED] Date: Thu, 24 Jan 2008 00:13:44 -0200 Subject: [delphi-br] Rotina genérica para ordenação Tenho o form genérico (frmBasico_ComGrid) para pesquisa, com um DBGrid, obviamente ligado à um DataSource, que por sua vez está ligado à um ClientDataSet (mas que muda em cada formulário filho: cdsclientes, cdsparcelas, cdscidades, cdsprofissoes, etc). Estou tentando manipular o evento DBGrid1TitleClick, no formulário básico para ordenação pelas colunas, mas preciso saber o nome do CDS que está sendo manipulado no momento da ordenação, então fiz de acordo com o código abaixo. Compila normalmente, mas dá erro em tempo de execução, dizendo que o nome do cds não é válido, e a mensagem de erro mostra o nome do CDS de forma correta, só que entre aspas duplas. OBS: 'dm.' -> é o nome do datamodule. Se alguem puder me orientar onde estou errando, ou apontar outro caminho, antecipadamente meus agradecimentos. procedure TfrmBasico_ComGrid.DBGrid1TitleClick(Column: TColumn); Var cds:TClientDataSet; str:TComponentName; begin CDS := TClientDataSet.Create(Self); str:=DBGrid1.DataSource.DataSet.Name; cds.Name:= 'dm.' + str; if Assigned(OldColumn) then OldColumn.Title.Color:=DBGrid1.FixedColor; cds.IndexFieldNames:=Column.FieldName; Column.Title.Color:=clRed; OldColumn:=Column; end; Atenciosamente waldir silva _________________________________________________________________ Veja mapas e encontre as melhores rotas para fugir do trânsito com o Live Search Maps! http://www.livemaps.com.br/index.aspx?tr=true