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.
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:
- Novo – BtnNovo;
- Gravar – BtnGravar;
- Editar – BtnEditar;
- Deletar –BtnDeletar;
- Cancelar –BtnCancelar;
- Pesquisa –BtnPesquisa;
- Primeiro –BtnPrimeiro;
- Anterior –BtnAnterior;
- Posterior –BtnPosterior;
- Último – BtnUltimo;
Adicione agora ocomponente TImageList e selecione 10 ícones de sua preferência:
Vá até a propriedade images do TBPadrao e aponte para ILPadrao. Depois vá até a propriedade List do TBPadrao.
Agora, coloque um componente da classe TPanel, edite a propriedade caption e arrume o design do form da forma que desejar.
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.
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.