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 :

Créer un objet comprenant plusieurs collections


Sujet :

VB 6 et antérieur

  1. #1
    Membre régulier
    Créer un objet comprenant plusieurs collections
    Bonjour à tous.

    J'espère qu'il y a encore des contributeurs à ce forum qui continuent à "jouer" avec VB6. Je crois que ma question d'aujourd'hui est assez pointue...

    Pour créer mon objet, je crée un classe (c'est classique). Le but est de rendre utilisable dans le code VB6 les données d'un fichier ".ini" (je sais qu'il existe une API, mais c'est pour apprendre...)

    Dans un premier temps, j'ai fait un objet contenant une collection (la collection des "sections" du fichier INI), chaque membre de la collection étant lui-même une collection (les variables de la section).

    Ce qu'il y a de bien, c'est que les membres d'une collection peuvent être adressés par leur numéro dans la collection (mais ce numéro change si la collection évolue) ou par leur index, qui est une chaine de caractère (le nom de la section, ou le nom de la variable)

    Jusque là, (il me semble que) je sais me débrouiller.

    Je suis tombé sur un bec lorsque j'ai voulu afficher (dans mon programme de test) le contenu de l'objet : pour afficher la liste des sections, il faut faire un "for each...next". Or "l'objet ne gère pas cette propriété ou cette méthode" !

    Quelqu'un est-il en mesure de me dire comment faire. J'ai une doc où il esst question d'énumérateurs et de [_NewEnum], mais je n'y comprends rien...

    Merci d'avance.

    AMIcalement.

  2. #2
    Modérateur

    Si c'est possible, ajoute la partie du code qui pose problème.

    L'utilisation d'un Enum nécessite des (Property Get et/ ou Let et Set dans le cas d'objets)
    Pas très simples mais faisables.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Membre régulier
    Salut, l'autodidacte.

    Justement, je n'ai pas de code. Mon problème, c'est que j'ai une collection (disons : "Col") dans laquelle j'ai très bien su faire
    Code VB6 :Sélectionner tout -Visualiser dans une fenêtre à part
    Col.add "Nom", Valeur"

    Le problème se pose quand je veux alimenter une ListBox avec des lignes de la forme "Nom=Valeur", car j'ai vu qu'il faut faire
    Code vb6 :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    For Each s In Col
      Liste.add s
    next

    Qui remplira ma listbox avec les "Valeur", mais je ne sais pas récupérer les noms.

    Pour être tout à fait complet, je possède le " Visual Basic Guide de l'utilisateur" original de Microsoft (et en français, en plus !) mais c'est celui de VB 5.0 (publié en 1997).

    Il dit qu'il faut "activer For Each ... Next" en créant un énumérateur :
    Code VB6 :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function NewEnum() As Iunknown
      Set NewEnum =Col.[_NewEnum]
    End Function

    Il ajoute plus loin qu'il faut aller faire des trucs bizarres dans Outils/Attributs de procédure pour masquer le NewEnum, mais là, je ne me lance pas sans en avoir parlé ici, et reçu des explications plus complètes...

    Y a-t-il mieux en VB6 (peut-être des dictionnaires ou des "for each" un peu plus élaborés) ? C'est ça ma question?

    AMIcalement.

  4. #4
    Modérateur

    Je pense qu'il n'est pas nécessaire d'utilise la boucle For Each ... Next.
    Une collection possède la propriété Count et un sous-élément Item qui peuvent être utilisés pour retourner une valeur donnée.

    A titre d'exemple : Sur Form1, une ListBox, 2 boutons de commande (Command1 et Command2) puis ce
    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
    Option Explicit
     
    Dim Col As New Collection
     
    Private Sub Command1_Click()
     Dim I%, itm
      List1.Clear
      For I = 1 To Col.Count
        List1.AddItem Col.item(I)
      Next I
    End Sub
     
    Private Sub Form_Load()
       Dim K%
      Command1.Caption = "For...Next"
      Command2.Caption = "For Each...Next"
       For K = 1 To 26
         Col.Add Chr(K + 64)
       Next K
    End Sub
     
    Private Sub Command2_Click()
     Dim I%, itm
     List1.Clear
      I = 1
      For Each itm In Col
        List1.AddItem Col.item(I)
        I = I + 1
      Next itm
    End Sub
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Membre régulier
    Salut, l'Autodidacte.

    Excuse-moi pour le délai : j'étais dans tout à fait autre chose...

    J'ai peut-être du mal à me remettre dans cette question, mais il me semble que tu n'as pas bien compris mon problème : lister les valeurs d'une collection ne me pose pas de problème. Par contre, ma collection est indexée par des chaînes de caractères (construites par coll.add item, "index"), et ce que je veux faire, c'est lister les index.

    Ai-je bien compris que ta réponse ne permet pas de le faire ?

    AMIcalement.

  6. #6
    Modérateur

    Essaie avec l'exemple de code en PJ.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  7. #7
    Membre régulier
    Bon sang mais c'est bien sûr !!!!

    Je n'ai le "Guide utilisateur" que de VB5 (comme je l'ai dit je ne sais plus où), voila pourquoi je suis parti avec un "Collection". Mais en parcourant le net, j'en vois (ici ou là, il est vrai que ce n'est pas courant) qui parlent de "Dictionnary", mais ça n'existe pas dans ma doc.

    Par contre, je trouve cet objet dans l'aide, et il a tout ce qu'il me faut. Il me semble bien que c'est même précisé qu'il a été ajouté à VB6 pour corriger les manques des Collections.

    Mais je découvre ça juste aujourd'hui : j'explore, et je viens faire un petitcompte-rendu.

    A+ (et merci à tous)

    AMIcalement.

  8. #8
    Membre régulier
    Alors c'est bien exactement ce qu'il me fallait : les Dictionnaires (Dictionary) sont comme des collections avec la possibilité de récupérer les index. A vrai dire, ils (les dictionnaires) n'apportent pas grand chose de plus, mais justement, c'est ce qu'il me manquait. Il faut activer le composant "Micrtosoft Scripting Runtime", et déclarer des "dim toto as Dictionary". Si VB est bien configuré, si l'on clique dans le code sur "Dictionary", puis F1, l'aide répond tout ce qu'il y a besoin de savoir.

    Autre remarque : dans la recherche (en haut de cet écran) j'ai cherché "Dictionnaire" (ou "Dictionary", je ne sais plus). On obtient des réponses pour tous les sous-forums. J'en ai exploré une quinzaine d'écrans... Il y avait deux discussions se rapportant au forum "VB6 ou antérieures" : l'une en 2010 et l'autre en 2007 : ici, ça n'est pas un sujet qui passionne les foules.

    Mon projet était de créer un objet (un module de classe) pour avoir à disposition, dans une application, les informations d'un fichier .Ini : c'est d'un intérêt un peu limité, et il existe même une API qui est sûrement plus rapide, mais il y avait deux défis à relever : je travaille depuis des années (peut-être 30 !) avec une version "Initiation" de Visdual Basic, et je n'avais jamais créé de module de classe. De plus, j'ai en tête une application où je pourrais avoir besoin d'un fichier .Ini avec la possibilité de l'éditer (donc Load et Get, mais aussi Let/Set et Save, plus un traitement d'erreurs etc...)

    Ces deux défis sont en passe d'être relevés. Youpyyyy !

    AMIcalement.

###raw>template_hook.ano_emploi###