Í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
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo