Ajouter un control dynamiquement (at runtime)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 404 fois - Téléchargée 46 fois

Contenu du snippet

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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
207
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

J'ai trouvé une solution provisoir, ou pas...

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
Messages postés
207
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

Bonjour, j'ai une petite question :

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.
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

lol ^^ content si je peux aider
Messages postés
64
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
22 novembre 2011

OMG! Les mots me manquent pour exprimer ma joie! tellement de possibilités!!!! MERCI INFINIEMENT MADM@TT!!!! Depuis le temps que je cherchais la solution! T'es un héros! loll! Excusez cet excès... Yannick
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009

Wouhou !
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à !
Afficher les 20 commentaires

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.