VB - Criando Classes para gerenciar dados


A partir da versão 5 o Visual Basic facilitou muito a criação de classes ( se você criou classes na versão 4.0 sabe do que eu estou falando). Você já deve saber que o módulo de classe é a base da orientação a objetos no Visual Basic (Leia o artigo - Criando classes no Visual Basic ). É no módulo de classe que criamos as classes , suas propriedades , métodos e eventos.

A partir da versão 6.0 do Visual Basic ficou ainda mais fácil a criação de classes , principalmente as classes que tratam do acesso aos dados. Antes de entrar no assunto vamos fazer uma revisão sobre classes no Visual Basic.

Orientação a objetos no Visual Basic

Classes - Uma classe representa um conjunto de objetos com características e comportamentos comuns. Ex: Poderiamos definir a classe Livros que representaria todos os objetos livros ( poesia, informática , ficção , etc.) com suas características e propriedades comuns.

Objeto - Um objeto representa uma entidade do mundo real. Ex: um livro sobre Visual Basic é um objeto da classe Livro definida acima.

Atributos e Propriedades - Representam as características de um objeto. Ex: Um livro possui as características : tamanho , número de páginas , capa , etc...

Métodos - São funções que permitem a comunicação com o objeto. Ex: O objeto livro pode ser lido , folheado , emprestado , etc...

Se você esta assustado fique sabendo que sem você perceber , ao utilizar o VB para criar os seus projetos , mesmo que nunca tenha criado nenhuma classe , você usa as diversas classes que o VB põe a sua disposição. Porque ? Ora , todos os controles que o VB disponibiliza são na verdade classes ; assim o ícone TextBox da caixa de ferramentas representa a classe TextBox com suas propriedades e métodos.

Quando você inclui uma caixa de texto no seu formulário esta criando o objeto - Text1 - pertencente a classe TextBox. Assim o objeto Text1 é uma cópia de sua Classe - TextBox - que você pode configurar alterando suas propriedades.

Para acessar uma propriedade do objeto Text1 você usa a sintaxe: objeto.propriedade

Veja na figura ao lado o recurso IntelliSense exibindo as propriedades para o objeto Text1 na janela de código.

Para verificar se um identificador é um objeto de uma classe você pode usar a função IsObject com a seguinte sintaxe:

IsObject(identificador)

O valor retornado é um valor Boleano - True/False.

A primeira coisa a fazer para criar uma classe é inserir um módulo de classe ao seu projeto. Menu Project|Add Class Module

Para criar uma propriedade para uma classe apenas inclua as variáveis no módulo de classe. Ex:

Public sCodigo as Integer

Private sNome as String

Para poder ler e recuperar valores de propriedades devemos usar as procedures : Property Get , Property Let e Property Set.

Trabalhando com classes para acesso a dados

Podemos dividir as classes para acesso a dados em duas categorias :

  1. Classes que atuam como Fonte de dados
  2. Classes que atuam como Consumidora de dados

Usamos duas propriedades para determinar como a classe interage com com os dados externos:

  1. DataBindingBehavior
  2. DataSourceBehavior

Quando incluimos um módulo de classe ao nosso projeto VB ( menu Project | Add Class Module ) veremos a janela a seguir:

1 - Classes que atuam como Fonte de dados - tipo Data Source

Uma classe fornecedora de dados é uma classe do tipo Data Source e oferece dados para ser consumido por outros objetos. Os dados oferecidos podem ser dos mais variados : ADO (OLE DB) , ODBC , etc...

Uma classe vai agir como uma classe fonte de dados se definirmos a propriedade DataSourceBehavior igual a 1 - vbDataSource - via código ou se selecionarmos o tipo Data Source na janela Add Class Module.

- Inicie o Visual Basic e no menu Project selecione - Add class Module. Veja abaixo o código gerado pelo VB:

Observe o evento Get_DataMember , este evento ocorre sempre que um consumidor de dados requisita dados para uma classe que esta fornecendo os dados. A sintaxe é :

Private Sub Object_GetDataMember(DataMember As String, Data As Object)

Vejamos um exemplo. Abaixo temos um código ( da MSDN Library) que usa o evento GetDataMember para determinar qual fonte de dados será fornecida pela classe Data Source.

This example uses the GetDataMember event to determine what data will be provided by a data source class.
Option Explicit
Private rsFirst As ADODB.Recordset
Private rsSecond As ADODB.Recordset
Private rsDefault As ADODB.Recordset

Private Sub Class_GetDataMember(DataMember As String, Data As Object)
   Select Case DataMember
      Case "Primeiro"
         Set Data = rsFirst
      Case "Segundo"
         Set Data = rsSecond
      Case “”   ‘ default
         Set Data = rsDefault
      Case Else
         Err.Raise 99999, "DataSource", "Invalid DataMember"
   End Select
