Dicas do OsmarJr

Trabalhando com Classes


O Jackson Patrick Werka enviou este exemplo de como trabalhar com classes no Access.

 

O exemplo (classes.zip) está aqui.

Imagine que você quer desenvolver um aplicativo que tenha um número N de formulários e todos vão ser do mesmo tipo. No caso vamos supor que são formulários desvinculados que usam como origem dos registros recordsets do tipo DAO. Para facilitar a navegação e edição dos registros vai ser incluído botões de comando para todos os formulários, como mostrado na figura abaixo:

Agora imagine configurar os botões e ter que escrever as rotinas de navegação formulário por formulário. Imagine quantas rotinas iguais para formulários diferentes teriam que ser escritas e para fazer manutenção do código teria que alterar todas as rotinas ou alterar a configuração de algum botão de comando, teria que abrir formulário por formulário e alterar as propriedades de cada botão de comando.

Aí é que entra os módulos de classe dando uma "mão na roda" para automatizar estas rotinas.

Eu posso criar um módulo de classe chamado de classNavegação e colocar todos as minhas rotinas e configurações dos botões de comando dentro dele e somente fazer referência a ele dentro do módulo do meu formulário.

Dentro de uma classe eu posso ter funções, procedimentos, variáveis, constantes entre outros tipos. Mas o que difere um módulo de classe de um módulo normal é que ele suporta eventos. Eu posso criar eventos para controlar minhas ações, por exemplo, no meu módulo classNavegação eu posso criar um evento chamado ConfirmarExclusao e disparar este evento quando for excluir um registro no meu formulário. Neste evento eu posso fazer as verificações necessárias e individuais para cada formulário e depois executar a parte comum do código de exclusão igual a todos os formulários contida na classe.

No banco de dados de exemplo Classes. mdb, eu tenho um exemplo claro de como usar os eventos disparados pela classe.

 

Option Compare Database
Option Explicit

‘ Importante: Sempre declarar usando a palavra WithEvents,
‘ pois senão os eventos não acontecem

Private WithEvents cNgv As classNavegação
‘...Meu código

Private Sub cNgv_ConfirmaExclusao(Confirmar As Boolean)
  MsgBox “Evento Confirmar Exclusão Ocorrendo!”, vbInformation, "Excluir"
  Confirmar = True           
End Sub

 

Todos os procedimentos para navegação, localização e carregamento de dados já estão configurados para suportarem recordsets do tipo dbOpenTable , onde automaticamente ele já usa o método Seek que pode ser aplicado sobre recordsets deste tipo trazendo um resultado mais rápido, com uma única condição: é necessário que os índices tenham   o mesmo nome do campo que é a chave primária. Caso o recordeset seja de outro tipo ele usa os métodos Find. Ele também reconhece a diferença entre campos do tipo texto e número já usando a sintaxe correta ao chamar o método Find.

O carregamento dos registros também é feito de forma automatizada, para isto basta que os campos a serem carregados tenham o exatamente mesmo nome que na tabela ou consulta de origem.

*Dica: use o recurso de autoformulário ele vai trazer os nomes dos campos corretos, depois basta limpar a propriedade origem do registro do formulário.

Obs.: É necessário que todos os campos da tabela estejam no formulário, caso você não queira mostrar algum, coloque ele como invisível.

Todos os processamentos de controles são feitos através de loops controlados pelo número de campos no recordset, por isso não importa se o meu formulário tem apenas dois campos ou se ele tem 100 campos, a classe vai varrer todos os campos da tabela ou consulta e informar o valor no formulário.

Imagine que você quer usar a classe para navegação, mas em alguns formulários após a movimentação entre os registros é necessário executar algum procedimento, como se eu fosse usar o evento OnCurrent do formulário, mas como é um formulário desvinculado este evento não é disparado. Por este motivo a classe contém um evento chamado ProcAdicional, que é disparado logo após o carregamento dos registros.

Para disparar um evento eu uso o comando RaiseEvent. Para saber se é pra ser disparado o evento eu uso o valor de uma variável do tipo Boleano atribuído através de uma propriedade da classe que é setado (indicado) no módulo do meu formulário. No caso é a variável ProcAdicional .

 

'Usado para saber se tem ou não procedimento adiconal
Private ProcAdicional As Boolean
...
     If ProcAdicional Then RaiseEvent ProcAdicional
...

 

No banco de dados de exemplo tem uma amostra de como usar o evento ProcAdicional para calcular o valor do campo Semana, com base na data de cadastramento ele retorna a semana do ano.

 

Private Sub cNgv_ProcAdicional ()
  Me.Semana.Value = Format(Me.DataCad, "ww")
End Sub

 

Poderia ser usado para qualquer outro procedimento, como habilitar alguns campos ou botões de comando de acordo com a necessidade.

Para atribuir um valor a uma propriedade da classe eu uso a sintaxe abaixo:

 

No módulo do formulário

...
    cNgv. BtProcAdicional = True
...

 

No módulo da classe

 

Public Property Let BtProcAdicional( ProcAdic As Boolean)
  ProcAdicional = ProcAdic
End Property

 

Para recuperar um valor de uma propriedade da classe eu uso a sintaxe abaixo:

 

No módulo do formulário

...
Dim ProcAdicional As Boolean

  ProcAdicional = cNgv. BtProcAdicional
...

 

No módulo da classe

 

Public Property Get BtProcAdicional() As Boolean
  BtProcAdicional = ProcAdicional
End Property

 

Dentro do módulo de classe tem um procedimento público que é usado para habilitar e desabilitar os controles do formulário que são vinculados ao recordset, ou seja, qualquer controle que contenha dados vinculados aos Fields (campos) do recordset pode ser mostrado como travado e desabilitado até que se clique no botão editar ou novo registro.

 

Procedimento para impedir edições indesejadas

Public Sub TrabalhaEdicao(Habilita As Boolean, Trava As Boolean, Cor As Long)
...
End Sub

 

‘Para desabilitar os campos no módulo do form

  cNgv. TrabalhaEdicao False, True, COR_ENABLED

 

 Em caso de se clicar no botão editar, ele não vai habilitar o campo que eu passei como chave primária para minha classe, já que, geralmente, eu não posso editar uma chave primária de uma tabela.

Quando eu clicar no botão novo ele automaticamente me preenche os campos que eu indiquei algum valor padrão nas propriedades do controle, independente se é um valor ou uma função, no caso de função ele processa a mesma.

Para maiores esclarecimentos consulte o banco de dados de exemplo, lá mostra todas as funções sendo usadas de forma bem simples e didática.

Use e abuse das funcionalidades da classe, afinal de que adianta ter o conhecimento e não querer compartilhá-lo.

Usando a criatividade é possível ir muito além de onde inicialmente imaginávamos ir.

 

Jackson Patrick Werka

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23