Caminho de Navegação Visual basic / Artigos / Criando sua própria Collection

Nenhuma avalição
Indique ao Ueba Indique ao BlogBlogs Indique ao Delicious Indique ao Technorati Indique ao Google Bookmarks Indique ao Newsgator
TAGS

Nenhuma tag foi definida ainda!

Defina as tags para esta página preenchendo o campo abaixo.

  • Máximo de 100 tags
  • Cada tag deve ter até 20 caracteres.
  • Separar as tags com virgula. Ex.: php, sql, html, xml, fireworks
COMENTAR

INDICAR
Nome do amigo: E-mail do amigo: Comentário:
REPORTAR ERRO Descreva o erro:

Criando sua própria CollectionPostada em: 18/02/2005

Marcelo de Souza
Por: Marcelo de Souza Nº de Visualizações: 4803.



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 ...