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 :

Créer un objet comprenant plusieurs collections


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    495
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 495
    Points : 133
    Points
    133
    Par défaut 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
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    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 habitué
    Inscrit en
    Mai 2009
    Messages
    495
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 495
    Points : 133
    Points
    133
    Par défaut
    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
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    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 habitué
    Inscrit en
    Mai 2009
    Messages
    495
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 495
    Points : 133
    Points
    133
    Par défaut
    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
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Essaie avec l'exemple de code en PJ.
    Fichiers attachés Fichiers attachés
    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 habitué
    Inscrit en
    Mai 2009
    Messages
    495
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 495
    Points : 133
    Points
    133
    Par défaut
    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 habitué
    Inscrit en
    Mai 2009
    Messages
    495
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 495
    Points : 133
    Points
    133
    Par défaut
    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.

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

Discussions similaires

  1. Faire un jeu 2D avec le moteur de jeux vidéo Unity - Créer des objets à collecter
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 27/12/2016, 22h03
  2. Collection comprenant plusieurs types d'items différents
    Par BeanzMaster dans le forum Delphi
    Réponses: 3
    Dernier message: 04/02/2016, 13h44
  3. TreeView Binder plusieurs collections d'objets
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 05/05/2011, 16h49
  4. créer un objet à partir du type d'une collection
    Par dams78 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 03/11/2008, 15h08
  5. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 12h47

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