Se você reparar, o VB possui vários tipos de coleções: forms(coleção de formulários), controls (coleção de controles),
nodes (coleção de nós do treview), printers (coleção de impressoras) entre outras.
E um item pra cada coleção:
- item --> coleção
- form --> forms
- control --> controls
- node --> nodes
- printer --> printers
Ou seja, para saber se é coleção basta ver: Plural é uma coleção, singular é item de uma coleção. Viu que fácil? :)
E apenas um tipo de variável Collection do qual podemos usar. Poxa vida, e se eu quiser criar meu próprio tipo de collection, usar um "for ... each" e tudo mais? Não posso... fiquei triste :õ(
Não fique :D Isso é bem fácil.
Você tera o item da sua coleção --> Item
Você deverá ter a sua coleção --> Itens
lembra? Plural e Singular. Ok! até aqui tudo bem. Eu crio uma classe chamada Item e outra chamada Itens. Vamos usar Telefone e Telefones.
Crie um classe chamada Telefone e outra Telefones. Na classe Telefone implemente tudo que será necessário. Vamos implementar as propriedades Nome, Telefone e Email. Cole na sua classe Telefone o código Abaixo
'*****************************
'* Item da coleção Telefones *
'* Classe Telefone *
'*****************************
Option Explicit
Public Nome As String
Public Telefone As String
Public Email As String
Muito bem! Você já definiu sua classe de item, o tipo que sua collection irá receber (Telefone). Agora vamos implementar a classe Telefones, nossa coleção de itens telefone. Cole na sua classe Telefones (nossa collection) o código Abaixo:
'************************************
'* Classe coleção de Telefone *
'* Classe Telefones *
'************************************
Option Explicit
'variável usada para manipular a nossa coleção
Private mCol As Collection
Public Function Add(ByVal pItem As Telefone, Optional sKey As String) As Telefone
'novo objeto
Dim objNewMember As Telefone
Set objNewMember = New Telefone
'passa as propriedades para a cópia
With pItem
objNewMember.Nome = .Nome
objNewMember.Telefone = .Telefone
objNewMember.Email = .Email
End With
If Len(sKey) = 0 Then
mCol.Add objNewMember
Else
mCol.Add objNewMember, sKey
End If
'retorna o objeto criado
Set Add = objNewMember
Set objNewMember = Nothing
End Function
Public Property Get Item(Index As Variant) As Telefone
Set Item = mCol(Index)
End Property
Public Property Get Count() As Long
Count = mCol.Count
End Property
Public Sub Remove(Index As Variant)
'usado para remover o item da coleção.
'index é declarado como variante porque recupera tanto o Key qto Indice.
mCol.Remove Index
End Sub
Public Property Get NewEnum() As IUnknown
'esta propriedade permite que vc enumre a coleção para um loop For...Each
'é necessário, porque a mesma implementa a interface IUnknown
'Collection sem For Each não tem graça :p
'para que o for ... each funcione ela tem que existir. E ... tem mais
'Você de mudar o procedure ID dela no VB. Da seguinte maneira.
'vá em Tools - > Procedure Atributes - >
'No form que aparecer vá em "Name" e selecione NewEnum
'Clique no botão "Advanced"
'Na caixa Procedure ID digite o valor -4 isso fará com que o VB implemente a interface
'IUnknown para esta propriedade. Sem isto o for ... each não funciona :)
Set NewEnum = mCol.[_NewEnum]
End Property
Private Sub Class_Initialize()
'instancia a coleção local
Set mCol = New Collection
End Sub
Private Sub Class_Terminate()
'destroi a coleção local
Set mCol = Nothing
End Sub
Muito Bem! Aqui nesta classe (telefones) você pode implementar qquer método, propriedade que vc achar necessário.
Mas um atenção especial a esta propriedade: "NewEnum"
ela é a responsável por fazer o for ... each funcionar.
veja:
Public Property Get NewEnum() As IUnknown
'esta propriedade permite que vc enumre a coleção para um loop For...Each
'é necessário, porque a mesma implementa a interface IUnknown
'Collection sem For Each não tem graça :p
'para que o for ... each funcione ela tem que existir. E ... tem mais
'Você de mudar o procedure ID dela no VB. Da seguinte maneira.
'vá em Tools - > Procedure Atributes - >
'No form que aparecer vá em "Name" e selecione NewEnum
'Clique no botão "Advanced"
'Na caixa Procedure ID digite o valor -4 isso fará com que o VB implemente a interface
'IUnknown para esta propriedade. Sem isto o for ... each não funciona :)
Set NewEnum = mCol.[_NewEnum]
End Property
O IUnknown é um interface na qual o VB deverá implementar e se vc não fizer o passo-a-passo acima
o for ... each não irá funcionar. E nda adiantará seu próprio tipo de collection :)
Bom qquer comentário será bem vindo:
marcelo@desenvolvedores.net
Meu site: http://desenvolvedores.net
link do projeto acima com exemplos e funções, para tornar o entendimento melhor. Estude o código.
Exemplo de Minha Collection
Espero ter sido claro... e até o próximo artigo. Se vc quiser algum em especial não exite em pedir :) E por favor. Vote neste artigo ...