Ajouter un controle (ocx) dynamiquement en pleine execution : le late binding

L'ajout de contrôles 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 (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.

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 contrôle qui est connu, donc cela sera rapide à l'exécution.
  • Le Late binding : on insère l'ocx directement pendant l'exécution, en conséquence lorsqu'on programme, l'éditeur ne connait pas quel contrôle (label, picturebox ou autre....) sera ajouté, il sait juste que c'est un contrôle. 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 ê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 ?

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 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

Comment utiliser les événements ?

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.

Comment le supprimer ?

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

Ce document intitulé « Ajouter un controle (ocx) dynamiquement en pleine execution : le late binding » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous