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