Criando Classes no Visual Basic 6.0


"O Visual Basic não é uma linguagem orientada a objetos ! " , dizem os puristas .

"E daí ? " , responde um vb maníaco !!!

Bem, não vamos entrar nesta polêmica , nossa tarefa é ser o mais prático e objetivo possível , mesmo por que o assunto é vasto e complexo. Queremos apenas tentar desmistificar a ideia amplamente difundida de que a programação orientada a objetos - OOP (Object Oriented Programming Language) - é reservada a poucos , e que sua utilização no dia a dia é de difícil implementação.

Na verdade o que necessita ser feito é uma mudança de mentalidade por parte dos programadores, pois a grande maioria que hoje utiliza linguagens com recursos da OOP vieram das chamadas linguagens procedurais ( Clipper, Cobol, FoxPro , etc...) e trazem para a 'nova linguagem' os hábitos da 'velha linguagem', ou seja, mudou a ferramenta mas os métodos usados continuam a ser os mesmos.

No Visual Basic o conceito de classes e objetos foi introduzido na versão 4.0 , e isto foi mais um passo na direção da OOP. Desde então a linguagem evoluiu muito , estamos na versão 6.0 lembram-se ? . O problema , no entanto, continua sendo o mesmo: a manutenção dos sistemas desenvolvidos e a reutilização de código. Foi justamente para tratar deste problema que o conceito de classes e objetos foi introduzido no Visual Basic.(Você pensou que era para realizar tarefas mirabolantes !! ). Antes de continuar uma pergunta: "Alguém ai usa classes ? "

A teoria da OOP é realmente complexa mas podemos dizer que os quatro pilares da OOP são:

1- Abstração
2- Encapsulamento
3- Herança
4- Polimorfismo

1-Abstração - Esse conceito pode ser entendido como uma separação de elementos através de sua classificação . Então , através da classificação nossa primeira atitude é olhar para o que os elementos são. Assim em um sistema o enfoque de um problema não é mais - quais as operações devem ser realizadas ( inclusão, alteração,...) e sim quais os elementos que compõem o sistema a sua descrição e o que eles podem fazer.

Imagine a planta de uma casa. Ela contém todas as informações necessárias a construção de cada parte da casa: cômodos, portas, janelas, materiais, dimensões. A planta é uma abstração que descreve todos os objetos da classe casa. Quando você constrói a casa esta criando um objeto a partir de uma abstração da classe casa .

Construir a casa é instanciar (criar) um objeto real a partir da definição de uma classe.

Assim uma classe descreve um tipo de coisas e um objeto é uma instância de uma classe.(note que uma planta pode gerar diferentes tipos de casas, embora apresentem características básicas semelhantes)

Todo o objeto possui propriedades, métodos e eventos. Imagine um fusquinha ! . Podemos dizer que ele é um objeto da classe automóvel (embora muitos não concordem).

Suas propriedades seriam: peso , altura, cor, modelo , opcionais.

Seus métodos ( ações que pode sofrer) poderiam ser: abastecer, dar a partida, ser dirigível, trocar a bateria, ser vendido.

Seus eventos ( aquilo que pode acontecer com o objeto) : acabar a gasolina, fundir o motor , pifar a bateria.

Meu Deus ! o que isto tem a ver com o VB ?

Pois bem ; propriedades , métodos e eventos são porções de código em VB. As propriedades são dados que descrevem o objeto, os métodos são coisas que solicitamos que o objeto faça e os eventos são as ações do objeto. Você vai escrever código para descrever , solicitar uma ação e tratar as ações do objeto. A classe seria então o conjunto de códigos que caracteriza um objeto.

Em um caso real , como por exemplo um sistema para folha de pagamentos, os objetos que deveriamos definir e com o qual iríamos trabalhar poderiam ser: os empregados e os departamentos. As propriedades dos empregados poderiam ser o nome e o codigo , a dos departamentos : as vagas e o responsável. O método que deveria ser aplicado a cada mês pelo departamento seria o método: pagar salário.

Quando pretendemos criar um classe , colocamos o conjunto de códigos que caracterizam a classe no Class Module. Para inserirmos um módulo de classe no VB , selecionamos a opção Add Class Module do menu Project.

Você não deve confundir um Módulo de Classe(cls) com um Módulo de código(bas). Este último é usado quando queremos que uma porção de código esteja disponível a todos os formulários do nosso projeto. Assim escrevemos uma função ou procedure e a colocamos em um Módulo (.bas) , de forma que ela pode ser chamada de qualquer ponto do nosso projeto.

