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 :

Objets dynamiques, gestion d'événements et collection


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Objets dynamiques, gestion d'événements et collection
    Bonjour,

    Je suis en train de travailler sur une application en VB6. Je me connecte à une base de données et je récupère des noms de champs. Je créé des VB.Label de façon dynamique (en les ajoutant dans une collection) et je leur ajoute un événement Click() pour que lorsque je clique sur un label, tous les autres labels disparaissent.

    Jusqu'ici, je suis capable de faire disparaitre le Label sur lequel je clique, mais il m'est impossible d'accéder aux autres Labels créés dynamiquement, même s'ils sont ajoutés dans ma collection. J'utilise un form (frmRecherche), un module (modLabel) et un module de classes (clsLblClick --> pour la gestion de l'événement Click()).

    Voilà le code complet des 3 pages :

    1. frmRecherche :
      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
       
      Option Explicit
      ' Objet Database pour se connecter à la base de données
      Public db As Database
      ' Objet Recordset pour gérer les enregistrements
      Public rst As DAO.Recordset
       
      Private Sub Form_Load()
       
          ' Déclaration des variables
          Dim strPath, strFileName, strPass, strRequete, strRequeteCond As String
          Dim i As Integer
          ' Initialisation des variables
          strPath = App.Path & "\BD\"
          strFileName = "EssaiGenerateurRapport.mdb"
       
          ' Connexion à la base de données
          Set db = OpenDatabase(strPath & strFileName, False, False)
       
          ' Création d'une requête et récupération dans un recordSet
          strRequete = "SELECT Enfant, [Enfant Nom] FROM T_Organisation WHERE Parent = '4400000' ORDER BY Enfant"
          Set rst = db.OpenRecordset(strRequete, dbOpenDynaset)
       
          ' Nécessaire pour compter le nombre d'éléments dans mon recordSet
          rst.MoveLast
          rst.MoveFirst
       
          ' Pour chaque élément du recordSet, je créé un label
          For i = 0 To rst.RecordCount - 1 Step 1
              Call createLabel(100 + (i * 20), 100, 15, 200, "lblCR" & i, rst(0) & " -- " & rst(1))
              rst.MoveNext
          Next
      End Sub
    2. modLabel :
      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
       
      Option Explicit
       
      ' Déclaration de la collection
      Public col As New Collection
       
      Public Sub createLabel(ByVal top As Integer, ByVal left As Integer, _
                              ByVal height As Integer, ByVal width As Integer, _
                              ByVal name As String, ByVal text As String)
       
          ' Déclaration des variables
          Dim obj As Object
       
          ' Création (dynamique) d'un label
          Set obj = frmRecherche.Controls.Add("vb.label", name, frmRecherche)
       
          ' Modification des propriétés de l'objet label
          With obj
              .Visible = True
              .top = top
              .left = left
              .Caption = text
              .height = height
              .width = width
          End With
       
          ' On ajoute une gestion d'événement à l'objet de la collection
          col.Add New clsLblClick, name
       
          ' On ajoute l'objet Label à la collection (Le .Lbl est déclaré en Public)
          Set col(col.Count).Lbl = obj
       
          ' On vide l'objet
          Set obj = Nothing
      End Sub
    3. clsLblClick :
      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
      39
       
      Option Explicit
       
      ' Déclaration de la variable Lbl en tant que VB.Label
      Public WithEvents Lbl As VB.Label
       
      Public Sub Lbl_Click()
       
          ' Déclaration des variables
          Dim i As Integer
          Dim monObjet As VB.Label
       
          ' Initialisation de la variable compteur
          i = 1
       
          ' Pour tous les éléments de ma collection
          While (i <= col.Count)
              ' Si l'élément n'est pas celui cliqué (Int(Mid(Lbl.name, 6))
              ' retourne le chiffre correspondant au label (ex :lblCR5 renvoie 5)
              If (i <> Int(Mid(Lbl.name, 6))) Then
       
                  ' Je récupère l'objet dans ma collection
                  ' ERREUR ERREUR ERREUR
                  monObjet = col(i).Lbl
       
                  ' Si mon objet est visible, je le cache, sinon je l'affiche
                  If (monObjet.Visible = True) Then
                      monObjet.Visible = False
                  Else
                      monObjet.Visible = True
                  End If
       
              End If
       
              ' J'incrémente le compteur d'éléments
              i = i + 1
          Wend
       
      End Sub


    Je reçois le message d'erreur suivant pour ce code :

    monObjet = col(i).Lbl

    Erreur d'exécution '91' :
    Variable objet ou variable bloc With non définie

    Merci d'avance à tous les répondants!

  2. #2
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    C'est une technique que je n'ai jamais utilisé, mais peut être ceci va t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Set monObjet = col(i).Lbl

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci,

    je vais essayer ça dès que j'aurai accès au projet (lundi)!

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    cet extrait de code ne fontionne pas sous vb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    col.Add New clsLblClick, name
    Fais plutot comme ceci
    (j'ai rajouté un parametre à la sub, pour pouvoir ajouter des labels sur n'importe quelle form)

    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
    Option Explicit
    ' Déclaration de la collection
    Public col As New Collection
    Dim clsLblClick As clsLblClick
    Public Sub createLabel(ByVal Frm As Form, ByVal top As Integer, ByVal left As Integer, _
                            ByVal height As Integer, ByVal width As Integer, _
                            ByVal name As String, ByVal text As String)
        ' Déclaration des variables
        Dim obj As Object
        ' Création (dynamique) d'un label
        Set obj = Frm.Controls.Add("vb.label", name, Frm)
        ' Modification des propriétés de l'objet label
        With obj
            .Visible = True
            .top = top
            .left = left
            .Caption = text
            .height = height
            .width = width
        End With
        ' On ajoute une gestion d'événement à l'objet de la collection
        Set clsLblClick = New clsLblClick
        Set clsLblClick.Lbl = obj
        col.Add clsLblClick, name
        ' On vide l'objet
        Set obj = Nothing
    End Sub
    De même, ta routine est limitée dans ses noms de labels (test du sixième caractere du nom)
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If (i <> Int(Mid(Lbl.name, 6))) Then
    il serait plus malin de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If col(i).Lbl.name = Lbl.name Then

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci beaucoup... comme je dis, je ne peux pas tester présentement...

    Je le ferai dès que j'aurai l'ocaasion!

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Merci! Problème résolu!
    Il ne me manquait que le Set devant monObjet!!!

    Merci!

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

Discussions similaires

  1. Objets et Gestion d'événements
    Par jenesuispasunrobot dans le forum Architecture
    Réponses: 13
    Dernier message: 17/07/2009, 15h57
  2. gestion d'une collection d'objets dynamiques
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/03/2009, 10h13
  3. gestion des évènements sur objets dynamiques
    Par boss_gama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2009, 11h50
  4. Référence d'objet et gestion d'évènement
    Par eldran64 dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/10/2008, 20h04
  5. Réponses: 3
    Dernier message: 16/10/2007, 16h57

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