Herança Visual

Aplicando herança visual em seu sistema

Olá a todos os colegas. Este artigo irá mostrar mais um recurso da criança Delphi que apesar de seus 10 anos de idade, já tem características de adulto.

Vamos aprender hoje como implementar herança visual em seu sistema. Com esse recurso você irá economizar bastante na manutenção de seu sistema.

Vamos imaginar o sistema, ele tem vários formulários como os de cadastros, movimentos etc. estes formulário tem operações iguais como navegação, inserção, exclusão e edição de registros, o visual é igual para todos para manter padrão, mudando somente algumas particularidades como título ou alguns componentes a mais. Com a herança visual não precisamos repetir toda a escrita, e componentes em cada um deles, basta criar um e os outros herdariam dele.

Tentarei através deste artigo, fazer com que vocês entendam e implementem em seu sistema.

Criando um novo Projeto

File->New->VCL Forms Application – Delphi for Win32, renomei o formulário para “frmPrincipal”, em seguida insira um TMainMenu e renome-o para MNU, dê dois clique no MNU, para criar o menu Cadastro com subitens Clientes e Fornecedores e o menu Ajuda com subitens Sobre, veja a Figura 1. Agora salve o projeto, dando o nome do “frm_Principal.pas” para o formulário e “prj_Heranca” para o projeto.

isaque_her1.gif 

Figura 1. Formulário da aplicação.

Criando Formulário Padrão

Vamos criar agora o formulário padrão, que servirá de base para todos os formulários do seu sistema. Neste formulário terá operações, propriedades e procedimento que servirá para quem os vai herdar. Vá em File->New->Form, renomei-o para “frmHeranca”, em seguida insira no formulário um TLabel->Align = alTop / Alignment = taCenter / Font.Size = 20 / Caption = “Título do Formulário”, um TPanel->Align = alBottom, no panel insira dez TButtons, cada TButton mude a propriedade Caption e a propriedade Name. Exemplo, se o Caption = “First” então a propriedade Name = “btnFirst”, assim em todos os botões. Vejam a Figura 2.

isaque_her2.gif 

Figura 2. Formulário padrão a ser herdado.

Criando Propriedade no Formulário Padrão

As propriedades servem para dar novas características ao formulário. Exemplo, “Como posso disparar um First, Prior, Post, Insert etc, se não tenho um componente de acesso a dados?”. Resposta, criando uma propriedade no formulário do tipo do componente usado para  acesso aos dados, esse propriedade irá receber o componente, que em nosso caso é do tipo TClientDataSet. Como fazer isto? Veja a Listagem 1. É através desta propriedade, que as operações serão feitas.

 

type

  TfrmHeranca = class(TForm)

  private

      { Private declarations }

      FDataSet: TClientDataSet;

  public

      { Public declarations }

      property DataSet: TClientDataSet read FDataSet write FDataSet;

     

end;

 

implementation

end.

Listagem 1. Classe de controle registros.

Criando Eventos dos Botões

Vamos agora escrever no evento onClick de cada botão, Listagem 2. Observem aqui que as escritas como Post, Edit, Delete, estão sendo feitas em cima da propriedade, iremos entender melhor quando criarmos o primeiro formulário herdando o formulário padrão.

 

procedure TfrmHeranca.FormShow(Sender: TObject);

begin

  DataSet.Active := True;

end;

 

procedure TfrmHeranca.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  DataSet.Active := False;

end;

 

procedure TfrmHeranca.btnFirstClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.First;

end;

 

procedure TfrmHeranca.btnPriorClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Prior;

end;

 

procedure TfrmHeranca.btnNextClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Next;

end;

 

procedure TfrmHeranca.btnLastClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Last;

end;

 

procedure TfrmHeranca.btnInsertClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Insert;

end;

 

procedure TfrmHeranca.btnDeleteClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Delete;

end;

 

procedure TfrmHeranca.btnEditClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Edit;

end;

 

procedure TfrmHeranca.btnPostClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Post;

end;

 

procedure TfrmHeranca.btnCancelClick(Sender: TObject);

begin

   if (DataSet <> nil) then DataSet.Cancel;

end;

 

procedure TfrmHeranca.btnApplyClick(Sender: TObject);

begin

   if (DataSet <> nil) then

   begin

      if (DataSet.ChangeCount > 0) then DataSet.ApplyUpdates(0);

   end;

end;

Listagem 2. Eventos onClick de cada botão.

Terminamos nosso formulário padrão. Todo tipo de operação e procedimentos que sirvam para todos os seus formulários do sistema, você vai criá-lo no formulário padrão, assim todos que herdarem dele já terão estas operações e procedimentos também.