De forma oposta, em um Módulo de classe o código nunca roda diretamente. O Módulo de classe atua como uma receita para um objeto e, assim , para implementar a classe você tem que criar o objeto a partir dela. Para fazer isto você pode usar a seguinte sintaxe:

Dim meuobjeto as New Minhaclasse

Esta declaração cria um objeto chamado meuobjeto no seu sistema baseado na classe minhaclasse. Fazendo isto você acabou de instanciar o objeto a partir de sua classe.Agora basta usar as propriedades, métodos e eventos definidos na classe. Você usa este recurso frequentemente no Visual Basic quando usa os componentes presentes na barra de ferramentas ao criar um projeto.

Assim , por exemplo , ao usar uma ComboBox da caixa de ferramentas , estamos na verdade instânciando um objeto Combo1 baseado na classe ComboBox.(Ver figura 1.0)

Figura 1.0

O Object Browser

Antes de prosseguir , vamos dar uma olhada neste ilustre desconhecido. O Object Browser é baseado em bibliotecas de tipos ( type library ) as quais nada mais são do que recursos que contêm descrições detalhadas das classes.

O object Browser é usado para exibir as classes disponíveis em projetos e bibliotecas . Ele pode ser acionado do Menu View , opção Object Browser , e , tem o jeitão da figura 2.0 :

                          Figura 2.0
   Figura 3.0

Se você clicar com o botão direito do mouse surge o menu de contexto (Figura 3.0) que permite visualizar as propriedades do item selecionado. Ao selecionar a opção Group Members todas as propriedades e métodos de um objeto são agrupados . Observe que os métodos e propriedades definidos numa classe são chamados de membros.

2-Encapsulamento - Toda a informação sobre o objeto e a maneira pela qual a informação é manipulada esta armazenada dentro da definição do objeto. Todos os detalhes sobre como o objeto funciona são invisíveis fora dele. Vamos tomar como exemplo o objeto TextBox . Podemos usar a OOP para acessar as propriedades de um controle TextBox da seguinte forma:

text1.Enabled = True
text1.Text = "Teste ! "
text1.selstart = 0
podemos também ativar os métodos deste controle, como em :  
Text1.SetFocus

As propriedades e métodos estão definidos dentro do objeto e para que possamos acessá-los temos que instanciar , ou seja, criar uma instância do objeto TextBox. Podemos assim construir classes no VB definindo as propriedades e métodos na definição de um objeto.

3-Herança - Um novo objeto pode ser criado de um objeto já existente e contém todas as propriedades do originário. Isto facilita a criação de novos objetos para necessidades específicas.

O Visual Basic não suporta herança , ou seja, não podemos criar uma nova classe baseada na definição de outra classe. Podemos no entanto contarnar esta limitação copiando a definição da classe de um módulo para outro.

4-Polimorfismo - Como objetos diferentes podem possuir os mesmos métodos, e os métodos podem atuar diferentemente para cada tipo de objeto, através do polimorfismo podemos executar o método apropriado para o objeto atual. Ou seja internamente as propriedades e métodos de um objetos de classes diferentes podem ser implementadas de maneira diferente mas a reagem de maneira similiar ás mesmas mensagens. Compare o rádio atual transistorizado com o rádio a válvula , embora internamente tenha havido uma revolução na maneira como o rádio é construido para o usuário a maneira de operar continua a mesma: botão para ligar/desligar , botão para mudar de estação, etc...

User-Defined Types(UDT)

Antes de iniciar propriamente com classes e objetos será necessário falar nos tipos definidos pelo usuário ou user-definied types (UDT). Suponha que você queira criar um aplicação para armazenar o nome e telefone de clientes. Podemos usar uma UDT para agrupar os itens relacionados aos dados ao invés de definir variáveis individuais para cada cliente que desejamos armazenar.

Para definir um UDT usamos a seguinte sintaxe:

Type NomeTipo
  elementos as TipoDados
....
End

Vamos criar uma UDT chamada Clientes.Inicie o VB e crie um novo projeto adicionando a ele um módulo-padrão(Type somente pode ser usado em módulos) e digite:

Public Type Cliente
  Nome as string * 40
  telefone as string
End Type

Uma vez declarado o Tipo clientes basta informar o nome da variável de tipo clientes e a seguir definir os elementos que o compõem. Supondo um formulário(form1) com duas TextBox - text1, text2 , vejamos como atribuir/exibir os valores do tipo clientes.

