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.
Private sTitulo as String Public Property Get Titulo() As String Titulo = sTítulo End Property |
Dim oLivro as Livro Text1.Text = oLivro.Titulo |
Public Property Let Titulo(TituloLivro As String ) sTítulo = TituloLivro End Property |
oLivro.Titulo = Text1.Text |
Private OutputTo As Object Public Property Set OutputDev(inDev As Object) Set OutputTo = inDev End Property |
Trabalhando com classes para acesso a dados
Podemos dividir as classes para acesso a dados em duas categorias :
Usamos duas propriedades para determinar como a classe interage com com os dados externos:
|
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)
- Object - o objeto que gera o evento ( A classe )
- DataMember - string que contém o nome de um membro de dados que será vinculado a uma fonte de dados.
- Data - uma referencia a um objeto recordset ADO ou a uma classe que implementa a interface OLEDBSimpleProvider
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.
|
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:
|
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 :
|
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:
|
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.
|
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.
|
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