terça-feira, 20 de novembro de 2007

Construção de Componentes V – Parte A

No artigo anterior começamos a construir o componente Gerenciador de Layout de Grid, TManagerGridZn. Vimos como fazer uma package no Delphi 2006, associar outras units a ela e etc. Como fazer isso no Delphi 7 também já foi exemplificado nos primeiros artigos sobre o assunto. Para programarmos um pequeno módulo a fim de testarmos o novo componente precisamos instalar a package, para fazer isso basta clickar com o botão direto sobre ela, no Project Manager e selecionar a opção “Install”.



Projeto teste Gerenciador de Layout de Grid (TesteGerencLayoutGrid.bdsproj): Inicie uma nova aplicação no Delphi, no From1 adicione os seguintes componentes:
1 – TClientDataSet
Name = CdsDados

1.1 Adicione dois TFields ao CdsDados;

TIntegerField
Name = CdsDadosID_Dado
Field Kind = fkData

TStringField
Name = CdsDadosDescDado
Field Kind = fkData


TStringField
Name = CdsDadosCoisas
Field Kind = fkData



2 – TdataSource (Data Access)
Name = DsDados
DataSet = CdsDados

3 - TDBGrid (Data Controls):
Name = DDGrid1
Align = alBottom
DataSource = DsDados

3.1 – Adicione duas colunas ao Grid, correspondentes aos três
TFields do CdsDados

4 -TManagerGridZn (Estação ZN)
Grid = DBGrid1

5 - TBitBtn (Addititional)
Name = BtnActivar
Caption = 'Ativar'

cerifique-se de que o ManagerGridZn (TManagerGridZn), esteja associado ao DBGrid1. O DBGrid tem que estar associado ao DsDados(TDataSource), que deve estar associado ao CdsDados(TClientDataSet).

No evento OnClick do BtnAtivar codifique:


procedure TForm1.BtnActivarClick(Sender: TObject);
var
i: Integer;
begin
(* Ativa o Dataset*)
if not CdsDados.Active then
CdsDados.CreateDataSet;
//Preenche o DataSet
for i := 0 to 30 do
begin
CdsDados.InsertRecord([i, Format('Dado %d', [i]), 'Bla!!!!']);
end;
end;


Pronto!! That’s it!!!
Chega de código .... tá bom??? Também acho ... hehehe

Note que para trabalhar com a classe que criamos nào foi necessário NENHUMA linha código.

Execute o programa e teste conforme os screenshots abaixo:

Primeiro carregue os dados clickando no botão “Ativar”. Com o botão direito do mouse, chame o menu popup que o componente TManagerGridZn criou e associou ao grid. Selecione a 1° opção.



Altere as propriedades da coluna sobre a qual vc clickou.



Ok, fácil? Agora você pode intuitivamente manter um layout personalizado para qualquer grid, em qualquer um dos seus projetos.





Podemos concluir, a partir deste exemplo, que um programa bem modularizado, onde o grau de acoplamento é reduzido ao máximo, propicia o reuso de maneira eficiente. Também, que é possível a construção de componentes de fácil consumo (mínima curva de aprendizado por parte do desenvolvedor que vai usar o componente em seus programas).
Outro ponto importante a destacar é que com essa abordagem podemos desenvolver novas funcionalidades para sistemas que foram construídos por outros (sistemas antigos, legados), que precisam sofrer manutenção, demandando para isso um grau mínimo de intervenção no código dos desenvolvedores originais. Sobretudo porque, a maioria deles são extremamente sensíveis a qualquer intervenção, mínima que seja, em seus fontes.

A seguir, finalizaremos a implementação do componente “TManagerGridZn”, pois ainda faltam ser codificadas as funcionalidades de recuperar as colunas que o usuário definir como invisíveis, “Ver Colunas Escondidas” (Invisíveis), e o restore default values “Restaurar configuração original”.

Código completo da unit1.pas



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBClient, Grids, DBGrids, ManagerGridZn;

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
CdsDados: TClientDataSet;
dsDados: TDataSource;
CdsDadosID_Dado: TIntegerField;
CdsDadosDescDado: TStringField;
BtnActivar: TBitBtn;
ManagerGridZn1: TManagerGridZn;
CdsDadosCoisas: TStringField;
procedure BtnActivarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtnActivarClick(Sender: TObject);
var
i: Integer;
begin
if not CdsDados.Active then
CdsDados.CreateDataSet;

for i := 0 to 30 do
begin
CdsDados.InsertRecord([i, Format('Dado %d', [i]), 'Bla']);
end;

end;

end.



unit1.dfm


object Form1: TForm1
Left = 223
Top = 168
Caption = 'Form1'
ClientHeight = 375
ClientWidth = 531
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 0
Top = 80
Width = 531
Height = 295
Align = alBottom
DataSource = dsDados
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
Columns = < expanded =" False" fieldname =" 'ID_Dado'" visible =" True" expanded =" False" fieldname =" 'DescDado'" visible =" True" expanded =" False" fieldname =" 'Coisas'" visible =" True">
end
object BtnActivar: TBitBtn
Left = 408
Top = 8
Width = 75
Height = 25
Caption = 'Ativar'
TabOrder = 1
OnClick = BtnActivarClick
end
object CdsDados: TClientDataSet
Aggregates = <>
Params = <>
Left = 316
Top = 40
object CdsDadosID_Dado: TIntegerField
FieldName = 'ID_Dado'
end
object CdsDadosDescDado: TStringField
FieldName = 'DescDado'
Size = 30
end
object CdsDadosCoisas: TStringField
FieldName = 'Coisas'
end
end
object dsDados: TDataSource
DataSet = CdsDados
Left = 388http://www.blogger.com/img/blank.gif
Top = 44
end
object ManagerGridZn1: TManagerGridZn
Grid = DBGrid1
Left = 80
Top = 12
end
end



Continuação da série Construção de Componentes

2 comentários:

  1. Voce poderia me enviar o componente ManagerGridZn? Não consegui fazer ele funcionar corretamente seguindo o seu artigo, o form GridProfileManagerZnForm não esta aparecendo os dados e nem permitindo mudar os componente DBEdit, DbComobox... Acredito que seja por causa do DataSource destes componentes DBware. As demais funcionalidades eu consegui. Desde já muito obrigado...

    ResponderExcluir
  2. MGreich,
    Tenho que arranjar um temipinho livre pra fazer upload desse códido.
    Alias, eu já deveria ter feito isso. O problema é que nunca sobra tempo.
    Mil coisas acontecento e algo sempre acaba caindo no esquecimento. Farei isso em breve.
    Obrigado por ler e participar do Estação ZN!
    Tks!

    ResponderExcluir

 
BlogBlogs.Com.Br