Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 171

Comment utiliser l'objet Collection ?

Lorsqu'il est nécessaire de tenir trace de plusieurs objets créés dynamiquement, l'objet Collection s'avère être un allié précieux. Cet objet travaille sur des variables de types Variant, provoquant donc une certaine lenteur lors de l'accès aux éléments, en comparaison des tableaux dynamiques. Néanmoins, cet objet possède de meilleures performances que la gestion de tableau pour l'insertion ou la suppression d'éléments. D'autre part, l'objet Collection permet d'associer à chacun des éléments stockés une chaîne de caractère, dite clé, permettant un autre moyen d'accès aux éléments que par les habituels index.

L'objet collection n'est pas la seule manière de gérer dynamiquement des données. D'autres structures dynamiques peuvent s'avérer plus appropriées lorsque certaines opérations spécifiques doivent être réalisées.

Opérations de base

Après avoir alloué un nouvel objet collection, les méthodes Add, Remove et Item permettent très simplement de gérer les objets. La manipulation de données dans cet objet a une différence principale avec la manipulation d'éléments d'un tableau : le premier indice référant à un élément est 1 et non 0. Il est aussi possible de déterminer le nombre d'éléments présents dans la collection à l'aide de la méthode Count

Dans l'exemple suivant, nous montrons comment allouer un objet collection, ajouter et supprimer des éléments :

    Dim MyCollection As Collection
    Dim Value as Variant
    Dim i As Long

    'Alloue une nouvelle collection
    Set MyCollection = new Collection

    'Ajoute des valeurs dans la collection
    MyCollection.Add 1
    MyCollection.Add 3
    MyCollection.Add 21

    'Affiche toutes les valeurs dans la collection (1, 3, 21)
    'A noter que la variable d'énumération doit être de type Variant
    'pour pouvoir utiliser la syntaxe For Each avec des types natifs
    For Each Value in Mycollection
        Debug.Print Value
    Next Value

    'Affiche le troisième élément (21)
    Debug.Print MyCollection.Item(3)

    'Insère 14 à sa place dans la liste (après le second élément)
    MyCollection.Add 14, , , 2

    'Supprime le second élément (3)
    MyCollection.Remove 2

    'Affiche toutes les valeurs en ordre inverse
    'Remarquez que le troisième élément est maintenant 14
    For i = MyCollection.Count To 1 Step -1
        Debug.Print MyCollection.Item(i)
    Next i

Une clé pour chaque élément

Il est parfois plus pratique de référer à un élément dans une collection par un nom attribué (ou clé) que par sa position dans la collection. Imaginez très simplement le cas d'une collection bibliothèque qui référence chaque livre. Si un lecteur veut un livre spécifique, il sera préférable de s'y référer par son ISBN que par un numéro sans autre signification. Les méthodes Add, Remove, Item permettent de référer à un élément par une telle clé. Voici une illustration de l'exemple proposé :

    Dim Title As String
    Dim Library As Collection
     
    'Alloue une nouvelle bibliothèque
    Set Library = New Collection
     
    'Ajoute quelques livres avec leur ISBN
    Library.Add "Hardcore Visual Basic", "978-1556156670"
    Library.Add "Internationalization with Visual Basic", "978-0672319778"
    Library.Add "Advanced Visual Basic 6: Power Techniques for Everyday Programs", "978-0201707120"
     
    'Essaye de trouver différents livres
    On Error Resume Next
    'Hardcore Visual Basic
    Title = Library.Item("978-0672319778")
     
    'Un test d'erreur (fortement simplifié pour cet exemple) permet de déterminer si le livre est ou non disponible
    If Err.Number = 0 Then
        Debug.Print "Livre disponible: " & Title
    Else
        Debug.Print "Livre indisponible"
    End If
     
    'Faisons de même pour le livre "Writing secure code"
    Title = Library.Item("978-0735617223")
     
    If Err.Number = 0 Then
        Debug.Print "Livre disponible: " & Title
    Else
        Debug.Print "Livre indisponible"
    End If
     
    On Error GoTo 0

    'Supprime le livre Internationalization with Visual Basic de la collection
    Library.Remove "978-0672319778"

Si les clés que vous employez sont purement numériques, certaines précautions doivent être prises.

L'impact sur les performances de l'emploi de clé est minime : l'objet Collection emploie une table de hachage de sorte à rendre les opérations aussi rapides que possible.

Des collections robustes

Très rapidement, on se rend compte que des données de types très différents pourraient être stockées, intentionnellement ou non, dans la collection. Il est souvent utile, pour la robustesse de l'application de s'assurer que les données ajoutées sont des données attendues. Afin d'offrir la même flexibilité que celle de l'objet Collection de base, tout en assurant la robustesse du nouvel objet, nous devrons réaliser les points suivants :

  • Réaliser des méthodes fortement typées
  • Offrir un accesseur à la méthode masquée permettant le For Each
  • Intégrer les vérifications nécessaires pour assurer l'intégrité des données
  • Permettre à l'utilisateur d'ajouter une clé dans notre collection personnalisée
  • Définir Item comme étant la méthode par défaut

Ceci est documenté dans les exemples Maison de paille, maison de bâtons et maison de briques de la MSDN. A noter toutefois une coquille : les boutons d'ajout et de suppression sont nommés cmdAddEmployee et cmdDeleteEmployee, mais les procédures événementielles correspondantes sont nommées cmdEmployeeAdd_Click et cmdEmployeeRemove_Click.

L'opérateur "bang"

Lorsque la clé est connue dès la conception de l'application, il est possible d'utiliser l'opérateur bang (dont le symbole est le point d'exclamation) afin d'accéder à l'élément voulu. Il est à noter que cet opérateur n'est généralement pas présent dans d'autres langages, ce qui peut poser des problèmes de portabilité. De plus, l'usage de cet opérateur n'est pas très répandu. Il est donc présenté ici à titre purement informatif.

    Dim a As Collection

    Set a = new Collection

    'Ajoute un élément spécial, pour l'exécution du programme dans la collection
    a.Add "My root node", "rootkey"

    'Ecrire un code de traitement ici

    'Affiche l'élément spécial à l'aide de l'opérateur "bang"
    MsgBox a!rootkey

Pour aller plus loin

Voir aussi :

Date de publication : 13 septembre 2007
Dernière modification : 13 septembre 2007
Rubriques : Généralités
Mots-clés : collection, dynamique, ajout, supression, élement, clé, key, nombre, bang, point d'exclamation