Salut

Suite a plusieurs discussions dont la dernière Problème d'authentification avec vb6

Il est des fois utiles de pouvoir modifier/initialiser un composant par le biais d’une variable littéral (String).

Exemple:
Initialiser des menus, des boutons, des droits de modification/suppression d’une liste …. au moment du chargement d’un Form suivant le statut/nom de l’utilisateur (ce qui peut impliquer une boite de dialogue mot de passe pour avoir cette information statut (voir Une boite de dialogue Mot de Passe)).

Voici un module.bas qui contient une fonction public ParametreR, elle attend 5 paramètres.

1 NomForm (String): le nom du Form ou est le composant (doit être chargé)
2 NomComposant (String): le nom du composant
3 IndexComposant (Integer): l’index du composant (si le composant ne fait pas partie d’un groupe de contrôle, mettre IndexComposant = -1
4 NomPropriete (String): propriété devant être initialisée/modifiée
5 ValPropriete (Variant): valeur a donner à la propriété (voir explication dans le commentaire du code)

La fonction ParametreR contient une sous fonction privée:
RecupeComposant, pour récupérer l’objet composant, elle fait appel à la fonction privée ExisteIndex, pour déterminer/vérifier si le composant et un groupe de contrôle.
Dans cette fonction ParametreR on utilise la fonction CallByName pour agir sur le composant.

La base du fonctionnement se fait avec 2 boucles For …. Each
La 1° boucles pour la collection Forms et la 2° (interne) pour la collection Contrôles de chacune des Forms

Exemple de type d’appel à la fonction(depuis tous Forms de votre programme):

-Sous forme directe (pas vraiment fait pour çà, mais fonctionne)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
If ParametreR("Form1", "Text1", 1, "BackColor", &HC0FFC0) = False Then
    MsgBox "Au moins 1 paramètre n'est pas valide et/ou le Form n'est pas chargé", vbCritical, "Erreur"
End If
-Par le biais de variables remplis depuis une BD/un fichier .Txt/ ou toutes autres de mémorisation externe au programme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
If ParametreR(NomForm, NomComposant, IndexComposant, NomPropriete, ValPropriete) = False Then
    MsgBox "Au moins 1 paramètre n'est pas valide et/ou le Form n'est pas chargé", vbCritical, "Erreur"
End If
-Par le biais d’un RecordSet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
If ParametreR(Rs.FIelds(0), Rs.FIelds(1), CInt(Rs.FIelds(2)), Rs.FIelds(3), CVar(Rs.FIelds(4))) = False Then
    MsgBox "Au moins 1 paramètre n'est pas valide et/ou le Form n'est pas chargé", vbCritical, "Erreur"
End If
Variante sans vérification si la fonction a réussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Call ParametreR(NomForm, NomComposant, IndexComposant, NomPropriete, ValPropriete)
D’autres informations sont en commentaires dans le Module.bas
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Option Explicit
 
'la valeur des 5 variables suivantes sont initialisé via une BD, un fichier Txt ou toutes autres type de données mémorisées
'ces 5 variables doivent prendre leur valeur avant l'appel à la fonction ParametreR.
 
'Variable nom du Form sur lequel est le composant
Public NomForm As String ' ----- rendu insensible MAJ/min par code, si le nom du Form est Form1, fORM1 fonctionnera aussi -----
'Variable nom du composant
Public NomComposant As String ' ----- rendu insensible MAJ/min par code, si le nom du composant est Text1, tEXT1 fonctionnera aussi -----
'Variable index du composant, si le composant ne fait pas partie d'un groupe, donner la valeur = -1
Public IndexComposant As Integer
'Variable nom de la proriété a passer à la fonction CallByName
Public NomPropriete As String ' ------ Non sensible MAJ/min, si la proriété est Visible, vISIBLE fonctionnera aussi ------
'Variable valeur de la propriété a passer à la fonction CallByName
Public ValPropriete As Variant
'********* ValPropriete est déclarée de type variant car suivant la propriété que l'on veut modifier/initialiser,
'********* de fait, la valeur pourrat être de différent type
'
'............ Pour information ------------------
'Ces variables ne sont pas forcement obligatoire,
'par exemple vous pouvez passer directement chaque valeur par le contenu des champs d'un RecordSet
'dans ce cas, veillez à que chaque champs soit de même type que le paramètre nécessaire à la fonction ParametreR,
'ou passez par une conversion
'IndexComposant = Cint(RecordSet!Indx)
 
Public Function ParametreR(NameFrm As String, NameComposant As String, Idx As Integer, Propriete As String, Valeur As Variant) As Boolean
'Variable permettant de récupérer la référence de tous composants quelque soit le Form qui en fait la demande
Dim ComposantRef As Object
Set ComposantRef = RecupeComposant(NameFrm, NameComposant, Idx)
If TypeName(ComposantRef) <> "Nothing" Then
    CallByName ComposantRef, Propriete, VbLet, Valeur
    ParametreR = True
    Else
    ParametreR = False
End If
End Function
 
Private Function RecupeComposant(NameFrm As String, NameComposant As String, Optional Idx As Integer = -1) As Object
'foncion de referencement du composant à paramétrer
 
Dim ObjFrm As Form 'pour boucle For Each de la collection Forms
Dim ObjComposant As Object 'pour boucle For Each de la collection des objets sur chaque Form
Dim OkExitFor As Boolean 'permet de quitter les boucles dés que le composant à été trouvé et traité
 
For Each ObjFrm In Forms '********************** boucle sur toutes les Frms **********************
 
    If UCase(ObjFrm.Name) = UCase(NameFrm) Then
        For Each ObjComposant In ObjFrm '------------ boucle sur tous les composants
 
            If UCase(ObjComposant.Name) = UCase(NameComposant) Then
                'un composant sur le Frm portant ce nom vient d'être trouvé
                If ExisteIndex(ObjComposant) Then 'Le composant est indexé
                    If ObjComposant.Index = Idx Then
                        'L'index du composant est bien celui que l'on veut recuperer
                        OkExitFor = True: Exit For
                    End If
                    Else 'le composant n'est pas indexé
                    OkExitFor = True: Exit For
                End If
            End If
 
        Next '--------------------------------------- boucle composants
        If OkExitFor = True Then
            'la référence au composant a été trouvée et est valide
            Set RecupeComposant = ObjComposant
            Exit Function
        End If
    End If
 
Next '******************************************** boucle Frms ***************************************
'la référence du composant n'a pas été trouvée, RecupeComposant renvoie "Nothing"
End Function
 
Private Function ExisteIndex(Composant As Object) As Boolean
'Fonction permettant de déterminer si le composant est un groupe de composant (donc indexé)
On Error Resume Next
ExisteIndex = Composant.Index + 1
End Function
Toutes suggestions pour améliorer le code sont les biens venues.