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