DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Controlando o estado dos botões

Veja nesse artigo de Everson Volaco, como controlar o estado dos botões usando eventos do DataSource.

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você gostaria de comentar o que não lhe agradou?

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.

Conclusã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.


Everson Borges Volaco
Everson Borges Volaco (everson@rhealeza.com.br) é desenvolvedor e instrutor certificado Borland, com experiência em aplicações cliente/servidor, usando Delphi, Interbase e Oracle. Possui três certificações oficiais Borland: Borland Delphi 7.0, Borland CaliberRM 6.0 e Borland StarTeam 6.0.
O que você achou deste post?

    8 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Paulo César Ferreira De Jesus
muito bom!
[há +1 ano] - Responder

 

Fausto Da Silva Alves
Não seria mais fácil utilizar o componente ActionList?
[há +1 ano] - Responder
 

Devmedia
Se usar actionList e ocorrer uma Exception? Melhor usar os eventos do DataSource
[há +1 ano] - Responder

 

Luciano De Oliveira Angelini
Mas Cade os Botões.... o Link para baixa esta quebrado !!!!!
[há +1 ano] - Responder

 

Luiz Fernando Silva
Nossa, este artigo é simples e muito util!
[há +1 ano] - Responder

 

Diego De Andrade Seleguim
Cade as figuras que ñ aparecem no tutorial?
[há +1 ano] - Responder
 

Diego De Andrade Seleguim
Usava ActionList, ñ uso mais.. O modo que se trata os estados dos botões é simples e funcional, tudo que eu precisava, joguei num form base... agora..todo meu projeto trabalha da mesma forma!... vlww Só falta um tratamento de erros...
[há +1 ano] - Responder
 

Achilles Robson

as imagens não aparecem aqui

[há +1 ano] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03