Ajouter des tableaux de contrôle dynamique sans utiliser "load"

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 279 fois - Téléchargée 36 fois

Contenu du snippet

Il existe deux méthodes pour créer des contrôles dynamiques.
Soit, on crée un objet indexé, et on le duplique à l'aidre de "load"
Soit on l'ajoute dans la collection de contrôles de la fenêtre.
Cependant, la seconde méthode ne permet pas un accès aux objets créés par un indice.

J'ai cherché dans le forum pour une solution, et j'ai vu que plusieurs utilisateurs avaient rencontré le même problème, sans qu'on leur donne une réponse autre que celle d'utiliser "load".

J'ai un peu cherché, et j'ai trouvé une solution simple, qui est d'utiliser des tableaux de références vers les objets créés dynamiquement.

Peut-être que ceci a déjà été expliqué, dans ce cas il suffira de supprimer cet exemple.

Source / Exemple :


Dim WithEvents LedDyn As VB.PictureBox  ' déclaration d'un objet dynamique
Dim Leds(127) As PictureBox  ' déclaration d'un tableau de références

Dim i%
  
  For i = 0 To 127                      ' pour chaque picturebox
    Set LedDyn = Me.Controls.Add("vb.picturebox", "Led" + CStr(i))    ' création du contrôle avec un nom unique
    Set Leds(i) = LedDyn             ' création d'une référence à l'objet
    LedDyn.Top = 500                 ' paramétrage du contrôle créé
    LedDyn.Left = 500 + (i * 100)
    LedDyn.Height = 300
    LedDyn.Width = 75
    LedDyn.BorderStyle = 0
    LedDyn.Visible = True
  Next i

  For i = 0 To 127       ' démonstration de l'accès par index
    Leds(i).BackColor = RGB(0, i * 2, 0)  ' accéder aux contrôles par index
  Next i

Conclusion :


Ce programme ne fait rien d'autre que de créer 128 pictures box, représentant des "leds" rectangulaires, et qu'on peut ensuite gérer via leur index

A voir également

Ajouter un commentaire

Commentaires

Tilois
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
4 -
Ca fait super longtemps que je cherchais un truc pareil pour avoir des noms uniques. C'est vraiment le pied. Merci bcp
Afyn
Messages postés
613
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
Y at il un gain par rapport à l'instruction Load ?
Et ensuite si je veux supprimer un object ?
Bon, en tout cas c'est bien d'avoir exposé cette méthode.
A+
Afyn
Navedac
cs_Bigonoff
Messages postés
7
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
8 octobre 2003
-
Salut
------
Le gain, c'est que c'est pur dynamique, nul besoin de placer un objet à la création, ce qui n'est pas toujours possible.
Pour supprimer, ça fonctionne avec unload.
A+
Bigonoff
Bazinou
Messages postés
9
Date d'inscription
jeudi 3 juillet 2003
Statut
Membre
Dernière intervention
26 mai 2004
-
Bjour

Un inconvénient tout de même à cette méthode : impossible de gérer des évènements pour les contrôles ajoutés, sauf pour le dernier qui reste attribué à LedDyn. C'est l'avantage du vrai groupe de contrôles, qui permet de définir un contrôle type avec ses évenements, puis d'ajouter dynamiquement d'autres contrôles sur le même modèle.

C'est dommage car une solution au problème m'intéressait aussi, dans le cas de plusieurs groupes d'OPTION indépendants dynamiques, où la méthode du Load ne suffit plus.

@+
borntoclimb
Messages postés
98
Date d'inscription
vendredi 4 janvier 2002
Statut
Membre
Dernière intervention
7 mars 2006
5 -
En fait je ne suis pas certain que cela soit vraiment dynamique. Puisque tu declares la taille de ton tableau directement, je pense que VB leurs alloue directement une place en memoire (á verifier). Une alternative serait de faire:

dim CtrlLabelDyn() as VB.Label

Ensuite tu utilises:

Redim Preserve CtrlLabelDyn(i)

i étant le numero du control. Ensuite tu fais un Set et tu changes les proprietes comme indique dans ton example.

Cela ne permet toujours pas d'avoir les evenement mais te permet d'ajouter un nombre X de control sans avoir á decider ce nombre avant de compiler le prog...

Borntoclimb

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.

Du même auteur (cs_Bigonoff)