Olá Galera, hoje estaremos trabalhando como conceito de herança no Delphi 2010. Será esse um trabalho muito interessante,pois elimina a necessidade de se trabalhar com códigos iguais repetidas vezes.

O objetivo principal de se fazer o Form Padrão de nosso artigo é eliminar todo o código necessário para realizar o cadastro, edição e exclusão dos registros do banco de dados.

Vamos, então, dar início ao nosso aplicativo. Crie um novo projeto. Vá te File > New > VCL FormsApplication – Delphi. Salve o formulário como FrmPrincipal e o Projeto comoProjTcxScheduler.

image001

Criaremos, em seguida, um Form padrão que possuirá os seguintes componentes (File > New > Form – Delphi):

  • TBPadrao: TToolBar;
  • PnlPadrao: TPanel;
  • DSPadrao: TDataSource;
  • IlPadrao: TImageList;

Primeiro, adicione o componente da Classe TToolBar e dê o Nome de TBPadrao a ele. Adicione 10 (dez) botões neste componente e dê a eles os seguintes Captions / Nomes, na seguinte ordem:

  1. Novo – BtnNovo;
  2. Gravar – BtnGravar;
  3. Editar – BtnEditar;
  4. Deletar –BtnDeletar;
  5. Cancelar –BtnCancelar;
  6. Pesquisa –BtnPesquisa;
  7. Primeiro –BtnPrimeiro;
  8. Anterior –BtnAnterior;
  9. Posterior –BtnPosterior;
  10. Último – BtnUltimo;
image002

Adicione agora ocomponente TImageList e selecione 10 ícones de sua preferência:

image003

Vá até a propriedade images do TBPadrao e aponte para ILPadrao. Depois vá até a propriedade List do TBPadrao.

image004

Agora, coloque um componente da classe TPanel, edite a propriedade caption e arrume o design do form da forma que desejar.

image005

Adicione um componente da classe TDataSource e nomeie como DSPadrao.

Com a tela pronta, basta agora, adicionar os comandos para os botões:

Dê um duplo clique sobre o botão Novo e adicione o comando abaixo:

 
DSPadrao.dataset.insert;

Dê um duplo clique sobre o botão Gravar e adicione o comando abaixo:

 
DSPadrao.dataset.post;
DSPadrao.dataset.filtered := false;

Dê um duplo clique sobre o botão Editar e adicione o comando abaixo:

 
DSPadrao.datset.edit;

Dê um duplo clique sobre o botão Deletar e adicione o comando abaixo:

 
if MessageDlg('Deseja Excluir o Registro', mtconfirmation, [mbYes, mbNo], 0)
    = mrYes then
Begin
   DSPadrao.dataset.delete;
End;

Dê um duplo clique sobre o botão Cancelare adicione o comando abaixo:

 
With DsPadrao.Dataset Do
Begin
  Cancel;
  Filtered := False;
End;

Dê um duplo clique sobre o botão Primeiroe adicione o comando abaixo:

 
DSPadrao.dataset.first;

Dê um duplo clique sobre o botão Anteriore adicione o comando abaixo:

 
DSPadrao.dataset.prior;

Dê um duplo clique sobre o botão Posteriore adicione o comando abaixo:

 
DSPadrao.dataset.next;

Dê um duplo clique sobre o botão Último e adicione o comando abaixo:

 
DSPadrao.dataset.last;

Com o objetivo de enfatizar o componente que tem foco vamos criar a procedure ChangeEnter e para retornar as propriedades do componente que deixou de ter foco, vamos criar a procedure ChangeExit. Para isso declare as duas funções na área Private do Form:

 
procedure ChangeEnter(Sender: TObject);
procedure ChangeExit(Sender: TObject); 

Declare em Uses DBCtrls para que possa reconhecer os edits, combos e memos.

Aperte Ctrl + Shift + C para que o código inicial das procedures seja criado.

A procedure ChangeEnter faz com que o componente em foco receba uma cor verde clara, se destacando dos outros componentes. Para isso:

 
procedure TFrmPadrao.ChangeEnter(Sender: TObject);
begin
  if Sender is TDBEdit then
    TDBEdit(Sender).Color := $00E6FED8
  else if Sender is TDBLookupComboBox then
    TDBLookupComboBox(Sender).Color := $00E6FED8
  else if Sender is TDBComboBox then
    TDBComboBox(Sender).Color := $00E6FED8
  else if Sender is TDBMemo then
    TDBMemo(Sender).Color := $00E6FED8;
end;

