Quick Tips: Ordenação no DBGrid – Parte 2
Nesta quick tip veremos como fazermos a ordenação crescente e decrescente na DBGrid quando o usuário clicar no título da coluna.
Na quick anterior nós vimos como ordenar uma coluna de forma crescente. Nesta veremos como fazer esta ordenação de forma decrescente. Toda vez que o usuário clicar na mesma coluna para ordenar, nós iremos inverter o tipo de ordenação, por exemplo, temos a grid ordenada pela coluna FIRST_NAME de forma crescente, ao clicarmos nesta coluna a ordenação passará a ser decrescente, se clicarmos novamente, voltará a ser crescente.
Para que isso seja possível, precisaremos armazenar qual a coluna ordenada anteriormente, para sabermos se a coluna que está sendo ordenada no momento é a mesma ou não. Para isso vamos declarar uma variável chamada OldColumn no escopo privado do formulário.
Private
OldColumn:TColumn;
Após isso, vamos alterar o nosso código do TitleClick do DBGrid para que fique da seguinte forma:
procedure
TForm1.DBGridPrincipalTitleClick(Column: TColumn);
var
OrdenaDescAnt:Boolean;
Idx:TIndexDef;
Begin
If Not TClientDataSet(Column.Grid.DataSource.DataSet).Active Then
Abort;
TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.update;
//se tiver coluna anterior
if Assigned(OldColumn) then
begin
//Verifica se o índice atual é descendente
OrdenaDescAnt := (ixDescending in TClientDataSet(OldColumn.Grid.DataSource.DataSet).IndexDefs.Find(OldColumn.Field.FieldName).Options);
//Remove index existente
TClientDataSet(OldColumn.Grid.DataSource.DataSet).DeleteIndex(OldColumn.Field.FieldName);
end;
//Verifica se o index da lista default do dataSet
if(TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.IndexOf(Column.Field.FieldName)) > -1 then
Idx := TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.Find(Column.Field.FieldName)
else
idx := nil;
//Se estava configurado para ordem descendente ou
//se clicou em uma coluna diferente da anterior
//Então ordena de forma ascendente
if (OrdenaDescAnt)or(OldColumn <> Column)then
begin
//se index nao estiver criado entao adiciona, senao remove configuração descendente
if(Idx = nil)then
TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [], '', '', 0)
else
idx.Options := idx.Options - [ixdescending];
end
else
begin
//se index nao estiver criado entao adiciona, senao adiciona configuração descendente
if(Idx = nil)then
TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [ixdescending], '', '', 0)
else
idx.Options := idx.Options + [ixdescending];
end;
OldColumn := Column;
TClientDataSet(Column.Grid.DataSource.DataSet).IndexName := Column.Field.FieldName;
end;
É isso aí pessoal, vou ficando por aqui.
Fiquem a vontade para criticar, tirar dúvidas e sugerir
novos temas.
Abraço.
Ricardo Coelho