Back-End

3 out, 2007

Coleções de objetos no Visual Basic 6

Publicidade

Vamos falar sobre um assunto bastante interessante, chamado Coleções. Quem programa em alguma linguagem orientada a objetos certamente conhece este conceito. Porém, não podemos esquecer que o VB também pode ser orientado a objetos, possuindo também algumas funcionalidades de com os mesmos. Uma delas é a classe interna do VB chamada Collection.

1 – O quê são Coleções?

Coleções são como vetores, porém foram criadas para trabalhar com objetos e de forma mais dinâmica. Para ajudar a entender, farei uma analogia meio grotesca. Pode-se imaginar uma Collection como sendo um ListBox e os itens que iremos adicionar nele, ao invés de serem Strings, serão Objetos. Ficou mais fácil agora ? Isso mesmo, uma ListBox de Objetos.

2 – O quê são Objetos?

Quem já programa orientado a objetos iria querer me matar por escrever uma coisa tão óbvia, mas quem está acostumado apenas a manipular eventos acaba não sabendo o que é um objeto. Objetos são instâncias de classes, que possuem características e comportamento próprios (Métodos e Propriedades). Por exemplo, uma classe “Cadeira” pode ter os Atributos “cor”, “quantidade_de_pernas”, “tamanho” e os métodos “Sentar()”, “Arrastar()”. Enquanto classe ela é apenas um projeto, um esboço, e se torna realmente um objeto a partir do momento em que ela é instanciada (comando “New”).

Agora vem uma grande notícia: todo componente do ToolBox do VB, a partir do momento que você arrasta para o Form, ele vira um Objeto (e o próprio Form também é um objeto). Para ajudar a entender, no exemplo do Form, ele é um objeto que possui Atributos “Top”, “Left”, “Width”, “Height”, “Visible” e métodos “Hide”, “Show”, “SetFocus” dentre outros.

Agora que já está claro o que são objetos, vamos voltar às coleções.

3 – Declarando e instanciando uma Coleção

Pense na coleção como se ela fosse uma variável, porém, por ser uma classe, devemos instanciá-la com o comando “New”:

Dim Colecao As New Collection

4 – Funcionalidades que a Coleção oferece (Métodos)

Uma coleção é muito simples de ser usada. Ela oferece apenas métodos, e ao todo são quatro:

——————————————————————————–

Método: Add

Parâmetros: Objeto a ser adicionado

Descrição: Adiciona um Objeto à coleção (comparado com o ListBox.AddItem)

——————————————————————————–

Método: Count

Parâmetros: Nenhum

Descrição: Retorna a quantidade de Objetos na coleção (comparado com o ListBox.ListCount)

——————————————————————————–

Método: Item

Parâmetros: Item da coleção

Descrição: Retona a referência ao objeto referente ao Item da coleção (comparado com o ListBox.List)

——————————————————————————–

Método: Remove

Parâmetros: Item da coleção

Descrição: Remove da coleção o objeto referente ao Item (comparado com o ListBox.RemoveItem)

——————————————————————————–

5 – Exemplos de uso dos métodos de uma Coleção

Falamos muito de teoria, agora chegou a hora de pôr a mão na massa. Começaremos com um exemplo de uso de cada método que possui uma coleção:

'Adicionando objetos à coleção
Colecao.Add Form1
Colecao.Add Command1
Colecao.Add Command2
Colecao.Add Image1

'Contando os objetos da coleção
MsgBox "A colecao contém " & Colecao.Count & " objetos !"

'Acessando membros de objetos pelo seu índice na coleção
'(não deve ser usado desta forma, veremos o porquê logo mais)
Colecao(2).Visible = False 'Neste caso apenas o Command1 desaparecerá
Colecao(4).Picture = LoadPicture() 'Limparemos o Image1

'Removendo objetos da coleção
Colecao.Remove 2 'Neste caso tiraremos o Command1 da coleção
Colecao.Remove 4 'Tiraremos o Image1 da coleção

Obs.: Uma das particularidades (que por sinal é tida como uma vantagem) das coleções é que, como dito antes, ela é dinâmica, ou seja, se removido um Item, ela comprime seu índice e auto-ajusta à nova quantidade. Utilizando o exemplo acima, se removermos o Item 3 (Command2), então o Image1 passará a ocupar a posição 3. Logo, se uma linha posterior tiver o comando “Colecao(4).Picture = LoadPicture()” certamente veremos um erro, pois o índice 4 não é mais um Image (nem sequer existe mais!). Veremos como fazer isto de modo correto logo mais.

6 – Varrendo os Itens de uma coleção

Quando temos um vetor, o procedimento é simples, basta fazer um “for to next” varrendo seus índices. Em coleções podemos fazer deste modo, mas também existe um outro comando que deixa o código mais limpo e que é o mais usado por convenção, veremos logo mais.

Vamos supor que temos uma coleção chamada “Colecao” com vários CommandButtons, ListBoxes, PictureBoxes e Images adicionados.

Maneira 1 – Varrendo Itens da coleção pelo índice:

Dim i As Integer

For i = 1 To Colecao.Count
     Colecao(i).Visible = False
