quinta-feira, 18 de outubro de 2012

Criando um cadastro padrão ( genérico ) em Delphi

Vamos criar um formulário padrão com o objetivo de utiliza-lo genericamente como base para outros cadastros no sistema.
Primeiro criamos um novo formulário e adicionamos os componentes conforme  abaixo :

TSQLQuery => SqlCadastro
TDataSetProvider => dspCadastro
TClientDataSet => cdsCadastro
TDataSource => dsCadastro
TSQLQuery => SqlMax ( utilizada para buscar o próximo código a ser cadastrado, caso precise).

Incluímos também os botões, Novo, Excluir,Gravar, Cancelar e Fechar, e um painel com um Label para ser utilizado como uma área de mensagens de erros.


Vamos para a programação:

No evento OnKeyDown do Formulário vamos fazer a seguinte programação:
Procedure TFormPadrao.FormKeyDown(Sender: TObject; Var Key: Word;   Shift: TShiftState);
begin
   case Key of
      VK_F2: if btnGravar.Enabled then btnGravar.Click;
      VK_F3: if btnExcluir.Enabled then btnExcluir.Click;
      VK_F5: if btnNovo.Enabled then btnNovo.Click;
      VK_F6: if btnFechar.Enabled then btnFechar.Click;
      VK_F9: if btnCancelar.Enabled then btnCancelar.Click;
      VK_RETURN :SelectNext(ActiveControl,true,true);
      VK_ESCAPE :close;
   end;
End;

O código acima faz com que cada tecla(atalho) especificada seja atribuído ao evento do seu respectivo componente.
Exemplo (VK_ESCAPE) : ao teclar a tecla ESC o sistema irá executar o comando “close”, fechando o formulário.

Ok, agora vamos para a programação dos botões:

      btnNovo :
procedure TFormPadrao.btnNovoClick(Sender: TObject);
begin
  cdsCadastro.Append;
end;

btnExcluir :

procedure TFormPadrao.btnExcluirClick(Sender: TObject);
begin
   if not messagedlg('Deseja excluir o registro atual?',mtConfirmation,[mbYes,mbNo],0)= mrNo then Exit;
   cdsCadastro.Delete;
   { caso a delecao nao aconteca o metodo "ApplyUpdates" irá retornar um valor
   maior que zero, dai o evento "ReconcileError" será ativado e irá ser
   mostrada uma msg para o usuário }
   if cdsCadastro.ApplyUpdates(0) > 0 then
   begin
      cdsCadastro.CancelUpdates;
      Foco(2);
   End;
end;

          btnCancelar :

procedure TFormPadrao.btnCancelarClick(Sender: TObject);
begin
    cdsCadastro.Cancel;
   cdsCadastro.CancelUpdates;
end;

           btnSalvar:

procedure TFormPadrao.btnGravarClick(Sender: TObject);
begin
{ posiciona o cursor no próximo controle ativo. Isto é feito para garantir que, o foco sai do campo ativo, caso o usuário use teclas de atalho para gravar o registro (F2) }
   SelectNext(ActiveControl, True, True);
{ somente irá passar para a rotina de gravacao se estiver      inserindo/alterando algo }
   if not (cdsCadastro.State in [dsEdit, dsInsert]) then Abort;
//se todos os campos obrigatorios estiverem preenchidos, irá gravar os buffer no BD
   if not ValidaPreenchidos(cdsCadastro) then Abort;
   //grava
   cdsCadastro.Post;

   { caso ocorra algum erro na gravacao do registro, o estado continuará
   sendo o de edicao... e uma msg será mostrada ao usuário }
   if cdsCadastro.ApplyUpdates(0) > 0 then
   begin
      //mantem o registro em modo de edição
      cdsCadastro.Edit;
      Abort;
   end;
end;
          btnFechar:
procedure TFormPadrao.btnFecharClick(Sender: TObject);
begin
   close;
end;

Bom com os códigos acima, nosso cadastro padrão servirá como base para a criação de outros cadastros.

3 comentários:

  1. existe tbm um recursos acredito que pouco utilizado (acho que poucos sabem), é a utilização de 1 dbnavigator e criar os buttons da ação desejada no modo visible:= true, e os outros visible:= false, assim vc consegue colocar ações para cada button individual (como vc mostrou). eu utilizo em minhas aplicações e me ajudam muito.

    desde já obrigado.

    ResponderExcluir
    Respostas
    1. quer dizer utilizando 1 dbnavigator para cada ação.

      Excluir
    2. Oi Elton,
      Sim claro, o dbnavigator tambem é uma boa opção.

      obrigado por comentar.

      []s

      Excluir