L'ajout de contrôles VB en pleine éxécution ou le Late Binding
Imaginons que vous développiez un programme qui doit accepter des plugins par exemple, vous comprenez bien qu'on ne sait pas à l'avance quels ocx vous allez devoir insérer dans votre programme puisque ça dépendra des ocx installés. On ne peut donc pas ajouter les ocx (contrôles) en faisant le clic droit sur la boite à outils et en faisant ajouter : ceci est l'early-binding.
Il faut donc ajouter les contrôles dynamiquement, en pleine exécution.
Je ne suis pas très calé au niveau théorique dans ce domaine, mais commençons déjà par distinguer l'early binding et le late binding :
Après cette petite présentation des 2 méthodes, à vous de faire votre choix. Ici en tout cas on va voir le Late Binding.
Bon c'est clair que c'est moins facile que l'early binding, autant le dire tout de suite. Mais ça n'est pas sorcier pour autant.
Avant tout , les ocx que vous voulez utiliser doivent être enregistrés dans le registre de windows. Sur votre pc où vous programmez, votre ocx l'est peut être, mais pensez si vous devez distribuer votre programme : il ne le sera pas forcément chez tout le monde.
Comment faire pour l'enregistrer dans le registre de windows alors ?
Comme ça :
' Shell ("RegSvr32.exe -s " + OcxFilename) '
Cela permet d'exécuter le programme RegSvr32.exe de Windows qui va automatiquement enregistrer votre ocx. OcxFilename est le chemin d'accès au fichier.
Ceci est à ne faire qu'une seule fois, ensuite l'ocx est enregistré pour de bon.
Ensuite, étape indispensable : repérer le ProgID de l'ocx. C'est une chaine de caractère de la forme : "NomProjet.NomOcx".
Si vous avez créé l'ocx, c'est tout simplement le nom du projet et le nom de votre contrôle .ctl
Si ça n'est pas vous qui l'avez créé, alors là il faudra se débrouiller et bidouiller, rechercher sur internet.
Sinon pour les contrôles de base Visual Basic, c'est de la forme : "vb.picturebox"
Puis, il faut déclarer le nom de notre nouveau contrôle. Celui-ci sera du type VBControlExtender. On rajoutera aussi le mot clé WithEvents afin de pouvoir capturer les événements du contrôle. La déclaration sera placée dans la form ou le contrôle sera ajouté. Dim peut etre remplacé par Public
ça nous donne donc :
' Dim WithEvents ctrl As VBControlExtender '
Il faut maintenant charger le contrôle dans la liste des contrôles du programme :
' Licenses.Add ProgID '
(on voit que sans le ProgID on ne peut pas)
Par contre, pour cette ligne, elle n'a pas l'air indispensable, et des fois ça me met des avertissements si je la met. Je ne suis pas sur de son utilité ni de sa fonction, à vous de voir.
Ensuite, il faut ajouter le contrôle :
' Set ctrl = Form1.Controls.Add(ProgID, "NomControle") '
"NomControle" est le nom général du contrôle que vous ajoutez (par exemple label, picturebox etc..) que vous choisissez.
Ensuite,à ne pas oublier :
' ctrl.Visible = True '
Maintenant , le contrôle apparait à l'exécution dans notre form1.
Bien, maintenant il faudra qu'on puisse en faire quelque chose de ce contrôle non ?
(j'entends par méthodes les fonctions et sub)
En ce qui concerne les propriétés "de base", du genre name, height, width, top, left, enabled etc... il n'y a aucune différence avec un contrôle normal :
' ctrl.height = 1223 '
Après pour les propriétés qui seront propres à votre ocx, c'est à dire celles que vous aurez programmé vous même dans votre ocx avec Public Property Get et Public Property Let, je procède ainsi :
ctrl.object.author = "..."
je dis bien "je", car je n'ai jamais trouvé de code présentant cela, et chez moi ça ne marche pas en faisant directement :
ctrl.author = "..."
Donc à vous de voir ce qui marche chez vous.
Pour les méthodes, j'utilise la même chose :
Call ctrl.object.method
Tout simplement :
Private Sub ctrl_ObjectEvent(info As EventInfo) Dim i As Long Dim nbArgs As Long Dim msg As String nbArgs = info.EventParameters.Count msg = msg & "Evenement : " & info.Name & vbCrLf For i = 0 To nbArgs - 1 msg = msg & "Argument n. " & CStr(i) & " name " & _ CStr(info.EventParameters(i).Name & _ " valeur = " & CStr(info.EventParameters(i).Value)) & _ vbCrLf Next i MsgBox msg, vbInformation, "Événement !" End Sub
A vous de vous débrouiller ensuite pour réagir aux événements, je vous montre seulement comment les capturer.
Pour le supprimer, pas de problème :
' Form1.Controls.Remove "NomControle" '
NomControle est le même que celui que l'on a utilisé pour la création.
Et voilà ! Pas si compliquéen fait ;-)
Tous les commentaires constructifs, remarques, conseils, infos sont les très très bienvenus.
MadMatt