'General Declarations
Dim gclientes As clientes
'Código do evento Click do formulário
(Atribui valores a TextBox ao clicar)
Private Sub Form_Click()
  Text1 = "Jose Carlos Macoratti"
  Text2 = "0XX-15-321-4565"
End Sub
'Código do evento Load do formulário
(Atribui valores aos elementos do Tipo)
Private Sub Form_Load()
  gclientes.Nome = "Jose Carlos Macoratti"
  gclientes.telefone = "0XX-15-321-4565"
End Sub

Ao rodar o projeto o evento Form Load carrega os elementos do Tipo e quando você clica no formulário os valores são exibidos nas caixas de texto. Embora as UDT sejam eficientes em muitos aspectos devemos lembrar que as variáveis que são instâncias de uma UDT (gclientes é uma instância da UDT clientes) estão sujeitas ás mesmas regras de visibilidade e escopo das demais variáveis.

Usando Classes no Visual Basic

Uma classe é idêntica a uma UDT, exceto que além de possuir dados(propriedades) uma classe possui procedures (métodos). Uma classe é uma coleção de propriedades e métodos e um objeto é uma instância de uma classe.

Você pode usar classes para encapsular segmentos de programas e assim torná-los reutilizáveis. As classes assim criadas definem objetos que podem ser criados em qualquer lugar do seu programa. A vantagem em usar objetos para tratar certas funções de um sistema é o fato de isto reduzir a necessidade das variáveis globais e procedures. As variáveis globais são muitas vezes as grandes geradoras de erros em sistemas. As classes tem ainda a vantagem de poderem ser adicionadas a outros programas para tratar as mesmas funções. E , o que é muito importante, você pode criar múltiplas instâncias de uma classe sendo que cada objeto possuirá o seu próprio conjunto de valores e propriedades. Então pensando nisto , você pode construir uma livraria de classes para agilizar o trabalho de desenvolvimento.

Uma outra maneira de você usar classes é construir ActiveX DLLs e EXEs. Nesta forma os objetos da classe proverão funções para qualquer um de seus programas e também para outros programas que agirão como clientes ActiveX. Assim você pode colocar todas as regras para realizar cálculos em um objeto e compilá-lo como uma DLL ; referenciando a DLL outros programas terão acesso as regras definidas na DLL e poderão usá-las.

Você pode também usar classes para criar add-ins . Com eles você pode criar assistentes para realizar tarefas específicas para facilitar a vida do usuário.

Construindo uma Classe no Visual Basic

As classes são desenvolvidas usando o módulo de classe ( Class Module) o qual contém somente declaração de variáveis e código. Um módulo de classe possui somente três propriedades e dois eventos. Após a criação de um módulo de classe podemos incluir propriedades, métodos e eventos declarando variáveis e codificando procedures e funções.

Para iniciar o processo de criar um novo módulo de classe você deve primeiro criar um novo projeto no Visual Basic e a seguir escolher a opção Add Class Module do menu Project . Isto inicia um novo módulo de classe com o nome de class1 e abre a janela de Código para a classe.(Figura 4.0)

Figura 4.0 Janela de propriedades da classe

Aqui não há segredo, você usa a janela de módulo de classe da mesma forma que usa a janela de módulo (bas)

Agora que uma nova classe foi criada em seu projeto, você precisa definir os valores das propriedades que definem a classe. Essas propriedades são : Instancing e Name

Name define um nome para sua classe , naturalmente você deverá escolher um nome sugestivo relacionado com a tarefa que a classe irá realizar. Uma convenção é iniciar o nome de uma classe com a letra c (minúsculo) , assim cTeste seria o nome para uma fictícia classe.

Quando você incluir um módulo de classe em seu projeto ele pode ser usado somente por outros modulos ou formulários do projeto e não pode ser 'visto' de outro programa a isso chamamos um classe privada - private class. Para criar uma classe pública , que pode estar disponíveis por outros programas, você precisa usar um projeto ActiveX EXE ou um ActiveX DLL e depois de criá-las realizar o registro no Windows. Desta forma o seu projeto ActiveX será visualizado na caixa de diálogo References.... Para usar a classe basta referenciá-la no projeto.

A maneira como instanciamos nossa classe afeta o seu comportamento. A propriedade Instancing define o mode de acesso a sua classe. Os valores desta propriedade depende do tipo de projeto com o qual você está trabalhando. Se estiver trabalhando com o projeto padrão ( Standard EXE) a propriedade nem mesmo estará disponível. O possíveis valores para esta propriedade são dados a seguir: (figura 5.0)

