IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Collection classes et "For each"


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut Collection classes et "For each"
    Bonjour,
    je suis en train de faire un test avec des collections.
    voilà, j'ai une classe "obj" toute simple sans truc particulier.
    j'ai par exemple une methode "truc()".

    Ensuite je veux créer une classe "Dossier" qui devra stocker des "obj".
    et etre capable de m'en retrouner une collection. un peu comme le Folder.Files du FSO Folder etant le Dossier et Files me retourne une collection de file (obj chez moi)

    voici donc comment j'ai commencé (je debute avec les collection )
    code de la classe dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    ' données membres
    Private lstobj As Collection
     
    ' constructeur
    Private Sub Class_Initialize()
      Set lstobj = New Collection
    End Sub
     
    ' destructeur
    Private Sub Class_Terminate()
      Set lstobj = Nothing
    End Sub
     
    ' membres classiques... d'accés à la collection
    Public Property Get Item(AValue As Variant) As Obj
      Set Item = lstobj.Item(AValue)
    End Property
    Public Property Get Count() As Long
      Count = lstobj.Count
    End Property
    Friend Sub Append(ByRef o As Obj)
      lstobj.Add o ' ajoute dans la collection
    End Sub
     
    ' pour generer des membres...
    Public Sub generer(ByVal n As Long)
    Dim x As Obj
        For i = 1 To n
            Set x = New Obj
            x.nom = "généré " & i   'un exemple
            x.v = Sin(i)   'un exemple
            lstobj.Add x
        Next
    End Sub
    'Public Function GetObjs() as ....?
    '???
    'End function
    voilà jusque là ca marche bien.
    dans mon form, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim d As Dossier
    Set d = New Dossier
    d.generer 5
     
    For Each bidule In d.GetObjs
     bidule.truc()
    Next
    Premiere question, comment je fait mon "GetObjs" ?
    Deuxieme question, est-ce que je suis obligé de passer par un "GetObjs", n'est-il pas possible d'avoir un truc qui marche avec "For Each bidule in d" ?

    pour info (mais ca ne sert a rien dans l'exemple) voici le code de la classe obj :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'code bidon pour l'exemple
    Public nom As String
    Public x As Long
    Public Function truc() As Long
        Debug.Print "truc! sur" & nom
        truc = 2 * x
    End Function
    Public Property Get v() As Long
        v = x
    End Property
    Public Property Let v(a As Long)
        x = Abs(a)
    End Property
    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Par défaut
    Bonjour hpfx,

    Voici un petit exemple d'utilisation des collections "personnalisées".
    Avec cet exemple tu dois pouvoir créer tes propres collections.

    Dans un nouveau projet, crée :
    1. Une form : Form1
    2. Une classe : MaCollection
    3. Une classe : MonObjet


    Attention une fois le code copier dans la classe MaCollection, il faut modifier les attributs des property Item et NewEnum comme indiqué dans le commentaire.

    Voici le contenu de chaque éléments
    Form 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Option Explicit
     
    Private Sub Form_Load()
      Dim MaCollection                  As MaCollection
      Dim Obj                           As MonObjet
      Dim Cpt                           As Integer
     
      Set MaCollection = New MaCollection
      For Cpt = 1 To 10
        Set Obj = New MonObjet
        Obj.Nom = "Nom de mon objet " & Cpt
        MaCollection.Add Obj
      Next Cpt
     
      Debug.Print "Nombre d'objet dans MaCollection : " & MaCollection.Count
      Debug.Print "Liste des objets"
      For Each Obj In MaCollection
        Debug.Print Obj.Nom
      Next Obj
    End Sub
    MonObjet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Private mNom As String
     
    Public Property Get Nom() As String
      Nom = mNom
    End Property
     
    Public Property Let Nom(ByVal vNewValue As String)
      mNom = vNewValue
    End Property
    MaCollection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Option Explicit
     
    'Cette classe correspond à une collection d'objet MonObjet
     
    Private mCol                        As Collection
     
    Private Sub Class_Initialize()
       Set mCol = New Collection
    End Sub
    Private Sub Class_Terminate()
       Set mCol = Nothing
    End Sub
     
     
    Public Property Get Item(ByVal IndexKey As Variant) As MonObjet
      'Mettre cette property par Défaut
      'Menu "Outils","Attribut de procédure", mettre "ID de la procédure" = (Par défaut) et cocher "Valeur par défaut de l'interface utilisateur"
       Set Item = mCol(IndexKey)
    End Property
     
    Public Property Get Count() As Long
       Count = mCol.Count
    End Property
     
    Public Property Get NewEnum() As IUnknown
      'Property pour faire fonctionner les For each
     
      'Mettre cette property à -1
      'Menu "Outils","Attribut de procédure", mettre "ID de la procédure" = -4 et cocher "Masquer ce menbre"
     
       Set NewEnum = mCol.[_NewEnum]
    End Property
     
    Friend Sub Add(ByRef Action As MonObjet)
       mCol.Add Action
    End Sub

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Wouah !!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Property Get Item(ByVal IndexKey As Variant) As MonObjet
      'Mettre cette property par Défaut
      'Menu "Outils","Attribut de procédure", mettre "ID de la procédure" = (Par défaut) et cocher "Valeur par défaut de l'interface utilisateur"
       Set Item = mCol(IndexKey)
    End Property
    Je ne connaissait pas ce menu Outils>Attribut de procédure !

    Mais mais mais... y a t'il de la doc la dessus, un tutorial ?
    c'est dingue ce truc, mais comment on sais quel attribut ont été placé, on ne les vois pas dans le code ni dans la boites des propriétés...

    Un grand merci.
    Impecable !

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Par défaut
    Citation Envoyé par hpfx Voir le message
    Mais mais mais... y a t'il de la doc la dessus, un tutorial ?
    Dans la doc "officiel" je ne l'ai pas vu souvent.

    Citation Envoyé par hpfx Voir le message
    c'est dingue ce truc, mais comment on sais quel attribut ont été placé, on ne les vois pas dans le code ni dans la boites des propriétés...
    Tu ne le vois pas dans le code, mais bien dans la fenêtre d'attibut de la procédure.
    Tu peux le voir si tu ouvert la classe dans NotePad...
    Attention au copier-coller dans VB qui ne transfert pas ces attributs...

    Personnellement mon préfére c'est le -4 de NewEnum : super explicite !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment effacer un element dans un collection dans une boucle for each
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2008, 12h48
  2. Collection invisible avec for each
    Par afrodje dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/04/2007, 12h08
  3. classe conteneur et for each
    Par Shb33 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 25/10/2006, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo