Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AJOUTER UN CONTROLE (OCX) DYNAMIQUEMENT EN PLEINE EXECUTION : LE LATE BINDING


Information sur le tutorial

Catégorie :Control Date de création : 20/02/2006 23:03:57 Vu : 12 345 fois

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note


Description

Comment ajouter un controle,un ocx, dynamiquement dans votre programme, en pleine execution ?
Cela s'appelle le late binding, et j'ai trop longtemps cherché sur internet pour ne pas vous faire partager ce que j'ai trouvé.

Tutorial

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 VBControlExtender

Puis, 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 = True

Maintenant, 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 = 1223
Aprè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 Sub

A 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
22 février 2006 13:28:44 :
Ajout de la suppression du controle
signaler à un administrateur
Commentaire de yannickt le 21/02/2006 04:17:09

WHAOUUUU! T'ES UN MODÈLE!

signaler à un administrateur
Commentaire de l0st3d le 12/05/2006 13:28:22

C'est un super tuto ça. j'ai toujours voulus savoir comment faire. Très simple en fin de compte! Merci!

signaler à un administrateur
Commentaire de rrr_zidane_8 le 22/09/2006 20:00:24

merci beaucoup tu es tres intelligent ravie de vous connaitre

signaler à un administrateur
Commentaire de loliloli le 27/09/2006 15:54:35

Effectivement c'est un tres bon tuto mais j'aimerais qu'il donne un autre exemple en C parce que c'est ce langage que comprend le mieux:). Par exemple j'ai un programme qui lit , ecrit et supprime un fichier . Il est devenu un executable et il fonctionne, Comment ajouter la fonction renommer pendant son excution ?
Tu peux repondre ici et m'envoyer aussi par mail kacoumathieu@yahoo.fr

signaler à un administrateur
Commentaire de MadM@tt le 27/09/2006 23:33:35

Loliloli > En C, c'est pas possible, d'une part car c'est un site consacré au Visual Basic, d'autre part car je ne m'y connais pas assez en C pour faire ça, puis car en C la gestion des objets n'est peut etre pas du tout la meme qu'en VB. Donc désolé ^^
Sinon pour ton programme j'ai pas trop compris ce que tu veux faire, je crois qu'en fait tu veux faire une sorte de plugin c'est ça (dans ce cas il faut utiliser une dll, pas un controle ocx) ? en tout cas poste ton problème dans le forum du site, tu auras une réponse en quelques minutes, alors qu'ici tu attends plusieurs jours et je n'ai meme pas la solution à ton problème.

Merci à toi et aux auteurs des commentaires précédents ;)

signaler à un administrateur
Commentaire de khadija24 le 13/04/2007 18:25:05

salut
bon svpl si vous permettez m'expliquer mieu
car moi je vx afficher un nombre de  picture box egal aux nombre d'image filtré et biensur je ne c pas combien d'images j'obtien
et merci a l'avance
khadija

signaler à un administrateur
Commentaire de MadM@tt le 13/04/2007 19:53:06

Salut,
Tu explique trop peu ton problème pour qu'on te donne une solution, mais de ce que je comprend ça n'a pas trop à voir avec cette source car ça ne concerne pas les ocx. En fait j'ai l'impression que ton problème peut se résoudre simplement avec un tableau de picturebox.
Mais pose ta question dans le forum, tu auras une vraie réponse.

signaler à un administrateur
Commentaire de Dragonmaster le 29/04/2007 20:20:33

Excellent tutoriel! ça va me servir pour le FLV player!

signaler à un administrateur
Commentaire de Flocreate le 03/05/2007 08:41:06

Salut,
Ca fait un momment que je cherche comment ajouter un nombre de "Line" inconnu dans mon programme. Pour cela, j'ai cherché avec :
> Private L() as Line
> Dim O as Object
> ReDim L( 1 to N )
> Set O = L(A)
> Load(O)
Mais rien à faire, ça marche pas !?

Ton tuto semble correspondre à mon problème.
Mais comme je suis long à la comprenette pourrais-tu déposer une source simple a titre d'éxemple ?

