Un For Each que ne fonctionne pas avec une collection maison !

Résolu
EMMANUELTAVE Messages postés 22 Date d'inscription vendredi 21 janvier 2005 Statut Membre Dernière intervention 3 janvier 2008 - 31 août 2007 à 02:48
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 - 31 août 2007 à 09:35
bonsoir,
Je transforme une application VB6 en VB2005 : Ouf je m'acroche !

voici ma classe de base : rien de tres .....




Public Class cArbHier
 Private mstrArbHierCode As String
 Private mstrArbHierDescription As String





 Public Property ArbHierCode() As String
  Get
     Return mstrArbHierCode
  End Get
  Set(ByVal value As String)
     mstrArbHierCode = value
  End Set
 End Property



 Public Property ArbHierDescription() As String
  Get
     Return mstrArbHierDescription
  End Get
  Set(ByVal value As String)
     mstrArbHierDescription = value
  End Set
 End Property
End Class



Je cree ma classe de collection comme suite :



Imports System.Collections



Public Class cArbHiers
 Private mCollection As System.Collections.Generic.List(Of cArbHier)
 Private mlinkArbHier As cArbHier



 Sub New()
  mCollection = New System.Collections.Generic.List(Of cArbHier)
  mlinkArbHier = New cArbHier
 End Sub



 Public Function Add(ByVal obAjouter As cArbHier, ByVal lngKey As Integer) As cArbHier
  mCollection.Add(obAjouter)
  Add = obAjouter
 End Function



 Public ReadOnly Property Item(ByVal Index As Integer) As cArbHier
  Get
   Item = mCollection.Item(Index)
  End Get
 End Property



 Public ReadOnly Property Count() As Integer
  Get
   Count = mCollection.Count
  End Get
 End Property



 Public Property cArbHier() As cArbHier
  Get
   If mlinkArbHier Is Nothing Then
    mlinkArbHier = New cArbHier
   End If
   cArbHier = mlinkArbHier
  End Get
  Set(ByVal value As Codex_Vp_App.cArbHier)
   mlinkArbHier = value
  End Set
 End Property
End Class






les lignes suivantes fonctionne correctement :




Dim toto As New cArbHier





toto.ArbHierCode = "1Test"



Dim coltoto As New cArbHiers



coltoto.Add(toto)
Console.WriteLine(coltoto.Item(1).ArbHierCode)






Par Contre Celle-ci c'est la misére :









For Each titi As cArbHier In coltoto




   Console.WriteLine(titi.ArbHierCode)


Next






j'ai lu beaucoup mais je n'ai pas trouver de solution.
Merci de votre aide




Ps conseil l'excelent tutorial :
http://plasserre.developpez.com

2 réponses

Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
31 août 2007 à 09:35
Et si, plutot que de mettre un membre private de type Collection, tu dérivais ta classe de ce même type ? Je sais, en venant de VB6 on n'a pas le reflexe de l'héritage.
Le souci vient du fait que je crois que pour utiliser For Each sur une classe, elle doit implémenté l'interface IEnumerable,ce que fait le type System.Collection.generic.List je pense.

Donc un simple Inherits dessus devrait le faire (puisque tu vas hérité des interfaces implémenté par ta classe de base.)
Tu seras peut-être obligé de remanier le code des memnbres de ta collection, masi si tu travaille sous VB.NET 2005, il te guidera en te disant que tel membre dois être overrides ou shadows, etc ...
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
31 août 2007 à 02:57
salut,

en vb6, pour implémenter For Each avec une classe collection, il fallait ajouter le membre caché de la collection _NewEnum () As IUnknown et passer l'attribut de procédure à -4, de mémoire :

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

Voit si tu n'as pas une manip similaire en DotNet

@++

<hr width="100%" size="2" />( Nouveau forum : Exclusivement Office & VBA/STRONG>
0
Rejoignez-nous