Valor Nome Descrição
1 Private A classe não pode ser acessada fora do projeto.
2 Public Not Creatable Instâncias da classe somente podem ser criadas dentro do projeto que definiu a classe.Outras aplicações , no entanto, podem acessar a classe.
3 SingleUse Outras aplicações podem criar instâncias da classe.Porém a cada instância criada inicia uma cópia do programa que contém a classe.
4 Global SingleUse A classe atua como uma variável goblal no programa cliente.
5 MultiUse Outras aplicações podem criar inúmeras instâncias da classe iniciando somente uma vez o programa que contém a classe. Os projetos ActiveX DLL comportam-se assim.
6 Global MultiUse Idêntica a MultiUse mas a classe atua como uma variável goblal no programa cliente.

Além destas propriedades internas uma classe possui dois eventos intrínsecos: Initialize e Terminate . Usamos esses eventos para para realizar ações específicas quando uma instância de uma classe é criada e destruída.

Classes : Incluindo Propriedades

Após criar uma classe você pode incluir as suas próprias propriedades. Essas propriedades são as propriedades dos objetos criados a partir da classe. Cada objeto que você criar a partir da classe terá então o seu conjunto de propriedades, e essas propriedades permitirão ao usuário obter informação sobre o objeto. Existem duas maneiras atribuir uma propriedade a uma classe :

  1. Definindo um variável pública

  2. Usando o procedimento Property

Criando uma variável Pública - Você cria uma variável pública usando a declaração do enunciado da variável com a palavra Public, assim:

Public var1 as string

A declaração do enunciado pode aparecer na secção Declarations do módulo da classe ou em qualquer procedure Sub na classe. Como uma variável pública é visível por toda aplicação assim que ela é criada , qualquer parte do programa pode alterar o valor da variável, e , isto pode lhe causar problemas , por isso este método de criação de variáveis deve ser evitado ao máximo.

Usando o procedimento Property - Este é um método melhor de criar variáveis em classes, pois este procedimento fornece a interface para com as propriedades do objeto e ao mesmo tempo permite a escrita de código para verificar que os dados adequados estão sendo passados para classe. Isto proteje as funções da classe de falharem quando receberem dados inadequados. Ele permite também criarmos propriedades somente-leitura. Existem três tipos de procedimentos Property disponíveis:

Procedure Tipo Função
Property Let Aceita o valor da uma propriedade (Property)de um programa que foi chamado Usada para definir o valor de uma propriedade
Property Get Envia o valor da propriedade ao programa. Usada para retornar o valor de um propriedade.
Property Set Caso especial. Usado se o tipo de variável a ser definida for um objeto.

Para criar um procedimento Property , você deve estar na janela de código para a classe com a qual estiver operando. Selecione no menu Tools a opção Add Procedure. Isto irá abrir a janela Add Procedure. Ver abaixo:

opção Add Procedure no menu Tools - cria um procedimento Property A janela Add Procedure

Na janela Add Procedure , informe o nome para o procedimento ( este será o nome da propriedade para o seu objeto), e a seguir selecione a opção Property (como mostrada acima) . Clique a seguir em OK. Pronto , você criou um procedimento Property Let e um procedimento Property Get no seu módulo de classe. (veja figura abaixo)

Definindo o valor de uma Propriedade - Observe que o procedimento Property Let incluiu um argumento ao procedimento. Este argumento é o valor que é passado de um programa pela propriedade . Você pode mudar o nome do argumento e pode definir o tipo da variável . O código do procedimento Property Let recebe o valor do argumento, realiza a validação e atribui o valor para uma variável privada no módulo de classe. Vejamos um exemplo:

Private m_lmarg As Integer

Public Property Let LMargin(LMarg As Integer)

    If LMarg < 0 Then

        m_lmarg = 0

    Else

        m_lmarg = LMarg

    End If

End Property

Neste exemplo o procedimento verifica se a propriedade Lmargin da classe é menor que zero. Se usarmos a propriedade de com valores inválidos como :

objeto.Lmargin = -15

O procedimento irá armazenar o valor zero na variável privada ao invés do valor negativo atribuído á mesma

Retornando o valor de uma Propriedade O procedimento Property Get permite ao seu programa receber o valor da propriedade . Isto é feito atribuindo-se o valor a ser retornado ao nome da propriedade, como a seguir:

