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