Pb de structure de collection

Résolu
cs_zephyrin Messages postés 47 Date d'inscription mercredi 29 mai 2002 Statut Membre Dernière intervention 17 août 2006 - 18 juin 2003 à 10:24
cs_zephyrin Messages postés 47 Date d'inscription mercredi 29 mai 2002 Statut Membre Dernière intervention 17 août 2006 - 18 juin 2003 à 11:51
Bonojur,

j'ai un problème de structure de mes collections :

Pourquoi dans la collection "pcolVisees" je peux voir les items depuis l'extérieur (avec debug, je les vois 2 fois) alors qu'avec la collection "IOM_pcolVisees" ce n'est pas le cas ?

Je voudrais que la collection "IOM_pcolVisees" se comporte comme "pcolVisees" - ce qui est le cas pour toutes mes autres collections !!

Merci

Zephyrin

***********************

code fenêtre :
----------------
Option Explicit
Dim colVisees As pcolVisees
Dim clsVisees As pclsVisees

Dim colViseesIOM As IOM_pcolVisees
Dim clsViseesIOM As IOM_pclsVisees

Private Sub cmdBouton_Click()
Set colVisees = New pcolVisees

Set clsVisees = colVisees.Add("Elt", "min", "mep", "max")
End Sub

Private Sub cmdBouton2_Click()
Dim res As Long

Set colViseesIOM = New IOM_pcolVisees

res = colViseesIOM.flViseeMEPEcrire("Elt", "min", "mep", "max")

Set clsViseesIOM = colViseesIOM.Item("Elt")
End Sub

************************

classe IOM_pclsVisees :
---------------------------
Option Explicit

'variables locales de stockage des valeurs de propriétés
Private psNomElement As String
Private psMEP As String
Private psMEPMin As String
Private psMEPMax As String

Friend Property Let MepMax(ByVal valeur As String)
psMEPMax = valeur
End Property

Friend Property Get MepMax() As String
MepMax = psMEPMax
End Property

Friend Property Let MepMin(ByVal valeur As String)
psMEPMin = valeur
End Property

Friend Property Get MepMin() As String
MepMin = psMEPMin
End Property

Friend Property Let MEP(ByVal valeur As String)
psMEP = valeur
End Property

Friend Property Get MEP() As String
MEP = psMEP
End Property

Friend Property Let nomElement(ByVal nom As String)
psNomElement = nom
End Property

Friend Property Get nomElement() As String
nomElement = psNomElement
End Property

********************************

classe IOM_pcolVisees
-------------------------
Option Explicit

'variable locale pour la collection
Private pcolVisees As Collection

Friend Function flViseeMEPEcrire(nomElement As String, MepMin As String, MEP As String, MepMax As String) As Long
Dim pclsVisee As IOM_pclsVisees

On Error Resume Next
'recherche si l'élément a déjà au moins une visée (AOD, MEP ou SA)
Set pclsVisee = pcolVisees.Item(nomElement)
If Err.Number = 0 Then
' L'élément existe déjà, il suffit de lui affecter les valeurs
pclsVisee.MEP = MEP
pclsVisee.MepMin = MepMin
pclsVisee.MepMax = MepMax
Else
' l'élement n'existe pas, il faut le créer
Set pclsVisee = New IOM_pclsVisees
pclsVisee.MEP = MEP
pclsVisee.MepMin = MepMin
pclsVisee.MepMax = MepMax
pcolVisees.Add pclsVisee, nomElement
End If
flViseeMEPEcrire = 0
Set pclsVisee = Nothing
End Function

Friend Property Get Item(vntIndexKey As Variant) As IOM_pclsVisees
Set Item = pcolVisees(vntIndexKey)
End Property

Friend Property Get Count() As Long
Count = pcolVisees.Count
End Property

Friend Sub Remove(vntIndexKey As Variant)
pcolVisees.Remove vntIndexKey
End Sub

Friend Property Get NewEnum() As IUnknown
Set NewEnum = pcolVisees.[_NewEnum]
End Property

Private Sub Class_Initialize()
Set pcolVisees = New Collection
End Sub

Private Sub Class_Terminate()
Set pcolVisees = Nothing
End Sub

**********************************

classe pclsVisees
-------------------
Option Explicit

Private mvarMEP As String
Private mvarMepMin As String
Private mvarMepMax As String
Private mvarElement As String

Public Property Let Element(ByVal vData As String)
mvarElement = vData
End Property

Public Property Get Element() As String
Element = mvarElement
End Property

Public Property Let MepMax(ByVal vData As String)
mvarMepMax = vData
End Property

Public Property Get MepMax() As String
MepMax = mvarMepMax
End Property

Public Property Let MepMin(ByVal vData As String)
mvarMepMin = vData
End Property

Public Property Get MepMin() As String
MepMin = mvarMepMin
End Property

Public Property Let MEP(ByVal vData As String)
mvarMEP = vData
End Property

Public Property Get MEP() As String
MEP = mvarMEP
End Property

********************************

classe pcolVisees
-------------------
Option Explicit

'variable locale pour la collection
Private mCol As Collection

Public Function Add(MEP As String, MepMin As String, MepMax As String, Element As String) As pclsVisees
Dim objNewMember As pclsVisees
Set objNewMember = New pclsVisees
objNewMember.MEP = MEP
objNewMember.MepMin = MepMin
objNewMember.MepMax = MepMax
objNewMember.Element = Element
mCol.Add objNewMember, Element
Set Add = objNewMember
Set objNewMember = Nothing
End Function

Public Property Get Item(vntIndexKey As Variant) As pclsVisees
Set Item = mCol(vntIndexKey)
End Property

Public Property Get Count() As Long
Count = mCol.Count
End Property

Public Sub Remove(vntIndexKey As Variant)
mCol.Remove vntIndexKey
End Sub

Public Property Get NewEnum() As IUnknown
Set NewEnum = mCol.[_NewEnum]
End Property

Private Sub Class_Initialize()
Set mCol = New Collection
End Sub

Private Sub Class_Terminate()
Set mCol = Nothing
End Sub

1 réponse

cs_zephyrin Messages postés 47 Date d'inscription mercredi 29 mai 2002 Statut Membre Dernière intervention 17 août 2006
18 juin 2003 à 11:51
dans les fichiers VB, il y a du code caché "Attribute ..." - non vu depuis l'interface de codage.

En éditant le fichier de ma collection, j'ai découvert qu'il manquait dans les propriétés suivantes :

Public Property Get Item(vntIndexKey As Variant) As IOM_pclsVisees
Attribute Item.VB_UserMemId = 0
Set Item = pcolVisees(vntIndexKey)
End Property

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
Set NewEnum = pcolVisees.[_NewEnum]
End Property

Maintenant tout marche !!!
3
Rejoignez-nous