Vamos falar agora de índices persistentes, eles são criados em memória e podem ser reutilizados, e nos possibilita ordenar em ordem crescente e decrescente em tempo de execução do projeto.

            Iremos juntar tudo o que aprendemos para criarmos um método para ordenar os registros em ordem crescente e decrescente;

            A Idéia é o usuário clicar na coluna desejada e ele ordenar em ordem crescente e quando clicar novamente ele ordenar em ordem decrescente a mesma coluna. Vamos a prática.

No evento OnTitleClick do DbGrid coloque o seguinte código:

 

1     procedure TfrmPrincipal.dbgPessoaTitleClick(Column: TColumn);

2     var

3          vName:String;  

4          Opcao:TIndexOptions;

5     begin

6     if cdsPessoa.IndexName = Column.FieldName + '_ASC' then

8     begin

9          vName:= Column.FieldName + '_DESC';

10        Opcao:= [ixDescending];

11   end

12   else

13   begin

14        vName:= Column.FieldName + '_ASC';

15        Opcao:= [];

16   end;

17   if cdsPessoa.IndexDefs.IndexOf(vName) < 0 then

18   begin

19        cdsPessoa.AddIndex(vName,Column.FieldName, Opcao);

20        cdsPessoa.IndexName:=vName;

21        cdsPessoa.First;

22   end;

      end;

 

Na linha 3 e 4 - Crio dois tipos de variáveis, a primeira irá receber o nome do índice e a segunda do tipo TIndexOptions é para receber as opções da propriedade Options do IndexDefs.

Na linha 6 - Verifico se o ClientDataSet já está ordenado em ordem crescente, porque se ele estiver é porque eu desejo que ele ordene em ordem decrescente.

Na linha 9      Dou nome ao meu índice, sabendo que ele irá chamar o nome da coluna mais anderlaine(_) DESC.

Na linha 10 - Eu defino que a variável opcao, que é do tipo TIndexOptions, irá receber as opções deste índice, aqui eu defino que ela receberá o formato decrescente. Poderia também definir que esse índice será único ou o primeiro da lista a ser exibido utilizado na propriedade options do IndexOptions como ixUnique, ixPrimary, mas não seria adequado para o nosso código.

Na linha 12 a 14 Será executada caso o índice vName esteja ordenado em ordem decrescente, ele receberá como nome o nome da coluna mais anderlaine(_) ASC.

Na linha 15    A variável opcao não receberá valor nenhum, porque o valor crescente já é predefinido do Delphi.

Na linha 17 e 19 Verifico se o índice vName já exista, se ele não existir eu crio ele na linha 19, a propriedade AddIndex me pede como parâmetro o nome do índice (vName) a coluna que queremos ordenar (Column.FieldName) e o parâmetro  opcao, sendo que o  parâmetro opcao é as opções do índice  definido no if anterior, com suas propriedades pré-definidas na opção Options do IndexOptions, podendo ser crescente ou decrescente .

 


Fico por aqui e no próximo iremos criar uma Unit para armazenarmos o nosso código, até lá

 

 

Rubens Antunes

Autor do Livro: Delphi – Faça Uma Aplicação Comercial