L'ajout de controles VB en pleine éxécution ou le Late Binding
A quoi ça sert ?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 (controles) en faisant le clic droit sur la boite à outils et en faisant ajouter : ceci est l'early-binding.
Il faut donc ajouter les controles dynamiquement, en pleine execution.
Comment ça marche ?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 :
L'early binding : on ajoute l'ocx pendant la phase de programmation, donc visual basic va charger l'ocx et on va pouvoir utiliser l'intellisense pour connaitre toutes les méthodes et propriétés (l'intellisense c'est la liste de propriétés et méthodes qui s'affiche quand on tape le "." après un objet). Lorsque le programme sera compilé, tout sera calibré pour le controle qui est connu, donc cela sera rapide à l'execution.
Le Late binding : on insére l'ocx directement pendant l'execution, en conséquence lorsqu'on programme, l'éditeur ne connait pas quel controle (label, picturebox ou autre....) sera ajouté, il sait juste que c'est un controle. Alors c'est au programmeur de connaitre les méthodes et propriétés que supporterons les ocx qui seront chargés.
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
Comment l'utiliser ?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 etre enregistrés dans le registre de windows. Sur votre pc où vous programmez, votre ocx l'est peut etre, 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'executer 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 controle .ctl
Si ça n'est pas vous qui l'avez créé, alors la il faudra se débrouiller et bidouiller, rechercher sur internet.
Sinon pour les controles de base Visual Basic, c'est de la forme :
"vb.picturebox"Puis il faut déclarer le nom de notre nouveau controle. Celui-ci sera du type
VBControlExtender. On rajoutera aussi le mot clé
WithEvents afin de pouvoir capturer les évenements du controle. La déclaration sera placée dans la form ou le controle sera ajouté.
Dim peut etre remplacé par
Publicça nous donne donc :
Dim WithEvents ctrl As VBControlExtenderPuis, il faut maintenant charger le controle dans la liste des controles 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 controle :
Set ctrl = Form1.Controls.Add(ProgID, "NomControle")"NomControle" est le nom général du controle que vous ajoutez (par exemple label, picturebox etc..) que vous choisissez.
Ensuite, à ne pas oublier :
ctrl.Visible = TrueMaintenant, le controle apparait à l'execution dans notre form1.
Bien, maintenant il faudra qu'on puisse en faire quelque chose de ce controle non ?
Comment utiliser ses propriétés et ses méthodes ?(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 controle normal :
ctrl.height = 1223Après pour les propriétés qui seront propres à votre ocx, cet à dire celles que vous aurez programmé vous meme 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 meme chose :
Call ctrl.object.method
Comment utiliser les évenements ?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, "Evenement !"
End SubA vous de vous débrouiller ensuite pour réagir aux evenements, je vous montre seulement comment les capturer.
Comment le supprimer ?Pour le supprimer, pas de problème :
Form1.Controls.Remove "NomControle"NomControle est le même que celui que l'ont 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