Public Property Get LMargin() As Integer

LMargin = m_lmarg

End Property

Você pode escrever qualquer código na procedure quando o valor da propriedade precisa ser calculada ou outra ação precisa ser tomada no retorno de valor da propriedade.

Para incluir propriedades somente leitura para uma classe basta incluir somente o procedimento Property Get para a propriedade. Ao excluir o procedimento Property Let o valor da propriedade somente pode ser definido pelo código dentro do módulo de classe.

Objetos - um caso especial - Para algumas de suas propriedades você irá querer estar apto a passar um objeto, um controle ou qualquer outro objeto a um módulo de classe. Neste caso você deve usar o procedimento Property Set e não o procedimento Property Let para dar á propriedade um valor . Quando você passa um objeto , a variável privada que você esta usando no módulo de classe deve ser to tipo Objeto (Object). Veja exemplo a seguir:

Private OutputTo As Object

Public Property Set OutputDev(inDev As Object)

    Set OutputTo = inDev

End Property

Note que a instrução Set é usada para atribuir o valor de um objeto á variavel privada.

Criando métodos na classe

Para tornar as classes realmente úteis devemos criar métodos para a classe. Fazemos isto escrevendo procedimentos públicos ( public procedures) para a classe. O procedimento em um módulo de classe começa com a declaração do enunciado. Se este procedimento usar a palavra Public então o procedimento torna-se um método da classe e é acessível para qualquer programa que cria um objeto baseado na classe.

Se o procedimento é iniciado com a palavra Private, ele pode ser chamado somente dentro da própria classe. Vejamos a seguir um procedimento em uma classe que imprime uma linha de texto em negrito para a impressora . Como o procedimento é público , ele torna-se um método do módulo de classe:

Public Sub PrintBold(InText As String)

    curBold = Printer.Font.Bold

    Printer.Font.Bold = True

    Printer.Print InText

    Printer.Font.Bold = curBold

End Sub

Inserindo eventos a classe

Um evento é disparado quando o usuário realiza alguma ação, ou quando uma mudança ocorreu. Podemos também fazer com que uma classe inicie um evento quando estiver sendo executada.

Para criar um evento em uma classe precisamos de duas coisas:

1. Declarar o Evento na classe.
2. Usar a declaração e
RaiseEvent para disparar um evento.

Para declarar um evento , simplesmente fornecemos o nome do evento e a variável passada pelo evento em uma declaração. Vejamos um exemplo:

Public Event QueryStatus(ByVal Completion As Single, ByRef Cancel As Boolean)

Esta declaração é colocada na secção Declarations a classe na qual queremos criar o evento. A palavra Public é necessária para permitir as programas usando objetos criados a partir da classe responder ao evento. A variável permite ao evento passar a informação para o programa que esta usando a classe e receber o retorno da informação do programa.

Depois que o evento é declarado você pode usar a instrução RaiseEvent para disparar o evento em qualquer parte do código da classe. Vamos disparar o evento declarado anteriormente depois do processamento de 100 registros. Teremos:

Public Sub ProcessData()

Dim MaxRecords As Long, RecordsProcessed As Long
Dim blnCancel As Boolean

If ClsRset.RecordCount = 0 Then Exit Sub
  ClsRset.MoveLast
  MaxRecords = ClsRset.RecordCount
  RecordsProcessed = 0
  blnCancel = False
  ClsRset.MoveFirst

Do While Not ClsRset.EOF

    If RecordsProcessed Mod 100 = 0 Then
        RaiseEvent QueryStatus(RecordsProcessed / MaxRecords, blnCancel)
        If blnCancel Then Exit Sub
    End If

    ClsRset.MoveNext
    RecordsProcessed = RecordsProcessed + 1

Loop
End Sub

Acessando uma classe a partir de um programa em VB

Para usar uma classe em seus programas, você deve criar um objeto a partir da classe e então manipular o objeto criado definindo suas propriedades e usando os seus métodos.(lembre-se que uma classe não pode ser usada por ela mesma).

Existem duas maneiras de criar um objeto a partir de uma classe que você desenvolveu:

Após a criação do objeto por um dos dois métodos acima você deve acessar as propriedades e métodos do objeto para poder usá-lo em seus sistemas.

Usando uma declaração de enunciado -

Dim EhnPrint As New cPrint

A declaração define uma variável objeto como sendo um nova instância de uma classe (no exemplo acima a classe é cPrint). Observe a palavra New na declaração. Ela é obrigatória quando criamos uma instância de um objeto.