A procedure Change Exit faz com que o componente que acabou de perder o foco volte a ter suas propriedades de coriniciais.

 
procedure TFrmPadrao.ChangeExit(Sender: TObject);
begin
  if Sender is TDBEdit then
    TDBEdit(Sender).Color := clWindow
  else if Sender is TDBLookupComboBox then
    TDBLookupComboBox(Sender).Color := clWindow
  else if Sender is TDBComboBox then
    TDBComboBox(Sender).Color := clWindow
  else if Sender is TDBMemo then
    TDBMemo(Sender).Color := clWindow;
end;

No evento OnCreate do form, passam os então as procedures acima para os componentes que serão adicionados na tela. O evento OnEnter de cada componente receberá a procedure ChangeEnter e o evento OnExit receberá a procedure Change Exit.

 
procedure TFrmPadrao.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    if Components[I] is TDBEdit then
    begin
      TDBEdit(Components[I]).OnEnter  := ChangeEnter;
      TDBEdit(Components[I]).OnExit   := ChangeExit;
    end
    else
    if Components[I] is TDBLookupComboBox then
    begin
      TDBLookupComboBox(Components[I]).OnEnter := ChangeEnter;
      TDBLookupComboBox(Components[I]).OnExit  := ChangeExit;
    end
    else 
    if Components[I] is TDBComboBox then
    begin
      TDBComboBox(Components[I]).OnEnter := ChangeEnter;
      TDBComboBox(Components[I]).OnExit  := ChangeExit;
    end
    else
    if Components[I] is TDBMemo then
    begin
      TDBMemo(Components[I]).OnEnter   := ChangeEnter;
      TDBMemo(Components[I]).OnExit    := ChangeExit;
    end
  end;
end;

Para efeito de organização, iremos criar duas procedures com o seguinte objetivo: habilitar ou desabilitar o componente mediante o status do em que estiver o dataset em relação ao banco de dados.Exemplo: Se clicarmos no botão Novo, os botões Novo e Editar devem ficar desabilitados.

No campo Private da classe declare as seguintes procedures:

 
procedure HabilitaControles;
procedure HabilitaControlesVisuais(Status: Boolean);

Aperte Ctrl + Shift + C para que o códigoinicial das procedures seja criado.

 
procedure TFrmPadrao.HabilitaControles;
begin
  BtnNovo.Enabled     := not(DSPadrao.DataSet.State in [dsInsert, dsEdit]);
  BtnGravar.Enabled   := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
  BtnEditar.Enabled   := (DSPadrao.DataSet.State in [dsBrowse]);
  BtnDeletar.Enabled  := (DSPadrao.DataSet.State in [dsBrowse, dsEdit]);
  BtnCancelar.Enabled := (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
  BtnPesquisa.Enabled := not (DSPadrao.DataSet.State in [dsInsert, dsEdit]);
end;

procedure TFrmPadrao.HabilitaControlesVisuais(Status: Boolean);
var
  I: Integer;
begin
  for I := 0 to ComponentCount - 1 do
  begin
    if Components[I] is TDBEdit then
      TDBEdit(Components[I]).Enabled := Status
    else if Components[I] is TDBLookupComboBox then
      TDBLookupComboBox(Components[I]).Enabled := Status
    else if Components[I] is TDBComboBox then
      TDBComboBox(Components[I]).Enabled := Status
    else if Components[I] is TDBMemo then
      TDBMemo(Components[I]).Enabled := Status;
  end;
end;

Agora, basta chamar as procedures dentrodos botões já criados:

HabilitaControles;(BtnNovo, BtnGravar, BtnEditar, BtnDeletar, BtnCancelar, BtnPrimeiro,BtnAnterior, BtnProximo, BtnUltimo);HabilitaControlesVisuais(True);(BtnNovo, BtnEditar);HabilitaControlesVisuais(False);(BtnGravar, BtnDeletar, BtnCancelar);

Para identificarmos se há algum problema de conexão com o banco de dados, colocaremos o código abaixo no evento onCreatedo Form Padrão:

 
Try
    DSPadrao.DataSet.Open;
    HabilitaControles;
    HabilitaControlesVisuais(False);
  except
    on e: Exception do
    begin
      ShowMessage('Erro ao conectar base de dados' +#13+
                  'Erro : ' + E.Message +#13+
                  'Classe : ' + E.ClassName);
    end;
End;

Pronto! Agora para utilizar este formulário padrão para as telas de cadastro de registro, basta ir em File > New >Other > Inheritable Items > FrmPadrao.

image006

Seu novo formulário herdará todas as características do formulário padrão.

Com isso finalizamos o artigo onde você pode agora criar outros forms com base no padrão.

Um abraço, e até o próximo artigo.