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

Responder a