Usando a instrução SET - A outra maneira de criar um objeto a partir de uma classe é utilizar a instrução SET. Neste caso uma variável objeto é declarada e então a instrução SET é usada para criar uma uma instância do objeto. Veja o exemplo a seguir:

Dim EhnPrint As Object
Set EhnPrint = New cPrint

Após a utilização do SET as propriedades e métodos do objeto estarão disponíveis para o seu programa. A diferença básica ao utilizar SET é que o objeto não é criado até que usamos a instrução SET. Podemos escrever o código anterior da seguinte maneira:

Dim EhnPrint As cPrint
Set EhnPrint = New cPrint

Se o objeto que você estiver criando possuir eventos associados, você irá precisar usar a instrução SET para criar o objeto. Além disso você precisará usar a palavra WithEvents no enunciado de declaração da variável. Isto irá sinalizar ao seu código que o objeto contem eventos que estão disponíveis ao seu programa. Como exemplo temos:

Private WithEvents mDataProc As DataProc

Definingo e retornando valores as propriedades - Depois que o objeto foi criado temos que acessar suas propriedades. Você pode definir e retornar valores das propriedades em seu código usando as instruções de atribuição da mesma maneira que você faz com as propriedades de um controle.Por exemplo, o código a seguir define a margem esquerda do objeto EhnPrint em 500.

EhnPrint.LMargin = 500

Lembre-se que Lmargin foi definida previamente usando um procedimento Property. Este enunciado faz com que o procedimento Property Let da classe seja executado. Para retornar o valor da propriedade margem esquerda, usamos o seguinte código;

curmarg = EhnPrint.LMargin

Esteja certo que as variáveis e valores literais usados no acesso as propriedades do objeto sejam do mesmo tipo que os definidos para a propriedade. Assim você pode definir um valor padrão no evento Initialize do módulo de classe.

Quando a propriedade de um objeto é um objeto , você não pode usar um enunciado padrão para definir ou retornar o seu valor. Neste caso você deve usar a instrução SET. Vejamos a seguir um exemplo que mostra como atribuir e obter o valor da propriedade OutputDev do objeto EhnPrint:

`Definindo o valor a propriedade
Set EhnPrint.OutputDev = Printer

`obtendo o valor da propriedade
Set objvar = EhnPrint.OutputDev

Usando os métodos - Usar os métodos de um objeto que você criou é como usar os métodos de um controle do Visual Basic. Para executar o método você fornece o nome do objeto e o nome do método e fornece os valores que são exigidos pelos argumentos do método. Estes argumentos são definidos na lista de argumentos do procedimento do módulo de classe. Vejamos como executar o método OutPut do objeto EhnPrint:

EhnPrint.Output "Isto é um teste."

Manipulando os Eventos do Objeto - O tratamento dos eventos de um objeto que você criou é igual ao tratamento dos eventos de um formulário, controle ,etc... Depois que você declarou um objeto usando a palavra WithEvents . o objeto é incluido em uma lista de objetos na janela de código do seu programa. Para tratar os eventos do objeto você seleciona o objeto de de uma lista , escolhe o seu evento e escreve o código para o evento.

Descartando um objeto - Depois que você terminou de usar um objeto em seu programa, você vai descartar o objeto ; para fazer isto apenas definindo o objeto para nada (to nothing) usando o seguinte código:

Set EhnPrint = Nothing

Quando você descarta o objeto qualquer código no evento Terminate da classe é executado.

Usando o Class Builder

O Visual Basic nos dá a opção de criar uma classe a partir do nada ou de usar o Class Builder(Construtor de Classes).Ao adicionar um módulo de classe você obtém a tela a seguir:

Selecionando VB Class Builder e clicando em abrir , o Class Builder será iniciado , como a tela abaixo:

O Class Builder fornece uma interface gráfica para classes, propriedades , métodos , constantes e eventos na sua aplicação.

Para inserir uma nova classe selecione no menu File a opção New -> Class...

Ou clique no primeiro ícone (Add New Class) da barra de ferramentas

A tela abaixo irá surgir: informe o nome da classe e clique em OK

Você pode com o Class Builder criar propriedades , métodos , eventos e enumerar suas variáveis públicas e quando você encerrar o Class Builder ele atualiza o seu projeto com qualquer alteração ou inclusão feita alem de gerar as declarações e o código de suporte . Você so vai ter que escrever o código no seu programa vb para usar a classe.

Criando Classes que contém Coleções (Collections)

