CRÉER UN GROUP DE CONTROL, COMME EN VB6

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 2 juin 2004 à 12:28
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 - 24 avril 2007 à 22:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23299-creer-un-group-de-control-comme-en-vb6

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
24 avril 2007 à 22:04
l'idéal est quand même de les inséré dans un tableau et encore mieux dans un générique sous le framework 2.0 et +
JeremyNeReculeraPas Messages postés 64 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 6 juin 2007
24 avril 2007 à 11:22
salut salut!
NoKurzTif autant que je sache, seul les controls sont indexés, donc ta méthode ne marche pas avec des objets, comme dans VB6, toujours étant ,merci beaucoup à ELWINGIL ,car sans indexage c'est pas très souple..++
NoKurzTif Messages postés 2 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 13 novembre 2006
13 nov. 2006 à 20:43
Slt,
Je voulais dire 2 choses eu égard à ce que j'ai lu plus haut :
1_) les contrôles disposent d'index
2_) y'a pas de problèmes pour en masquer certains

En fait les contrôles disposent d'index qui sont initialisés à la création.
Le dernier contrôle créé a l'index zéro ! Il faut juste faire gaffe lors de la création et du placement des contrôles, mais ensuite, on peut utiliser une boucle for each.. Ouais, ça c'est vraiment chiant par rapport à VB6 !!!
Il est aussi possible de gérer en utilisant les propriétés des collections (en l'occurence, collection de contrôles !)

Voici à titre d'exemple un code qui affiche les vendredis de chaque mois :
Private Sub RefreshChoiseDate()
Dim i As Integer, j As Integer
Dim maxMonthCtrl As Integer = 6
Dim targetMonth As Byte = CByte(Month(TargetDate))
Dim tempoDate As Date
Dim firstDate As Date = DateAdd(DateInterval.Month, -maxMonthCtrl + 1, TargetDate)
Dim firstMonth As Integer = Month(firstDate)
Dim firstYear As Integer = Year(firstDate)
firstDate = DateAndTime.DateSerial(firstYear, firstMonth, 1)
firstDate = CDate(SearchFriday(firstDate))
i 0 : j -1
For Each ctrl As Control In gb1.Controls
tempoDate = DateAdd(DateInterval.Day, i * 7, firstDate)
i i + 1 : j j + 1
ctrl.Text = tempoDate.ToString("dd/MM")
If DateAndTime.Day(tempoDate) > 3 And (j Mod 5) 0 Then ctrl.Text "" : i = i - 1
If DateAndTime.Day(tempoDate) < 25 And (j Mod 5) 4 Then ctrl.Text "" : i = i - 1
If DateValue(CStr(tempoDate)) = DateValue(CStr(TargetDate)) Then ctrl.Select()
Next ctrl
For Each ctrl As Control In gb1.Controls
ctrl.Visible CBool(IIf(ctrl.Text "", False, True))
Next
Me.Refresh()
End Sub
blob73 Messages postés 55 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 20 juin 2005
6 oct. 2004 à 18:32
Bonjour,

pour commencer cette source et les commentaires associés sont tres bien Merci beaucoup.

je voudrais savoir queqleu chose.

sur un formulaire windows j'ai disont 10 listbox (+ ou - ca change rien mais prenons 10)

j'aimerais que losque je clique sur n'importe laquelle de ces listbox un formulaire apparaisse bon je sais que pour faire apparaitre le formulaire c'est : nomduformulaire.show la j'ai pas de probleme mais mon probleme ce situe dans le fait que je voudrais pour cela acceder a une instructioen de type:

private sub listbox_doubleclick(.....................)

nomduformulaire.show
end sub

hors si je construit comme indiqué plus haut j'accede a chacune des listbox par a l'ensembe

merci de votre aide
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
22 juil. 2004 à 23:35
c'est pareil, mais j'avou que maintenant, je fais pareil que elwingil, bien que des fois je fais comme ma source

ça dépend vraiment du code que je fais. je prend même les 2 desfois

par exemple, je me fabrique une structure qui contient pleins d,info et qui contient le lien vers le control qui est en tableau. Comme ça, je pert jamais mes control dans un environnement à 100% dynamique
djiins Messages postés 7 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 27 juillet 2004
22 juil. 2004 à 16:52
et comment on fait avec des listbox
djiins Messages postés 7 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 27 juillet 2004
13 juil. 2004 à 18:11
bonjour,

Moi cette source je la trouve bien pour deux raison!

d'une part elle est tres facile a comprendre sans besoin d'enormes explications deuxiemment elle est claire et facile a mettre en oeuvre.

donc merci a son auteur qui a répondut a une question que j'avais et qui me permet par l'intermédiaire de cette source de trouver une reponse simple et efficace et de surcroit facile a comprendre.

Djiins
elwingil Messages postés 5 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 24 août 2007
4 juin 2004 à 11:38
Voila ma nouvelle version


- Je definie Public Tab(10) As Control dans la partie declaration global de mon formulaire

- Une fonction qui alimente mon tableau d'objet

For Nav = 0 To 10
Tab(Nav) = New Label
Controls.Add(Tab(Nav))
Tab(Nav).Top = 50 + Nav * 15
Tab(Nav).Left = 50
Tab(Nav).Text = "INDICE" + Str(Nav)
'Au lieu d'utiliser un tableau joins a celui d'objet j'insere la valeur de l'index dans la propriété "Tag" de mon nouvel element

Tab(Nav).Tag = Nav
Tab(Nav).BringToFront()
'Association d'un fonction gerant l'evenement click, il doit y avoir autant d'association que d'evenements souhaités
AddHandler Tab(Nav).MouseUp,Adressof Button_MouseUp
Next Nav

Sub Button_MouseUp(ByVal s As Object, ByVal e As MouseEventArgs)
Select Case e.Button
Case MouseButtons.Left
'On retrouve l'index dans le Tag de cette copie de l'objet membre de notre tableau
MsgBox("Bouton gauche sur l'objet" + Str(s.tag))
Case MouseButtons.Right
MsgBox("Bouton droit sur l'objet" + Str(s.tag))
End Select
End Sub

2 - Je peux acceder aux propriétés d'un index precis
Tab(5).Text = "CA MARCHE"

- je peux effacer 1 ou tous les objets de ce groupe

Controls.Remove(Tab(5))

De mon point de vue, j'ai retrouvé toutes les fonctionnalitées que j'utilisais avec VB6, c'est moins direct mais toujours pratique.
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
2 juin 2004 à 22:05
oui, ben j'ai essayer ça et ça vait planté à chaque fois
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2004 à 21:02
tu es d'accord avec moi que tu crées autant de control que tu en as besoin non ?

donc ton tableau d'entiers (tes pseudos pointeurs) pointent bien vers *des* controles ?
donc mon idée, c'est que au lieu d'avoir x controles et 1 tableau d'entier, je créé directement un tableau de controles comme en VB 6.

ou alors, j'ai pas compris...

Séb
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
2 juin 2004 à 20:51
un control contient pliens d'élément, avec 1 control tu as totu ce qui est par défaut

sa grandeur, sa position, u lien vers la form parent, s'il est visible, son index, son text, son type, son nom, ....

et la liste est encore très longue

moi avec un entier, je fais un semblant de pointeur, donc au lieu d'avoir tout ça en double en mémoire (l'original et la version index), j'en ai un seul en mémoire et un autre tableau qui permet de les retrouver.
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2004 à 20:08
je ne vois pas en quoi un tableau de controles et plus lourd en mémoire que n control + un tableau d'entier

