Será que toda vez que precisarmos ordenar um ClientDataSet, teremos que colocar esse código todo no evento OnTitleClick, claro que não, para isso podemos utilizar uma Unit para guardar o nosso código e ser utilizado em qualquer parte do nosso projeto. Vamos a prática, Crie uma Unit clicando em File/New/Unit Delphi, a unit é muito comum em Orientação a objeto. Ela nos permite criar classes é métodos entre outras funcionalidades. Salve-a como Uordenar e Coloque o seguinte código:
1 unit Uordenar;
2 interface
3 Uses DBClient, DBGrids, Graphics, DB;
4 type
5 TOrdenar = Class
6 public
7 class procedure orderna(var cds :
TClientDataSet;var dbg : TDBGrid;column : TColumn);
8 end;
9 implementation
Tecle Ctrl+Shift+C para implementarmos a classe, podemos perceber que o Delphi criou essa classe logo mais abaixo, coloque o seguinte código:
{ TOrdenar }
10 class procedure TOrdenar.orderna(var cds: TClientDataSet; var dbg: TDBGrid;
11 column: TColumn);
12 var
13 vName:String;
14
Opcao:TIndexOptions;
15 begin
16 if cds.IndexName = Column.FieldName + '_ASC'
then
17 begin
18 vName:= Column.FieldName + '_DESC';
19 Opcao:= [ixDescending];
20 end
21 else
22 begin
23 vName:= Column.FieldName + '_ASC';
24 Opcao:= [];
25 end;
26 if cds.IndexDefs.IndexOf(vName) < 0 then
27 begin
28 cds.AddIndex(vName,Column.FieldName,
Opcao);
29 cds.IndexName:=vName;
30 cds.First;
31 end;
end;
Nota
Class procedure é um método que opera sobre a classe e não sobre a instância dessa classe. Ele pode ser executado sem a necessidade se criar o objeto da classe. Podemos utilizar também um Class function.
Este é o mesmo código do evento OntitleClick do DbGrid a diferença que aqui nós não sabemos o nome do ClientDataSet nem o do DbGrid, muito menos o campo o qual o usuário escolheu para ordenar. Para isso utilizamos variáveis que irão receber os dados destes componentes. Iremos utilizar três variáveis:
cds do tipo TClientDataSet: Ele receberá um ClientDataSet.
dbg do tipo TDBGrid: Receberá um DbGrid.
Column do tipo TColumn: Receberá a coluna e seu fieldname que o usuário escolheu para ordenar.
Para fazermos uso dessa unit precisamos passar esses três paramentos, para que esse método seja executado.
Salve a nossa Unit e retorne ao nosso formulário e coloque o seguinte código no evento OnTitleClick:
1 procedure TfrmPrincipal.dbgPessoaTitleClick(Column:
TColumn);
2 begin
3 TOrdenar.orderna(cdsPessoa, dbgPessoa,
Column);
4 end;
Coloque agora na clausula uses do formulário o nome da unit Uordenar, execute a aplicação e veja que estamos usando agora o código da unit. Você pode declarar essa unit em qualquer parte do seu projeto e fazer uso em qualquer DbGrid do seu projeto que esteja ligado é claro a um ClientDataSet.
Dica
Para criarmos uma classe basta digitar class e clicar em Ctrl+J e o
Delphi criará a estrutura da classe.
Mudando
a cor da coluna e restringindo campos
Podemos também definir para o usuário, qual coluna está ordenado o nosso índice, facilitando assim a sua visualização, vamos determinar que toda vez que o usuário clicar na coluna ela mudará de cor, eu escolhi a cor verde mas você pode escolher qualquer cor que tenha na propriedade Color do DbGrid.
Em nossa Unit coloque o seguinte código como demonstra a listagem 03:
Listagem 03 – Definindo a Cor da Coluna
var
1 I :
Integer;
vName:String;
Opcao:TIndexOptions;
begin
2 if column.Field.FieldKind in [fkCalculated,
fkLookup, fkAggregate] then
3 Exit;
4 if column.Field.DataType in [ftBlob, ftMemo]
then
5 Exit;
6 for i := 0 to dbg.Columns.Count -1
do
7 begin
8
dbg.Columns[i].Title.Font.Color := clBlack;
9
Column.Title.Font.Color := clGreen;
10 end;
Linha 1: Crio uma variável para controlar o nosso laço utilizando um for.
Linha 2: Verifico se o campo clicado pelo usuário é do tipo Calculado, Lookup ou agregado, caso venha ser eu dou um exit na linha 3 e saio do método.
Linha 4: Verifico também se o usuário clicou em algum campo Blob ou Memo, caso tenha clicado eu saio também do método.
Linha 6: Mando ele percorrer todas as colunas do DbGrid.
Linha 8: Passo a cor original da coluna e logo depois eu coloco a cor desejada na linha 9
Execute a aplicação.
Dica
Campos Calculados, Lookup, Agregados, Blob e Memo, não podem ser ordenados pelo ClientDataSet, o único campo de memória que pode é o InternalCalc.
Fico por aqui, até o próximo.
Rubens Antunes
Autor do Livro: Delphi – Faça Uma Aplicação Comercial