Uma Coleção (collection) é um grupo de objetos que é em si mesmo um objeto.O Visual Basic possui duas coleções de objetos intrínsecas : A coleção Forms e a coleção Controls . Podemos usar as coleções com a instrução For Each...Next para realizar ações em todos os objetos que ela contém. Vejamos um exemplo de utilização onde minimizamos , através da procedure MnimezeAll, cada formulário carregado em uma aplicação:

Sub MinimizeAll()

    Dim frmElement As Form

    For Each frmElement In Forms
        ` Minimiza o form
        frmElement.WindowState = vbMinimized
   Next frmElement

End Sub

As coleções tentam resolver três problemas que enfrentamos quando trabalhamos com objetos:

  1. Elas criam uma maneira padronizada para criar e tratar multiplicas instâncias de um objeto.
  2. Elas agrupam objeto similares
  3. Elas organizam sistemas complexos de objetos em uma hierarquia.

Métodos e Propriedades padrão das coleções

As coleções compartilham um conjunto comum de propriedades e métodos.Os métodos comuns a todas as coleções são:.

Item Função
Count (propriedade) Encontra o numero de objetos em uma coleção
Item (método) Retorna um objeto especifico de uma coleção.
Add (propriedade) Inclui um objeto na coleção
Remove(propriedade) Exclui um objeto da coleção

Criando uma Nova coleção para ações agrupadas

Podemos criar novas coleções para conter formulários, controle e objetos ActiveX. Para isto usamos o tipo de data objecto Colletion. Vejamos como fica o código neste caso:

Dim colSelected As New Collection

Vejamos um exemplo de código que cria um nova coleção chamada de ColTextBoxes e que incluir todos as caixas de texto (text boxex) de um formulário em uma nova coleção.

Option Explicit
` Cria uma nova coleção que contém todos os text boxes de um form
Dim colTextBoxes As New Collection

Private Sub Form_Initialize()
    Dim cntrlItem As Control
    ` Faz um loop atraves dos controles do formulário

    For Each cntrlItem In Me.Controls
        ` Se o controle e um textbox , então o inclui na coleçao
        If TypeName(cntrlItem) = "TextBox" Then
            colTextBoxes.Add cntrlItem
        End If

   Next cntrlItem

End Sub

Vejamos a seguir um código que podemos usar em nossos sistemas. Ele limpa todos as caixas de texto de um formulário:

Sub cmdClear_Click()