Criando Formulário, Herdando o Padrão

Usando o Delphi 2005, vá em File->New->Other..., que será mostrado um dialogo como o na Figura 3. Selecione o Item Categories->Inheritable Items->frmHeranca, observem que o opção Inherit que está selecionada, agora clique OK.

isaque_her3.gif 

Figura 3. New Item do Delphi 2005

Será criado para nós um novo formulário, nele inclua um TClientDataSet, mude seu Name = CDS / FileName = “.\Cliente.xml” (este arquivo estará junto aos fontes), um TDataSource, mude seu Name = DS e a propriedade DataSet para CDS, dois TLabel, um com o Caption = “Código :” e outro com “Nome :”, dois TDBEdit mudando seus DataSource = DS, o primeiro mude o DataField para “CODIGO” e o segundo para “NOME”. Agora mude o Caption do Label como na Figura 4.

Mude o Name do Formulário para “frmCliente” e salve-o como frm_Cliente.pas.

isaque_her4.gif 

Figura 4. Formulário herdado do padrão

Notem que o formulário criado tem a mesma aparência do formulário padrão criado por nós. Qual a vantagem? Lembram que no formulário padrão foi criado os eventos para cada botão? Então, ao herdar um formulário foi herdado as escritas nele contida, e já temos toda aquela escritas feitas, neste formulário também. Outro detalhe, é que se olhar o .PAS deste formulário não verá as escritas feitas pois ao clicar em um botão será disparado a escrita feita dentro do formulário padrão, e se precisar criar algum evento em algum dos botões isso pode ser feito sem perder o que já foi escrito no evento do padrão, observem na Listagem 3. a palavra inherited que irá dispara o evento do padrão. E como poderá disparar o evento do formulário padrão, pois se no evento btnFirstOnClick escrevemos “DataSet.First”? Então como que este formulário iria assumir que o First tem que ser no CDS e não na propriedade DataSet? Para isso iremos disparar o evento OnCreate deste formulário como na Listagem 3. nele atribua a propriedade DataSet = CDS. Mas a propriedade DataSet não foi criada no formulário padrão? Sim, mas quando você herda o formulário, quem herda passa a ter também as propriedades de quem ele herdou.

 

procedure TfrmCliente.FormCreate(Sender: TObject);

begin

  inherited;

  // Dizemos aqui que o DataSet do formulário pai é o CDS.

  // Assim toda operação será feita no CDS deste formulário.

  DataSet := CDS;

end;

Listagem 3. Eventos onCreate do formulário.

Repita todo procedimento para criar outro formulário herdando do padrão. Neste você irá mudar do CDS a propriedade FileName = “.\Fornecedor.xml” (este arquivo estará junto aos fontes) o Caption do Label como na Figura 5. E os DataFields dos TDBEdits, o primeiro para “CODIGO” e o segundo para “RAZAO”. Mude o Name do Formulário para “frmFornecedor” e salve-o como frm_Fornecedor.pas, dispare o evento onCreate do formulário, nele escreva a Listagem 4.

isaque_her5.gif 

Figura 5. Formulário herdado do padrão

procedure TfrmFornecedor.FormCreate(Sender: TObject);

begin

  inherited;

  // Dizemos aqui que o DataSet do formulário pai é o CDS.

  // Assim toda operação será feita no CDS deste formulário.

  DataSet := CDS;

end;

Listagem 4. Eventos onCreate do formulário

Só nos falta agora fazer as chamadas dos formulários nos menus. No frmPrincipal coloque na clausula uses as units frm_Fornecedor e frm_Cliente, depois nos menus Cliente e Fornecedor, escreva a chamada de cada formulário como na Listagem 5.

...

uses frm_Cliente, frm_Fornecedor;

...

procedure TfrmPrincipal.Cliente1Click(Sender: TObject);

begin

   frmCliente.Show;

end;

 

procedure TfrmPrincipal.Fornecedor1Click(Sender: TObject);

begin

   frmFornecedor.Show;

end;

Listagem 5. Eventos onCreate do formulário.

Nota: O formulário padrão não precisa ser criado, basta ele está em seu projeto.

Conclusões

Herança visual é mais um dos milhares de recursos que a ferramenta Delphi noa oferece. Aqui aprendemos como criar um formulário com operações e procedimentos padrões que possa ser herdados por quase todos os formulário de seu sistema, sem você ter que escrever em cada um deles. Aprendemos também que ao usarmos este recurso nossa manutenção reduz, pois se tivermos que mudar algum código isto será feito no formulário padrão e refletirá em todos seus descendentes.