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 :

Utilisation d'une ListBox dans une classe


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Utilisation d'une ListBox dans une classe
    Bonsoir,
    Afin de profiter de la propriété "Sorted" je souhaite utiliser une Listbox dans une classe personnalisée.
    J'ai donc fait une classe Obj avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Option Explicit
    Private mNomObj As String
    public Répart as ListBox
    Dans le prgm principal j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Obj1 as new Obj
    Obj1.Répart.additem "Test"
    Lors de l'exécution j'ai une erreur "Variable Objet ou variable bloc with non définie"
    Je pense qu'il doit falloir créer une nouvelle instance de cette listbox pour y mettre quelque chose dedans, mais je ne pas où.

    Question subsidiaire: Comment faire que cette listBox ait la propriété "Sorted=True" car celle ci ne peut être modifiée en cours d'exécution?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Je suis pas un pro de VB, mais en tout cas je connais deux trucs qui ne tournent pas rond dans ton code.

    Le premier: n'utilise pas d'accents pour tes noms de variables, procédures, etc... je sais pas si VB supporte ou non les accents (et je tiens même pas à le savoir), mais à l'avenir je te recommande de ne pas les utiliser, et ce quel que soit le langage de programmation (comme ça on a pas de soucis et on est tranquilles).

    Le deuxième, c'est que les fans de POO s'arracheraient les cheveux en lisant le peu de code que tu as mis. Tu ne respectes pas le principe d'encapsulation, qui stipule que tu n'as pas le droit d'accéder directement aux champs que contient ton objet. Je parle ici du champ Répart qui est ta listbox.
    Si tu veux t'en servir, je te recommande vivement d'utiliser un attribut comme ceci (pour lecture/écriture) et de mettre ton champ Repart en Private en de le mettre en minuscules (pour le différencier des attributs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Option Explicit
    Private mNomObj As String
    Private repart_obj as ListBox
     
    Public Property Get Repart() as Listbox
         Set Repart=repart_obj
    End property
     
    Public Property Set Repart(ByRef nouvelle_listbox as Listbox)
         Set repart_obj=nouvelle_listbox
    End Propert
    Enfin tu fais comme ça dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Obj1 as new Obj
    Obj1.Repart.additem "Test"
    Essaye ça et dis-moi si ça marche.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hélas je débute en POO donc je prend note.
    Pour ce qui est du bout de code, ça ne marche pas. J'ai le même message d'erreur.
    J'ai testé une chose toute bête.
    Dans le prgm principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim LstA As ListBox
    lstA.additem "TEST"
    et j'obtiens la même erreur car l'objet n'a pas été crée avec le mot NEW comme on le ferai avec un autre objet personnalisé.

    En se référant à l'aide concernant le mot NEW, il est dit qu'il ne peut être employé qu'avec un objet déjà existant sur la feuille car l'ordre SET avec NEW ne crée pas un objet à proprement parler mais fait une référence à un objet existant (d'où les problèmes de copies d'objets qui sont déjà abordés dans le forum). Hors mon application n'utilise pas de listbox car elle est prévue pour fonctionner en automatique sans contrôle externe.
    Si je ne trouve pas de solution (ou si personne n'a d'idées) je vais devoir contourner le pb avec une collection qui fera un tri à chaque ajout de valeur.

    Petite question sur les collections: Quels sont les ordres (hors add) qui affectent l'ordre des objets contenus dans la collection?
    Merci encore

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Essaye de rajouter le mot new justement!

    Comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim LstA As New ListBox
    lstA.additem "TEST"
    C'est sûr que si l'objet n'existe pas VB va pas pouvoir travailler dessus.
    Si tu mets pas le mot cla new, VB va créer une référence à un objet de type Listbox de contenu Nothing.
    Essaye d'exécuter ton code pas à pas en regardant la valeur des variables (moi je debug comme ça c'est très pratique pour savoir pourquoi mon programme plante), tu verras que LstA contiendra Nothing.
    Essaye le mien, et tu verras que Lsta sera bien une Listbox qui existe bien en mémoire dans ton ordinateur.


    Dans le bout de code qui est dans mon post précédent, je n'ai pas mis la procédure d'initialisation: tu DOIS initialiser ta Listbox dans ta classe, sinon elle sera vide.

    Rajoute donc ça à la fin de ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Class_Initialize()
         Set repart_obj=new Listbox
    End Sub
    Et puis tant qu'à faire, ben tu vas rajouter un truc pour détruire proprement ton objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Class_Terminate()
         Set repart_obj=nothing
    End Sub

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Le pb c'est que mon éditeur ne supporte pas
    le mot "NEW ListBox" Il me met "utilisation incorrect du mot clé New"
    Même dans la routine Class_Initialize

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Désolé, j'avais pas percuté que tu voulais travailler sur une zone de liste de Userform (faudrait que je me réveille...).

    Le truc, c'est que Listbox est un objet de Userform, et il n'est pas censé être créé avec un mot clé new, mais... avec la jolie interface graphique pour construire un Userform.

    Après tu peux peut-être t'amuser à toucher à sa propriété Visible si tu veux la faire apparaître/disparaître.

    Pour y faire référence dans le code de ta classe, je pense pas que tu n'aies à créer une nouvelle Listbox, ou alors si tu en crées une c'est pour que celle-ci puisse faire référence à une Listbox différente selon le cas.

    Si c'est toujours la même Listbox que tu veux manipuler, je te conseille de pas te casser la tête et de tout simplement la modifier en y faisant référence par son nom. Après, pour y faire référence, tu devras taper juste "Userform.Listbox" (tu adaptes en fonction des noms), d'après l'explorateur d'objets.

    Si tu tiens à déclarer une Listbox dans ta classe et utiliser ta propriété Repart, tu devrais alors faire comme ça:

    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
    Option Explicit
    Private mNomObj As String
    Private repart_obj as ListBox     ' Enlève cette ligne si tu souhaites pas faire de référence
     
    Public Property Get Repart() as Listbox
         Set Repart=repart_obj     ' Si tu utilises ton objet repart_obj pour faire référence
         Set Repart=Userform.Listbox     ' Si tu fais directement référence
    End property
     
    ' Là la propriété d'écriture tu ne peux t'en servir que si tu utilises; _
     ton objet repart_obj car je pense pas que tu puisses changer; _
     ta Listbox de formulaire comme ça.; _
     En revanche tu peux déclarer ton objet repart_obj vers une autre Listbox
    Public Property Set Repart(ByRef nouvelle_listbox as Listbox)
         Set repart_obj=nouvelle_listbox
    End Propert
     
    Private Sub Class_Initialize()
         ' Ce code crée une référence vers la Listbox du formulaire; _
           tu manipuleras donc la propriété Repart comme s'il s'agissait de celle_ci; _
         Supprime la si tu souhaites faire référence à la liste simplement en tapant Userform1.Listbox1
         Set repart_obj=Userform1.Listbox1
    End Sub
     
    Private Sub Class_Terminate()
         ' Même commentaire, tu supprime ça si tu te sers directement de userform.listbox
         Set repart_obj=nothing
    End Sub

    Ce coup-ci j'ai testé, et la référence fonctionne. Fais pas attention aux couleurs des commentaires ici: c'est la bonne syntaxe pour revenir à la ligne en VB qu'il sagisse de commentaires ou non.


    Sinon je ne comprends pas pourquoi tu tiens à utiliser un module de classe pour bosser sur ta Listbox, car après tout c'est un objet déjà implémenter et y a pas besoin de réinventer la roue!
    A moins que vraiment tu veuilles y ajouter des méthodes et propriétés supplémentaires...

    Dernier truc: si tu utilise ta référence et que tu veux t'en servir pour référencer autre chose qu'une listbox, tu devras la déclarer comme étant du type Object.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Août 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil

    Informations forums :
    Inscription : Août 2008
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Bonsoir,
    Je voulais utiliser une listbox pour profiter de sa propriété "Sorted" et être sur que lorsque je prend un élément au début le la liste ce soit bien le premier quelque soit l'ordre d'entré des éléments et ceci s'en me préoccuper du classement (et oui la flemme me tient ).
    Donc pour solutionner ceci, car je tiens absolument à ne pas dépendre d'une quelconque interface graphique, je vais :
    - Solution 1 : Créer une collection et une fonction "Ajout" qui comportera la détermination de la position où insérer la donnée dans la collection
    ou
    - Solution2 : Créer une fonction "Charge (N°)" qui renverra la variable dont la position dans la collection triée est N°.

    Cette deuxième solution me semble la plus souple pour le futur.

    Je te remercie encore une fois pour le temps passé à débrouiller la question.

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

Discussions similaires

  1. Afficher une recherche après une sélection dans une ListBox
    Par vitalus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/05/2015, 18h04
  2. Réponses: 3
    Dernier message: 04/02/2015, 18h19
  3. [Débutant] Mettre une listBox dans une colonne d'une listView
    Par Tom57300 dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/04/2014, 15h40
  4. récuperer les données cochées dans une listbox dans une nouvelle liste
    Par Lost_in_VBA dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/07/2011, 12h12
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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