Utilizando os eventos do TDataSouce para controlar os botões de uma tela de cadastro
Neste artigo veremos como manipular o estado dos botões de uma tela de cadastro através dos eventos disponíveis no componente DataSource. Através dos eventos OnStateChange e OnDataChange podemos habilitar e desabilitar os botões do formulário de cadastro de acordo com estado ou posição do registro na tela.
Nota. Neste artigo foram utilizados o Delphi 7 e o InterBase 7.5 para a criação do exemplo.
Criando a aplicação de exemplo
Inicie uma nova aplicação Delphi (File|New|Application), altere o nome do formulário para FrmPrincipal e save sua unit como untFrmPrincipal.pas. Para o arquivo de projeto de o nome de Customer.dpr. Neste exemplo utilizaremos o banco de dados Employee.gdb o qual acompanha a instalação do InterBase. Adicione ao formulário os componentes SQLConnection (dbExpress), SQLDataSet (dbExpress), DataSetProvider (Data Access), ClientDataSet (Data Access) e Data Source (Data Access). Configure os mesmos como mostra a Figura 1.
Figura 1. Configurando os componentes não visuais de acesso a dados.
Configure o componente SQLConnection (conEmployee) para acessar o banco de dados Employee.gdb. Selecione o componente SQLDataSet (datasetCustomer) e entre com a seguinte instrução SQL em sua propriedade CommandText:
SELECT * FROM CUSTOMER;
Adicione alguns componentes visuais ao formulário e configure-os de acordo com a Figura 2.
Figura 2. Adicionando e configurando os componentes visuais da aplicação de exemplo.
Selecione o DBGrid e aponte sua propriedade DataSource para dsCustomer. Selecione o formulário e no seu evento OnCreate entre com o seguinte código:
conEmployee.Connected := True;
cdsCustomer.Open;
Ainda com o formulário selecionado digite o seguinte código em seu evento OnClose:
cdsCustomer.Close;
conEmployee.Connected := False;
Como comentado no início do artigo utilizaremos dois eventos disponíveis no DataSource (dsCustomer) para habilitar e desabilitar todos os botões do formulário de acordo com a operação efetuada pelo usuário. Configure os botões de acordo com a tabela abaixo:
Botão |
Name |
Evento OnClick |
ShowHint |
Hint |
Novo |
btnNovo |
cdsCustomer.Append; |
True |
Novo |
Salvar |
btnSalvar |
cdsCustomer.Post; |
True |
Salvar |
Cancelar |
btnCancelar |
cdsCustomer.Cancel; |
True |
Cancelar |
Alterar |
btnAlterar |
cdsCustomer.Edit; |
True |
Alterar |
Excluir |
btnExcluir |
cdsCustomer.Delete; |
True |
Excluir |
Primeiro |
btnPrimeiro |
cdsCustomer.First; |
True |
Primeiro |
Anterior |
btnAnterior |
cdsCustomer.Prior; |
True |
Anterior |
Próximo |
btnProximo |
cdsCustomer.Next; |
True |
Próximo |
Último |
btnUltimo |
cdsCustomer.Last; |
True |
Último |
Fechar |
btnFechar |
Close; |
True |
Fechar |
Selecione o componente cdsCustomer e adicione o seguinte código aos seus eventos OnAfterPost e OnAfterDelete:
cdsCustomer.ApplyUpdates(0);
Ainda com o componente cdsCustomer selecionado entre com o seguinte código em seu evento OnAfterCancel:
cdsCustomer.CancelUpdates;
O próximo passo é utilizarmos o evento OnStateChange do DataSource (dsCustomer) para manipular o estado dos botões para manipulação dos dados além do botão Fechar. Selecione o componente dsCustomer e digite o seguinte código em seu evento OnStateChange:
procedure TFrmPrincipal.dsCustomerStateChange(Sender: TObject);
begin
btnNovo.Enabled := (Sender as TDataSource).State in [dsBrowse];
btnSalvar.Enabled := (Sender as TDataSource).State in [dsEdit, dsInsert];
btnCancelar.Enabled := btnSalvar.Enabled;
btnAlterar.Enabled := (btnNovo.Enabled) and not ((Sender as TDataSource).DataSet.IsEmpty);
btnExcluir.Enabled := btnAlterar.Enabled;
btnFechar.Enabled := btnNovo.Enabled;
end;
No código acima habilitaremos ou desabilitaremos os botões através da propriedade Enabled de acordo com algumas condições. O botão Novo, por exemplo, estará habilitado sempre que a propriedade State do DataSource estiver dsBrowse. Isto significa que o DataSet ligado ao DataSource não se encontra nem em edição e nem em inclusão. Já no caso do botão Salvar, o mesmo só estará habilitado se a propriedade State estiver em dsEdit ou dsInsert os quais apontam se o DataSet ligado ao DataSource está em edição ou em inserção. O botão Cancelar se comportará de maneira idêntica ao botão Salvar; devido a isto atribuímos o valor de da propriedade Enabled do botão Salvar a propriedade Enabled do botão Cancelar.
No caso do botão Alterar o mesmo só estará habilitado caso o botão Novo estiver e se o DataSet ligado ao DataSource não estiver vazio (propriedade IsEmpty do DataSet). O botão Excluir possui o comportamento igual ao botão Alterar. Desta maneira ele sempre será habilitado ou desabilitado de acordo com o valor da propriedade Enabled do botão Alterar. Por último, o botão Fechar irá se comportar de acordo com o estado do botão Novo; isto é, quando o botão Novo estiver habilitado o botão Fechar também estará e vice-versa. Para que o usuário não consiga fechar a janela utilizando a opção X disponível na barra de título ou o comando Alt+F4 caso o DataSet esteja em inserção ou alteração vamos adicionar o seguinte código ao evento OnCloseQuery do formulário:
procedure TFrmPrincipal.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if btnSalvar.Enabled then
begin
CanClose := False;
MessageDlg('Salve ou cancele a operação corrente antes de fechar a janela',
mtInformation, [mbOk], 0);
end;
end;
No código acima verificamos o estado do botão Salvar, onde, caso o mesmo esteja habilitado cancelamos a operação de fechamento da janela e informamos o usuário através de uma caixa de mensagem. Para finalizar nosso exemplo precisamos controlar o estado dos botões de navegação da tela de cadastro. Para isto utilizaremos o evento OnDataChange do componente DataSource (dsCustomer). Entre com o seguinte código ao evento:
procedure TFrmPrincipal.dsCustomerDataChange(Sender: TObject;
Field: TField);
begin
btnPrimeiro.Enabled := (btnAlterar.Enabled) and not ((Sender as TDataSource).DataSet.Bof);
btnAnterior.Enabled := btnPrimeiro.Enabled;
btnProximo.Enabled := (btnAlterar.Enabled) and not ((Sender as TDataSource).DataSet.Eof);
btnUltimo.Enabled := btnProximo.Enabled;
end;
O evento OnDataChange é executado cada vez que o usuário navega pelos registros no DBGrid. Neste evento controlamos os botões Primeiro, Anterior, Próximo e Último de acordo com a posição do registro corrente. A propriedade Bof verifica se o DataSet ligado ao DataSource encontra-se no primeiro registro da tabela enquanto que a propriedade Eof verifica se o DataSet encontra-se no último registro da tabela. Pronto, já podemos salvar, compilar e executar nossa aplicação. Veja a mesma em execução na Figura 3.
Figura 3. Aplicação de exemplo em tempo de execução.
Neste artigo vimos como é fácil manipular o estado dos botões de uma tela de cadastro através dos eventos disponíveis no componente DataSource. Utilizando estes eventos economizamos muitas linhas de código para tratar os botões de manipulação e navegação dos registros. Um abraço e até a próxima.