Dim cntrlItem As Control
` Limpa cada text box da coleção

For Each cntrlItem In colTextBoxes
   cntrlItem.Text = ""
Next cntrlItem

End Sub

Usando as Coleções para organizar objetos

Quando uma aplicação define um quantidade grande de classes que se relacionam entre si , as coleções podem ser usadas para formar uma hierarquia de objetos. Esta hierarquia define um maneira mais compreensivel para os usuários escolherem qual objeto usar dentre os muitos existentes. A livraria de objetos do Excel object library é um bom exemplo de uma hierarquia de classes. Podemos usar as coleções do Excel para encontrar um objeto particular. Assim para tornar uma célula em uma planilha usar negrito fazemos:

Application.Workbooks("teste.xls").Sheets("Portfolio).Range(1,1).Font = xlBold

Abaixo descrevemos a ação realizada por cada método ou propriedade usada no código acima:

Item Função
Application Retorna o objeto mais alto da hierarquia
Workbooks Rtorna a coleção de todos os workbooks carregados no Excel.
("teste.xls") Item é o método padrão para a coleção Workbooks então "teste.xls" retorna o objeto workbook da coleção Woorkbooks
Sheets O método Sheets do objeto Workbook retorna a coleção de todas as Sheets do workbook.
("Portfolio") O método Item retorna um objeto Sheet da coleção Sheets.
Range O método Range do objeto Worksheet retorna a coleção de células de um worksheet.
(1,1) O método item do objeto Range retorna uma célula especifica da coleção Range.
Font = xlBold A propriedade Font do objeto Range object's Font define o efeito que deve aparecer na célula.

Da teoria para a prática : criando um classe para acessar um banco de dados

Vejamos uma aplicação de tudo o que abordamos até agora: iremos criar uma classe para abrir um banco de dados (usando a DAO) e retornar o objeto banco de dados invocado pelo programa. Se você estiver dizendo - "Grande coisa !! eu faço isso usando código diretamente. Qual a vantagem ??.

  1. Bem , usando uma classe podemos encapsular (isolar) o método OpenDatabase e todo o código de tratamento de erros associado a ele. Vamos ver como funciona ?
  2. Outra vantagem é que você não precisa repetir o código em seu programa. Basta simplesmente criar uma módulo de classe com o código e então toda vez que quiser usá-la , basta criar um instância da classe toda vez que precisar abrir o banco de dados em seu programa
  3. Você pode também criar uma DLL a partir de um módulo de classe; fazendo isto você não precisa incluir o módulo de classe em todo sistema que desenvolver.
  4. Tem mais, se você precisar alterar o código para alterá-lo , você só precisa fazer isto uma única vez.

Vamos chamar a nossa classe de cDataAccess .Ela é muito simples , contém um único método a uma única propriedade somente-leitura. Para usar a classe , o nome do banco de dados é passaod para o método Abrir_BD, e então o objeto database é retornado usando a propriedade Abrir_Dados. Vejamos o código para o nosso exemplo:

Inicie o VB e inclua o código em um módulo de classe salvando-o com o nome de cDataAccess.

Private m_ClsDb As Database

Public Property Get Abrir_Dados() As Database
   Set Abrir_Dados = m_ClsDb
End Property

Public Sub Abrir_BD(dbName As String)
  On Error GoTo DBErrHandle
  Set m_ClsDb = DBEngine.Workspaces(0).OpenDatabase(dbName,False, False)
  On Error GoTo 0
  Exit Sub
DBErrHandle:
errnum = Err
Select Case errnum
    Case 3049
        `Banco de dados corrompido 
        msgstr = "Seu banco de dados esta corrompido, deseja repará-lo ?"
        msgrtn = MsgBox(msgstr, vbYesNo + vbExclamation, "JcmSoft")
        If msgrtn = vbNo Then Exit Sub
        RepairDatabase (dbName)
        Resume
    Case 3056
        `Banco de dados nao pode ser reparado
        msgstr = "Seu banco de dados nao pode ser reparado, "
        msgstr = msgstr & "Restaure a copia do último backup."
        MsgBox msgstr, vbExclamation, "JcmSoft"
        Exit Sub
    Case Else
        `Outra mensagem qualquer
        msgstr = "O seguinte erro ocorreu com sua base de dados:  "
        msgstr = msgstr & "O Banco de dados: "
        msgstr = msgstr & Error$(errnum)
        MsgBox msgstr, vbExclamation, "JcmSoft"
        Exit Sub
End Select
End Sub

Observe que no procedimento Property Get , a propriedade é definida como sendo do tipo objeto Database .

Como usar a classe cDataAccess ?

Vejamos um exemplo de utilização da classe criada . Iremos abrir o banco de dados BIBLIO.MDB usando a classe criada. O código irá abrir a tabela Authors e mostrar uma lista dos autores em um list box. O código você insere em qualquer parte do seu projeto (no evento Load de um formulário por exemplo) , é o seguinte:

1-) No mesmo projeto anterior em um formulário inclua um listbox e um botão de comandos com o seguinte jeitão:

A classe cDataAccess em execução

Adicione as seguintes linhas de código a seção General declarations do formulário form1:

Dim db As Database
Dim rs As Recordset
Dim objData As Object

Inclua o seguinte código no evento click do botão de comando - command1 :

Private Sub command1_Click()
   Set objData = New cDataAccess
   objData.Abrir_BD "C:\teste\BIBLIO.MDB"
   Set db = objData.Abrir_Dados

   Set objData = Nothing
   Set rs = db.OpenRecordset("Authors", dbOpenDynaset)

   Do Until rs.EOF
      List1.AddItem rs("Author")
      rs.MoveNext
   Loop
   db.Close

End Sub

Inicie o projeto e clique no botão , Voilá , a caixa de listagem é preenchida com os autores da tabela Authors. Quem fez o serviço ??? Ora , a sua classe - cDataAccess . Palmas para ela...

Simples e fácil , não é mesmo ?

Agora quem vai decidir quando usar ou não os módulos de classe vai ser o bom senso. Se precisar creio que você terá plena condições de fazer o serviço... não é mesmo ??? Aguarde mais artigos sobre o assunto...

Ah ! pegue o projeto exemplo - clique aqui - classes.zip(4KB)


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#

Veja também os cursos em Vídeo Aulas :

Quer aprender os conceitos da Programação Orientada a objetos ?

  Gostou ?   Compartilhe no Facebook    Compartilhe no Twitter

Referências:


José Carlos Macoratti