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.
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.
ResponderExcluirdesde já obrigado.
quer dizer utilizando 1 dbnavigator para cada ação.
ExcluirOi Elton,
ExcluirSim claro, o dbnavigator tambem é uma boa opção.
obrigado por comentar.
[]s