Ajouter un control dynamiquement (at runtime)
le control doit être déclaré si il n'est pas déja utilisé dans le projet.
Si il est ajouté aux composants mais non utilisé, il ne faut pas choisir l'option "Remove info about unused ActiveX" dans les propriétés du projet.
Pour Commencer il faut référencer le control:
Dim WithEvents ctlDynamic As VBControlExtender
Dim WithEvents ctlDynaWeb As VBControlExtender
Dim WithEvents ctlCommand As VB.CommandButton
Pour declarer un Control:
Licenses.Add "MSComctlLib.TreeCtrl" // pour un treeview
Pour l'ajouter ensuite:
Set NomControl = Controls.Add("ProgId","Name", container)
Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl","myctl", Form1) //le treeview
Set ctlDynaWeb = Controls.Add("Shell.explorer.2", "myctlweb", Form1) //WebBrowser
Set ctlCommand = Controls.Add("VB.CommandButton", "ctlCommand1", Form1) //un Button
Le deuxiéme exemple montre qu'il n'est pas toujours facil de deviner le ProgId d'un control. Pour les OCX c'est souvent le nom du fichier OCX + "Lib." + le nom du Control (expl "MSComctl.ocx"). Une autre solution consiste à ajouter le control dans une form "at design time", d'editer le form.frm dans un editeur de text et de trouver la ligne:
Begin SHDocVwCtl.WebBrowser WebBrowser1 //pour SHDocVw.dll
Si on utilise "SHDocVwCtl.WebBrowser" comme progid pour le WebBrowser, Visual Basic donne le bon ProgId en message d'erreur... (La demarche est un peu tordue)
Certain control ne demande pas de déclaration (Commandbutton, TextBox...)
Pour acceder aux propriétés du control:
ctlDynamic.Visible = True //Le control créé est invisible par defaut
Supprimer un Control Ajouté dynamiquement
Form1.Controls.Remove "myctl"
Conclusion :
J'espére que cela sera util à quelqu'un...
5 sept. 2008 à 00:24
Je repere le label cliqué en faisan un calcul de sa position par rapport à la souris, en attendant mieux ça marche très bien !
Mais je reste ouverts a vos suggestions, Merci
4 sept. 2008 à 21:58
Je suis en train de créer un contrôle de liste et pour ce faire je créer dynamiquement des label, jusqu'a maintenant j'incremente le nom serveur du control mais cela ne colle pas aver l'application que je veut en faire car il me sera difficile de créer une procedure évenementiel de clique pour chaque label en mode d'execution.
Je peut surement palier à ce problème en créer des label avec non unique et indexation, ex: au lieu de Label1, Label2 j'obtient Label(1), Label(2), etc...
Je ne trouve pas la commande pour créer un index à un contrôle créé dynamiquement et je ne peut lui assigné d'index une fois crée.
Quelq'un aurait une solution ?
Merci d'avance.
21 févr. 2006 à 13:02
21 févr. 2006 à 04:15
21 févr. 2006 à 00:22
J'ai trouvé ! En tout cas ça marche chez moi. En pleine execution j'ai lancé la fenetre qui t'affiche toutes les variables de la form, et j'ai explorer toutes les propriétés de mon controle, et j'ai vu que toutes les propriétés persos étaient dans la propriété object. Donc il faut faire :
ObjOCX.Object.Propriete
pour info si ça vous interesse j'ai fait un tutoriel sur tout le late binding, parce que les infos sont trop éparpillées sur le net à mon gout :p
http://www.vbfrance.com/tutoriaux/AJOUTER-CONTROLE-OCX-DYNAMIQUEMENT-PLEINE-EXECUTION-LATE-BINDING_361.aspx
voilà !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.