Next

Obs.:

– O laço acima atribuiria “.Visible = False” para todos os objetos da coleção.

– Notem que na coleção, o primeiro Ítem é o de índice um, não existe índice zero.

– Notem que neste caso o atributo “.Visible” precisaria existir em todos os objetos da coleção, senão ocorreria um erro ao tentar acessar a propriedade “Visible” de um objeto que não a contém.

Maneira 2 – Varrendo Itens da coleção usando “for each in next”:

Dim Ctl As Object

For Each Ctl In Colecao
     Ctl.Visible = False
Next

Obs.: O exemplo acima faz exatamente a mesma coisa que o anterior, porém deixa o código muito mais limpo e legível. A partir de agora adotaremos apenas este método.

Varrendo itens da coleção acessando apenas determinados tipos de Objetos

Dim Ctl As Object

For Each Ctl In Colecao
     If TypeOf Ctl Is CommandButton Then
          Ctl.Visible = False
     End If
Next

Finalmente chegamos a uma das utilidades mais importantes das coleções. Acessar membros de apenas um tipo de objeto, independentemente de quantos objetos diferentes a coleção armazenar. Neste exemplo acima, apenas os CommandButtons terão “Visible = False”. Desta mesma forma podemos fazer em PictureBoxes, ListBoxes, Images ou qualquer outro objeto que você tenha adicionado à coleção.

E ainda mais, podemos da mesma forma acessar um Objeto pelo seu identificador (Name), que seria o maior grau de especificação para um objeto dentro de uma coleção:

Dim Ctl As Object

For Each Ctl In Colecao
     If Ctl.Name = "Botao1" Then
          Ctl.Visible = False
     End If
Next

Obs.: Notem que o Identificador (Name) do Objeto é tido como uma String (“Botao1” entre aspas), logo podemos pensar mais à frente e utilizar concatenação de Strings para formar identificadores convenientes e facilitar a localização de um grupo de Objetos.

Ex.:

Dim Ctl As Object
Dim i As Integer

For Each Ctl In Colecao
     For i = 0 To 10
          If Ctl.Name = "BotoesA" & i Then
               Ctl.Visible = False
          End If
     Next
Next

Agora a criatividade é o limite! Porém fique atento para não incrementar o código exageradamente a ponto de dificultar sua manutenção.

7 – Parâmetro KEY

Em alguns controles do VB (como no Toolbar por exemplo) costumamos ver um parâmetro chamado “key”. As coleções também apresentam este parâmetro que, apesar de não ser obrigatório, é extremamente útil para acessarmos objetos dentro delas. Este valor é do tipo String e é declarado quando adicionamos um objeto à coleção:

Colecao.Add Command1, "Botao Principal"

No exemplo acima, a String “Botao Principal” é a nossa KEY. Com isso podemos acessar rapidamente um objeto específico sem laço algum, da seguinte forma:

Colecao("Botao Principal").Visible = False

Outro exemplo onde fica clara sua utilidade: imagine um cadastro de clientes, onde temos o objeto “Cliente”, que possui vários campos, entre eles os campos “CPF” e “Nome”. Podemos vincular a KEY da coleção de clientes a um campo e assim acessar facilmente um cliente específico:

'Declaração e instanciação da coleção de clientes e do objeto "Cliente"
Dim Clientes As New Collection
Dim Cliente1 As New Cliente

'Preenchemos o Objeto
Cliente1.Nome = "Gilberto Holms"
Cliente1.CPF = "343.520.008-17"

'Adicionamos um cliente (devidamente preenchido) à coleção
'Note que vinculamos o campo CPF ao parâmetro KEY 
'(Obs: key precisa ser String)
Clientes.Add Cliente1, Cliente1.CPF

'Acessamos um determinado cliente de CPF "343.520.008-17" sem laços
MsgBox Clientes("343.520.008-17").Nome

8 – Coleções criadas automaticamente pelo VB

Para finalizar o artigo, falarei de algumas coleções que são criadas automaticamente quando se compila o código fonte. Para facilitar nosso trabalho, o próprio VB cria algumas coleções de objetos que utilizamos na montagem do nosso Form. São elas:

——————————————————————————–

Coleção: Forms

Objetos contidos: Todos os Forms de nosso projeto

——————————————————————————–

Coleção: Controls

Objetos contidos: Todos os Controles de um Form (CommandButtons, PicturesBoxes, Images, ListBoxes, etc…)

——————————————————————————–

Coleção: Printers

Objetos contidos: Todas as impressoras instaladas

——————————————————————————–

Ou seja, sem declarar e instanciar nenhuma coleção, poderíamos perfeitamente compilar o código abaixo:

Dim Ctl As Object

For Each Ctl In Form1.Controls
     If Ctl.Name = "Botao1" Then
          Ctl.Visible = False
     End If
Next

Com isto, finalizo este artigo sobre Collections. Podemos ver que elas são muito úteis para minimizar o esforço de programação e otimizar incrivelmente o código, pois podemos acessar e gerenciar inúmeros objetos diferentes de forma totalmente dinâmica. Até a próxima matéria!