End Sub 

Vejamos um exemplo prático:

1- Inicie um novo projeto no VB e insira um controle DataGrid no formulário padrão ( no menu Project selecione Add Components...)

2- Faça uma referência a library - Microsoft ActiveX Data Objects 2.X

3- No menu Project selecione - Add Class Module - para inserir um módulo de classe ao projeto

4- Selecione a classe inserida e na janela de propriedade altere o nome da classe para NamesData

5- Na janela de propriedades , clique em DataSourceBehavior e altere a propriedade para vbDataSource

6- Na seção de Declarações do módulo de classe crie uma variável Recordset conforme o código a seguir:

Option Explicit
Private WithEvents rsNames As ADODB.RecordSet

7- No evento Initialize da classe insira o seguinte código:

Private Sub Class_Initialize()
' insere o nome do novo datamember na colecao DataMember
' isto permite que outro objetos enxerguem os datamembers disponiveis

DataMembers.Add "Names"

Set rsNames = New ADODB.Recordset ' define a variável objeto

' cria um recordset com dois campos : ID e Name
With rsNames
  .Fields.Append "ID", adInteger
  .Fields.Append "Name", adBSTR, 255
  .CursorType = adOpenStatic
  .LockType = adLockOptimistic
  .Open
End With

Dim i As Integer
For i = 1 To 10 ' inclui 10 registros
  rsNames.AddNew
  rsNames!ID = i
  rsNames!Name = "Nome_ " & i
  rsNames.Update
Next i
rsNames.MoveFirst ' move o ponteiro para o inicio do registro
End Sub

8 - No evento GetDataMember da classe inclua o seguinte código :

Private Sub Class_GetDataMember(DataMember As String, Data As Object)
   Set Data = rsNames
End Sub

O código retorna um objeto recordset sempre que o evento ocorre , ou seja , sempre que o objeto class estiver vinculado ao consumidor de dados - o DataGrid.

9- Na seção General declarations do formulário inclua o código :

Option Explicit
Private datNames As NamesData ' variável da classe

10- Agora no evento Load do formulário inclua o código :

Private Sub Form_Load()
' cria um novo objeto NamesData
Set datNames = New NamesData

' vincula o DataGrid a nova fonte de dados - DataSource - datNames
Set DataGrid1.DataSource = datNames
End Sub

Se você rodar o projeto vai obter o seguinte : O DataGrid exibindo os registros criados para o recordset.

Programando eventos do Recordset

Vamos agora mostrar como programar os eventos do objeto Recordset:

- No projeto anterior selecione o módulo de classe e clique na caixa Object. Observe que caixa de Procedures/Events será exibido todos os eventos do objeto recordset

- Vamos fazer com que o módulo de classe responda a uma chamada incluindo uma nova propriedade a classe de forma que quando invocada por outro objeto a propriedade retorne o total de registros do recordset. O código é o seguinte:

Public Property Get RecordCount() As Long
   RecordCount = rsNames.RecordCount
End Sub

Para obter o valor total de registros do recordse inclua a seguinte linha no código do formulário.( Voce deve incluir uma label com o nome de lblrecordcount)

lblrecordcount.Caption = datNames.RecordCount

Usando a propriedade DataMember Property

Já vimos que o evento GetDataMember inclui o argumento Datamember. Podemos usar este argumento para incluir mais de um recordset no módulo de classe e retornar o conjunto de registros apropriados usando um Select/Case com o argumento DataMember.

Private Sub Class_GetDataMember(ByVal DataMember As String, Data As Object)
  Select Case DataMember
    Case "Names"
   '    Set Data = rsNames
    Case "Dates"
   '   Set Data = rsDates
    Case Else
       ' Define um Datamember padrão.
    '   Set Data = rsYears
End Select
End Sub

Obs: Voce deverá criar o recordset rsDates e rsYears se quiser que o código funcione corretamente.

Para determinar qual DataMember você quer usar , configure a propriedade DataMember para a seleção apropriada e a seguir defina o DataSource atual.

Private Sub Form_Load()
 ' Cria um novo objeto NamesData 
 Set datNames = New NamesData

 'define qual DataMember voce deseja e então configura o DataSource.
 DataGrid1.DataMember = "Names"
 Set DataGrid1.DataSource = datNames

End Sub

Nota : Você percebeu que usou o controle DataGrid e não precisou usar um ADO Data Control !!!!

Vou parando por aqui. Na sequência vou mostrar um exemplo mais prático sobre o assunto , até lá...


José Carlos Macoratti