de plus mon code n'est pas plus gros que celui généré par défaut.
puisqu'il suffit simplement de créer ton interface avec visual studio et de remplacer son code par le mien.

enfin voila. moi je n'utilise pas trop les index... donc...
Séb
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
2 juin 2004 à 18:48
faut = faux
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
2 juin 2004 à 18:47
faut, puisqu'un tableau de controol, tu crée un tableau en mémoire, moi je crée que des chiffres, c'est beaucoup moins gros.

pour les évênements, là c,est chien, faut le faire pour chaque. Si ton code est long, fait toi une fonction qui reçoi un index et tu dois faire un évênement pour chaque control qui appel ta fonction avec le bon index

conseil, entour après par un région, pour pas alourdir la visualisation de ton code
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2004 à 16:20
hum... normalement dans les paramètres passés à la function qui reçoit l'évènement tu dois avoir 2 paramètres importants :
- sender as Object et
- e as System.EventArgs

Donc à priori le sender est l'objet qui à générer l'évènement, il suffit de le caster je pense.

Séb
elwingil Messages postés 5 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 24 août 2007
2 juin 2004 à 15:59
En effet, par contre je bute pour gerer les evenements d'un membre du tableau specifiquement, des idées?
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2004 à 15:37
c'est tout à fait ce que je disais :D

Séb
elwingil Messages postés 5 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 24 août 2007
2 juin 2004 à 15:27
Je crois que j'ai quelque chose qui se rapproche + de ce qui existait dans VB6
- Je definie Public Tab_label(10) As Control dans la partie declaration global de mon formulaire

- Une fonction qui alimente mon tableau d'objet

For Nav = 0 To 10
Tab(Nav) = New Label
Controls.Add(Tab(Nav))
Tab(Nav).Top = 50 + Nav * 15
Tab(Nav).Left = 50
Tab(Nav).Text = "INDICE" + Str(Nav)
Tab(Nav).BringToFront()
Next Nav

- Je peux acceder aux propriétés d'un index precis
Tab(5).Text = "CA MARCHE"

- je peux effacer 1 ou tous les objets de ce groupe

Controls.Remove(Tab(5))

L'avantage c'est que ne se souci jamais du numero d'objet dans les controls et on y accede par nom(index) comme avant.
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
2 juin 2004 à 12:28
ca n'aurait pas été plus vite de créer un tableau de controles ?

genre :
Friend WithEvents grpTxtBox() As System.Windows.Forms.TextBox

et tu l'utilises comme ca :
Me.grpTxtBox(1) = New System.Windows.Forms.TextBox

Je dis ca, comme ca... j'ai pas essayé :D

Séb
Rejoignez-nous