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 :
- 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- 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- 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!
Partager