Tableau de contrôles dynamiques (avec évènements)

Soyez le premier à donner votre avis sur cette source.

Vue 16 152 fois - Téléchargée 1 846 fois

Description

  • Undocumented VBA feature*


Cette source VBA s'appuie sur l'objet Collection de VB pour créer des collections de contrôles.

Comme il n'est pas possible, en VB sous VBA, de modifier le designer (quoiqu'un bon complément?), cette source va créer dynamiquement (mais en liaison précoce) des collections de contrôles !

Le cadeau est la gestion des évènements déclenchés par des contrôles collectionnés (comme dans VB !), grâce à la classe d'emballage (wrapping).

Et pour ceux d'entre vous qui connaissent le wrapping, posez-vous la question suivante : comment obtenir un IEnumerator si VBA ne vous propose pas le menu Attributs de Procédures?

Conclusion :


Testez la démo, et ensuite, appropriez-vous le code!
L'essentiel réside dans les 2 classes (ExtendedControls et ExtendedControl).

Pour les réutiliser, n'utilisez pas le copier/coller, cela ne suffit pas. Exportez les modules de classes (*.cls) et le module standard (*.bas), et ré-importez-les dans votre projet.

N'hésitez pas à les faire évoluer ! Par fainéantise, je n'ai traité que 2 types (TextBox et Label), mais on peut en ajouter de nombreux autres assez facilement. De plus, je n'ai implémenté que quelques évènements (2 pour être honnête), mais ce qui marche pour 2, marche pour tous les autres (sauf les évènements de l'objet générique de type Control).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

titounet65
Messages postés
2
Date d'inscription
lundi 7 août 2006
Statut
Membre
Dernière intervention
7 août 2006
-
Bravo,

J'avais déja traité ce problème mais pas aussi élégamment.
Merci à vous et bonne continuation

Au revoir
rvblog
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5 -
Salut titounet65,
eh bien, je ne sais pas quoi dire, sinon merci.
un commentaire si précis, si bref, si succint...
tellement d'espoir porté en 2 phrases...
après 4 mois d'attente...

si ça, ça n'est pas quelqu'un de mon entourage...
alors je suis mal entouré :)
cs_eriiic
Messages postés
2
Date d'inscription
samedi 20 janvier 2007
Statut
Membre
Dernière intervention
12 février 2007
-
Bonjour rvblog,
Ton code a l'air formidable. Je dis "a l'air" car je découvre les modules de classes et si j'en vois l'interet j'avoue avoir du mal à les lire et les comprendre. En tout cas il est très adapté à un projet que j'ai en tête et ça me permettra d'en apprendre plus.
Ce qui serait bien, pour des néophytes comme moi, c'est que tu l'enrichisses en complétant avec des commentaires (déjà très nombreux, félicitation ;-) ) plus explicatifs sur le rôle des différentes sections, sur les bases des modules de classe.
Et puis sur la description donne un exemple simple d'utilisation qui encouragera la curiosité.
Je te souhaite beaucoup de téléchargements... :-)
PS : je ne suis pas de ton entourage mais un sincère merci pour ce travail et ce partage :-)
rvblog
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5 -
Salut ERIIIC,

d'abord, je te remercie pour ton commentaire. Ensuite, je te remercie pour son contenu :)

Il est vrai, que quand on utilise souvent la POO en VB, et les classes d'emballage, on finit par oublier que tout le monde ne les connait pas!

Néanmoins, le but de cette source n'était pas de les présenter, mais de solutionner un problème lié au classes d'emballage :

Comment faire remonter le flux d'évènements des classes emballées, à la classe d'emballage (on ne peux pas déclarer un tableau de contrôles avec le prédicat WithEvents, ni une collection [dans ce cas, ce serait inutile, on n'obtiendrait que les évènements de la collection et pas ceux des "collectionnés"])?

Pour ce faire, je le mets en évidence (et en pratique) en tentant de "solutionner" un autre problème récurrent (mais en VBA seulement) : l'ajout dynamique de contrôles (pendant l'exécution) et la récupération des évènements de ceux-ci.

Je viens de jeter un oeil sur le site... pour constater qu'il n'existe pas de tutoriel sur les classes d'emballage! Voici donc un travail potentiel d'avenir (il faudrait juste que je trouve du temps).

Pour résumer la technique de la classe d'emballage (et des classes emballées [plus connues sous le nom de "classe à s'emballe :)]) :
- vu de l'utilisateur (mais développeur), on veux une collection d'objets de même type (MesObjets contenant du type MonObjet), et on veux manipuler cette collection comme n'importe quelle collection VB (For each In... Next, Item, Add, Remove...).
- vu du concepteur (ça peut être le même développeur), il faut une classe qui sera vue de l'utilisateur comme une collection (MesObjets, classe d'emballage, toujours au pluriel), et une classe qui sera vue de l'utilisateur comme un élément de la collection (MonObjet, classe emballée, toujours au singulier).

Donc, MesObjets implémentera, au minimum, les méthodes Add et Remove, et les propriétés Item et NewEnum (Item est la propriété par défaut, qui permet à l'utilisateur d'écrire MesObjets("Clé") pour obtenir une référence à un objet de type MonObjet, et NewEnum est la propriété qui lui permet d'écrire un bloc d'énumération For each moTemp in Mesobjets blabla Next moTemp). Pour que ceci fonctionne, MesObjets déclare un membre privé de type Collection (la vraie, mais invisible pour l'utilisateur), et s'appuie dessus pour fournir les services précités.
On peut ensuite ajouter un tas d'autres services observateurs (genre Count, ItemByValue, ...).
La classe MonObjet se contente d'implémenter une propriété ParentCollection, qui lui permet d'accéder à sa collection pour solliciter des services de sa part (c'est une référence circulaire, qu'il faut apprendre à libérer à la destruction, ce qui n'est pas le cas dans l'exemple que je fourni (oups)), et les propriétés qui sont propres à son aspect fonctionnel (par exemple Value).

Pour conclure (je n'aurais pas dû développer ici), on peut maintenant écrire :

set moTemp = MesObjets.Add("clé")
msgbox MesObjets("clé").Value
ou (parfaitement inutile, donc totalement indispensable)
msgbox MesObjets("clé").ParentCollection.Add("clé2").Value

voilà ce que cela donne quand je fais court (j'essaierais de faire un tuto, promis, à moins que quelqu'un le fasse avant).

à+, et merci encore pour ton commentaire.
PS : tu es de mon entourage, tu es sur VB France :)
cs_eriiic
Messages postés
2
Date d'inscription
samedi 20 janvier 2007
Statut
Membre
Dernière intervention
12 février 2007
-
Bonsoir rvblog,

Merci pour tes explications. Encore un peu ténébreux pour moi tout ça, reste à l'éclaircir en mettant en application... :-)
Si jamais tu as le courage (et le temps) de faire un tutorial ça serait sympa que tu l'annonces ici, j'ai mis une alerte sur ce fil.
Bonne soirée à toi :-)

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.