Índice: Criando uma Unit - Delphi

Veja neste artigo como criar uma ordenação no ClientDataSet e guardar esta função em uma Unit


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

5TOrdenar = Class

6public

7class procedure orderna(var cds : TClientDataSet;var dbg : TDBGrid;column : TColumn);

8end;

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

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

19Opcao:= [ixDescending];

20  end

21  else

22  begin

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

24Opcao:= [];

25  end;

26  if cds.IndexDefs.IndexOf(vName) < 0 then

27  begin

28cds.AddIndex(vName,Column.FieldName, Opcao);

29cds.IndexName:=vName;

30cds.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

3TOrdenar.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


Artigos relacionados