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.

Configurando os componentes não visuais de acesso a dado

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.

Adicionando e configurando os componentes visuais da aplicação de exemplo

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.

Aplicação de exemplo em tempo de execução

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.