Merci d'avence.

signaler à un administrateur
Commentaire de MadM@tt le 03/05/2007 10:27:03

Flocreate > essaye déjà de rajouter les lignes :

Private L() as Line ' à déclarer hors des procedures

'Dim O as Object
ReDim L( 1 to N )
for T = 1 to N
  Set L(T) = New Line
  L(T).Visible = true
next T
'Set O = L(A)
'Load(O)

Je ne pense pas que la partie avec O soit necessaire
Essaye un truc comme ça, sinon pourquoi tu ne crée pas plusieurs line du meme nom sur ta form, ça va te créer automatiquement un tableau de Line (utilise la propriété Index). Fait des recherches à ce sujet si tu ne connais pas, ou cherche dans le forum
@+

signaler à un administrateur
Commentaire de tkd1984 le 16/06/2007 15:59:28

Bonjour
Je suis débutant en vb,j'ai un probléme pour connaitre le ProgId d'un controles Rey_XpBasics.ocx pour le méttre dans
      Set ctrl = Form1.Controls.Add(ProgID, "NomControle")

Par exemple :

      Set ctrl = Form1.Controls.Add(ProgID???, "ReyProgressBar")

signaler à un administrateur
Commentaire de MadM@tt le 16/06/2007 19:35:08

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

De mémoire, je te conseillerai d'ouvrir le projet des controles Rey_XP, et de noter le nom du projet global contenant les controles, et le nom du controle cible à ajouter (ici la progressbar). Au final le progID serait : "NomProjet.NomControle"

Dis moi si tu as réussi à trouver

signaler à un administrateur
Commentaire de tkd1984 le 19/06/2007 18:37:59

Bonjour
merci pour votre réponse,mais comment ouvrir un controls tel que Rey_XP.ocx
et merci d'avance

signaler à un administrateur
Commentaire de MadM@tt le 20/06/2007 13:39:13

Ah tu as le fichier ocx -> c'est le fichier compilé, donc tu ne peux pas l'ouvrir. Il faut que tu trouve le code source de l'ocx pour pouvoir l'ouvrir alors. Si je ne me trompe pas, Rey_XP.ocx est un ocx créé par Renfield (un membre de ce site) et il a posté le code source sur ce site (recherche "controles xp" dans la barre de recherche par exemple).
Une fois que tu as le code source, tu pourras l'ouvrir et récupérer le nom du projet, et le nom du controle que tu veux ajouter.

signaler à un administrateur
Commentaire de luckyulisse le 26/06/2007 19:19:46

Bonjour,

je n'arrive pas a utiliser les evenements pour mes controles créés dynamiquements.
j'ai un nombre inconnu d'avance de controles et je n'arrive a détecter que l'evenement du dernier controle créé (vu mon code c normal)
mais comment detecter les evenements de tous les controles, car ne peut pas faire une fonction _click pour chaque

quel reference faut il ajouter pour avoir "VBControlExtender"?


mon code du moins un bout:

'declarations
    Dim WithEvents MonImage As Image

    ....

    For i = 1 To Photos.Nb_Pages
      ...
      'ajout de l'image de l'acte
      Set MonImage = UserForm_Evt_ind.Frame_acte.Controls.Add("Forms.Image.1", "MonImage")
      
      With MonImage
        .Top = 5 + ligne * 75
        ...
      End With
    Next
End If

'evenements
Private Sub MonImage_Click()
   MsgBox MonImage.Tag
End Sub

signaler à un administrateur
Commentaire de MadM@tt le 27/06/2007 20:06:13

Et bien effectivement c'est une bonne question : comment utiliser les évenements de tableaux de controles ajoutés dynamiquement. Je n'ai pas d'idée, il faut peut etre voir avec un attribut 'index' dans la déclaration d'événement du controle mais je ne sais pas du tout si ça marcherait. Pour l'instant je n'ai pas trop le temps de chercher une solution, je te conseille de poster cette question dans le forum tu auras une réponse beaucoup plus rapidement.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.