Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Groupe de boutons

13 réponses
Avatar
400GpJ
Bonjour,

J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6 je les
créais avec le même nom. J'obtenais un groupe indicé, qui me permettait
d'ajouter du code s'appliquant à tous les boutons et exploitant l'indice du
bouton qui était récupéré par l'é&vénement click.

En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé avec un
panel en y créant des boutons. A priori pas de problème particulier pour
accéder aux boutons et les modifier, même si la syntaxe devient un peu lourde.

En revanche je ne trouve pas :
1- comment mettre du code sur l'événement click (par exemple) sans
dupliquer le code 1 fois par bouton (400 dans le cas présent)
2- comment créer dynamiquement les boutons en leur affectant un nom
variable avec une boucle for...next

D'avance merci pour les bonnes idées (même du genre ce n'est pas du tout
comme ça qu'il faut faire, une solution plus simple consisterait à....).

10 réponses

1 2
Avatar
Stephane TUET
"400GpJ" a écrit dans le message de news:

Bonjour,

J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6 je les
créais avec le même nom. J'obtenais un groupe indicé, qui me permettait
d'ajouter du code s'appliquant à tous les boutons et exploitant l'indice
du
bouton qui était récupéré par l'é&vénement click.

En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé avec
un
panel en y créant des boutons. A priori pas de problème particulier pour
accéder aux boutons et les modifier, même si la syntaxe devient un peu
lourde.

En revanche je ne trouve pas :
1- comment mettre du code sur l'événement click (par exemple) sans
dupliquer le code 1 fois par bouton (400 dans le cas présent)
2- comment créer dynamiquement les boutons en leur affectant un nom
variable avec une boucle for...next

D'avance merci pour les bonnes idées (même du genre ce n'est pas du tout
comme ça qu'il faut faire, une solution plus simple consisterait à....).



Salut,

Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
solution plus simple consisterait à" créer dynamiquement tes boutons à
l'aide d'une boucle et d'ajouter un handler unique sur l'évènement Click de
chacun d'entre eux... Un truc du genre :

for i as integer = 0 to 399
dim Bouton as new Button
AddHandler Bouton.Click, addressOf MyClickHandler()
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

avec ton handler déclaré ainsi :
private Sub MyClickHandler(sender as Object, e as System.EventArgs)
'Ici ton code pour l'évènement click
end sub

Je ne sais pas si ça répond à ta question

@+
Steph
Avatar
Cyril S.
Je suis "on ne peut plus" d'accord avec cette solution car beaucoup plus
propre que de rajouter 500 checkbox manuellement.

--
CS


"Stephane TUET" wrote:

"400GpJ" a écrit dans le message de news:

> Bonjour,
>
> J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6 je les
> créais avec le même nom. J'obtenais un groupe indicé, qui me permettait
> d'ajouter du code s'appliquant à tous les boutons et exploitant l'indice
> du
> bouton qui était récupéré par l'é&vénement click.
>
> En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé avec
> un
> panel en y créant des boutons. A priori pas de problème particulier pour
> accéder aux boutons et les modifier, même si la syntaxe devient un peu
> lourde.
>
> En revanche je ne trouve pas :
> 1- comment mettre du code sur l'événement click (par exemple) sans
> dupliquer le code 1 fois par bouton (400 dans le cas présent)
> 2- comment créer dynamiquement les boutons en leur affectant un nom
> variable avec une boucle for...next
>
> D'avance merci pour les bonnes idées (même du genre ce n'est pas du tout
> comme ça qu'il faut faire, une solution plus simple consisterait à....).

Salut,

Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
solution plus simple consisterait à" créer dynamiquement tes boutons à
l'aide d'une boucle et d'ajouter un handler unique sur l'évènement Click de
chacun d'entre eux... Un truc du genre :

for i as integer = 0 to 399
dim Bouton as new Button
AddHandler Bouton.Click, addressOf MyClickHandler()
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

avec ton handler déclaré ainsi :
private Sub MyClickHandler(sender as Object, e as System.EventArgs)
'Ici ton code pour l'évènement click
end sub

Je ne sais pas si ça répond à ta question

@+
Steph





Avatar
400GpJ
Bonjour,

Merci beaucoup, ça correspond a priori parfaitement à ce que je recherche
(et c'est nettement plus propre que ce que j'utilisais en VB6.

Je vais essayer.

Cordialement.



"Stephane TUET" a écrit :

"400GpJ" a écrit dans le message de news:

> Bonjour,
>
> J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6 je les
> créais avec le même nom. J'obtenais un groupe indicé, qui me permettait
> d'ajouter du code s'appliquant à tous les boutons et exploitant l'indice
> du
> bouton qui était récupéré par l'é&vénement click.
>
> En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé avec
> un
> panel en y créant des boutons. A priori pas de problème particulier pour
> accéder aux boutons et les modifier, même si la syntaxe devient un peu
> lourde.
>
> En revanche je ne trouve pas :
> 1- comment mettre du code sur l'événement click (par exemple) sans
> dupliquer le code 1 fois par bouton (400 dans le cas présent)
> 2- comment créer dynamiquement les boutons en leur affectant un nom
> variable avec une boucle for...next
>
> D'avance merci pour les bonnes idées (même du genre ce n'est pas du tout
> comme ça qu'il faut faire, une solution plus simple consisterait à....).

Salut,

Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
solution plus simple consisterait à" créer dynamiquement tes boutons à
l'aide d'une boucle et d'ajouter un handler unique sur l'évènement Click de
chacun d'entre eux... Un truc du genre :

for i as integer = 0 to 399
dim Bouton as new Button
AddHandler Bouton.Click, addressOf MyClickHandler()
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

avec ton handler déclaré ainsi :
private Sub MyClickHandler(sender as Object, e as System.EventArgs)
'Ici ton code pour l'évènement click
end sub

Je ne sais pas si ça répond à ta question

@+
Steph





Avatar
400GpJ
Après un essai...

La création des boutons marche bien.

addressOf MyClickHandler()
doit être remplacé par
addressOf MyClickHandler

ensuite chaque bouton décleche le handler.

En revanche je ne sais pas comment récupérer l'index du bouton dans la
collection pour que le handler sache quel traitement appliquer selon le
bouton qui a été utilisé.

Cordialement,


"400GpJ" a écrit :

Bonjour,

Merci beaucoup, ça correspond a priori parfaitement à ce que je recherche
(et c'est nettement plus propre que ce que j'utilisais en VB6.

Je vais essayer.

Cordialement.



"Stephane TUET" a écrit :

> "400GpJ" a écrit dans le message de news:
>
> > Bonjour,
> >
> > J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6 je les
> > créais avec le même nom. J'obtenais un groupe indicé, qui me permettait
> > d'ajouter du code s'appliquant à tous les boutons et exploitant l'indice
> > du
> > bouton qui était récupéré par l'é&vénement click.
> >
> > En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé avec
> > un
> > panel en y créant des boutons. A priori pas de problème particulier pour
> > accéder aux boutons et les modifier, même si la syntaxe devient un peu
> > lourde.
> >
> > En revanche je ne trouve pas :
> > 1- comment mettre du code sur l'événement click (par exemple) sans
> > dupliquer le code 1 fois par bouton (400 dans le cas présent)
> > 2- comment créer dynamiquement les boutons en leur affectant un nom
> > variable avec une boucle for...next
> >
> > D'avance merci pour les bonnes idées (même du genre ce n'est pas du tout
> > comme ça qu'il faut faire, une solution plus simple consisterait à....).
>
> Salut,
>
> Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
> solution plus simple consisterait à" créer dynamiquement tes boutons à
> l'aide d'une boucle et d'ajouter un handler unique sur l'évènement Click de
> chacun d'entre eux... Un truc du genre :
>
> for i as integer = 0 to 399
> dim Bouton as new Button
> AddHandler Bouton.Click, addressOf MyClickHandler()
> 'Positionne et ajoute le bouton à ton conteneur (Panel)
> Bouton.Width = ...
> Bouton.Height = ...
> Bouton.Left = ...
> Bouton.Top = ...
> Me.MyPanel.Controls.Add(Bouton)
> next
>
> avec ton handler déclaré ainsi :
> private Sub MyClickHandler(sender as Object, e as System.EventArgs)
> 'Ici ton code pour l'évènement click
> end sub
>
> Je ne sais pas si ça répond à ta question
>
> @+
> Steph
>
>
>


Avatar
Stephane TUET
Si chacun de tes boutons doit posséder un code différent pour l'évènement
Click alors il n'y a aucun intéret à faire ce que je t'ai indiqué puisque
mon code permettait d'avoir la même gestion du click pour chacun des
boutons. S'il n'y a pas deux boutons qui réagissent de la même façon alors
je ne vois pas d'autre moyen que de les créer un par un. Si par contre tu
peux faire des regroupements entre tes boutons, il faut créer un handler
différent par traitement différent... Par exemple, si tu as 20 boutons, que
les 10 premiers ont un traitement identiques et les 10 derniers un autre
traitement tu peux faire qq chose comme cela :

for i as integer = 0 to 19
dim Bouton as new Button
if i < 10 then
AddHandler Bouton.Click, addressOf MyClickHandler1
else
AddHandler Bouton.Click, addressOf MyClickHandler2
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

Si tu n'as aucun regroupement possible, alors il faut gérer tes boutons un
par un, un peu comme tu le faisais en VB6 puisque tu devais avoir un énorme
select case sur ton index du bouton.

Voilà, en espérant que ça t'aide.

@+
Steph


"400GpJ" a écrit dans le message de news:

Après un essai...

La création des boutons marche bien.

addressOf MyClickHandler()
doit être remplacé par
addressOf MyClickHandler

ensuite chaque bouton décleche le handler.

En revanche je ne sais pas comment récupérer l'index du bouton dans la
collection pour que le handler sache quel traitement appliquer selon le
bouton qui a été utilisé.

Cordialement,


"400GpJ" a écrit :

Bonjour,

Merci beaucoup, ça correspond a priori parfaitement à ce que je
recherche
(et c'est nettement plus propre que ce que j'utilisais en VB6.

Je vais essayer.

Cordialement.



"Stephane TUET" a écrit :

> "400GpJ" a écrit dans le message de
> news:
>
> > Bonjour,
> >
> > J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6
> > je les
> > créais avec le même nom. J'obtenais un groupe indicé, qui me
> > permettait
> > d'ajouter du code s'appliquant à tous les boutons et exploitant
> > l'indice
> > du
> > bouton qui était récupéré par l'é&vénement click.
> >
> > En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé
> > avec
> > un
> > panel en y créant des boutons. A priori pas de problème particulier
> > pour
> > accéder aux boutons et les modifier, même si la syntaxe devient un
> > peu
> > lourde.
> >
> > En revanche je ne trouve pas :
> > 1- comment mettre du code sur l'événement click (par exemple) sans
> > dupliquer le code 1 fois par bouton (400 dans le cas présent)
> > 2- comment créer dynamiquement les boutons en leur affectant un nom
> > variable avec une boucle for...next
> >
> > D'avance merci pour les bonnes idées (même du genre ce n'est pas du
> > tout
> > comme ça qu'il faut faire, une solution plus simple consisterait
> > à....).
>
> Salut,
>
> Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
> solution plus simple consisterait à" créer dynamiquement tes boutons à
> l'aide d'une boucle et d'ajouter un handler unique sur l'évènement
> Click de
> chacun d'entre eux... Un truc du genre :
>
> for i as integer = 0 to 399
> dim Bouton as new Button
> AddHandler Bouton.Click, addressOf MyClickHandler()
> 'Positionne et ajoute le bouton à ton conteneur (Panel)
> Bouton.Width = ...
> Bouton.Height = ...
> Bouton.Left = ...
> Bouton.Top = ...
> Me.MyPanel.Controls.Add(Bouton)
> next
>
> avec ton handler déclaré ainsi :
> private Sub MyClickHandler(sender as Object, e as System.EventArgs)
> 'Ici ton code pour l'évènement click
> end sub
>
> Je ne sais pas si ça répond à ta question
>
> @+
> Steph
>
>
>




Avatar
400GpJ
C'est en fait le même code pour tous les boutons, mais qui exploitait l'index
du bouton. Celui-ci m'était retourné par l'événement click après que les
boutons aient été créés avec le même nom, ce qui provoquait un indicage
automatique (je nommais le premier X, puis le second X et ils se
transformaient respectivement en X(0) et X(1))

X_click avait alors un argument index et je pouvais donc les manipuler dans
les deux sens. Tout ce dont j'ai besoin c'est d'un index.

A défaut il faudra que je crée 400 fois le même bout de code appelant une
fonction avec comme argument le numéro du bouton, c'est lourd.

Si cette limite se confirme, je vais être obligé de creuser l'exploitation
des coordonnées du cuseur au moment du click pour m'en sortir, ce qui me
semble lourdingue, mais qui doit me permettre de m'en sortir avec un handler
unique pour tous mes boutons.

Je suis preneur de toute idée géniale sur ce qui me semble être une
regression significative de .net sur VB6


"Stephane TUET" a écrit :

Si chacun de tes boutons doit posséder un code différent pour l'évènement
Click alors il n'y a aucun intéret à faire ce que je t'ai indiqué puisque
mon code permettait d'avoir la même gestion du click pour chacun des
boutons. S'il n'y a pas deux boutons qui réagissent de la même façon alors
je ne vois pas d'autre moyen que de les créer un par un. Si par contre tu
peux faire des regroupements entre tes boutons, il faut créer un handler
différent par traitement différent... Par exemple, si tu as 20 boutons, que
les 10 premiers ont un traitement identiques et les 10 derniers un autre
traitement tu peux faire qq chose comme cela :

for i as integer = 0 to 19
dim Bouton as new Button
if i < 10 then
AddHandler Bouton.Click, addressOf MyClickHandler1
else
AddHandler Bouton.Click, addressOf MyClickHandler2
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

Si tu n'as aucun regroupement possible, alors il faut gérer tes boutons un
par un, un peu comme tu le faisais en VB6 puisque tu devais avoir un énorme
select case sur ton index du bouton.

Voilà, en espérant que ça t'aide.

@+
Steph


"400GpJ" a écrit dans le message de news:

> Après un essai...
>
> La création des boutons marche bien.
>
> addressOf MyClickHandler()
> doit être remplacé par
> addressOf MyClickHandler
>
> ensuite chaque bouton décleche le handler.
>
> En revanche je ne sais pas comment récupérer l'index du bouton dans la
> collection pour que le handler sache quel traitement appliquer selon le
> bouton qui a été utilisé.
>
> Cordialement,
>
>
> "400GpJ" a écrit :
>
>> Bonjour,
>>
>> Merci beaucoup, ça correspond a priori parfaitement à ce que je
>> recherche
>> (et c'est nettement plus propre que ce que j'utilisais en VB6.
>>
>> Je vais essayer.
>>
>> Cordialement.
>>
>>
>>
>> "Stephane TUET" a écrit :
>>
>> > "400GpJ" a écrit dans le message de
>> > news:
>> >
>> > > Bonjour,
>> > >
>> > > J'utilise des boutons pour constituer des plateaux de jeu. Sous VB6
>> > > je les
>> > > créais avec le même nom. J'obtenais un groupe indicé, qui me
>> > > permettait
>> > > d'ajouter du code s'appliquant à tous les boutons et exploitant
>> > > l'indice
>> > > du
>> > > bouton qui était récupéré par l'é&vénement click.
>> > >
>> > > En .Net, je suppose qu'il faut utiliser des collections. J'ai essayé
>> > > avec
>> > > un
>> > > panel en y créant des boutons. A priori pas de problème particulier
>> > > pour
>> > > accéder aux boutons et les modifier, même si la syntaxe devient un
>> > > peu
>> > > lourde.
>> > >
>> > > En revanche je ne trouve pas :
>> > > 1- comment mettre du code sur l'événement click (par exemple) sans
>> > > dupliquer le code 1 fois par bouton (400 dans le cas présent)
>> > > 2- comment créer dynamiquement les boutons en leur affectant un nom
>> > > variable avec une boucle for...next
>> > >
>> > > D'avance merci pour les bonnes idées (même du genre ce n'est pas du
>> > > tout
>> > > comme ça qu'il faut faire, une solution plus simple consisterait
>> > > à....).
>> >
>> > Salut,
>> >
>> > Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire, une
>> > solution plus simple consisterait à" créer dynamiquement tes boutons à
>> > l'aide d'une boucle et d'ajouter un handler unique sur l'évènement
>> > Click de
>> > chacun d'entre eux... Un truc du genre :
>> >
>> > for i as integer = 0 to 399
>> > dim Bouton as new Button
>> > AddHandler Bouton.Click, addressOf MyClickHandler()
>> > 'Positionne et ajoute le bouton à ton conteneur (Panel)
>> > Bouton.Width = ...
>> > Bouton.Height = ...
>> > Bouton.Left = ...
>> > Bouton.Top = ...
>> > Me.MyPanel.Controls.Add(Bouton)
>> > next
>> >
>> > avec ton handler déclaré ainsi :
>> > private Sub MyClickHandler(sender as Object, e as System.EventArgs)
>> > 'Ici ton code pour l'évènement click
>> > end sub
>> >
>> > Je ne sais pas si ça répond à ta question
>> >
>> > @+
>> > Steph
>> >
>> >
>> >





Avatar
Stephane TUET
Ok dans ce cas, tu pourrais mettre tous tes boutons dans le même conteneur
(un panel) et ensuite récupérer l'index du bouton comme ceci dans ton
handler (en partant du principe que tu n'as QUE tes boutons comme contrôles
dans ton panel) :

dim index as integer = me.myPanel.Controls.IndexOf(DirectCast(sender,
Control))

@+
Steph


"400GpJ" a écrit dans le message de news:

C'est en fait le même code pour tous les boutons, mais qui exploitait
l'index
du bouton. Celui-ci m'était retourné par l'événement click après que les
boutons aient été créés avec le même nom, ce qui provoquait un indicage
automatique (je nommais le premier X, puis le second X et ils se
transformaient respectivement en X(0) et X(1))

X_click avait alors un argument index et je pouvais donc les manipuler
dans
les deux sens. Tout ce dont j'ai besoin c'est d'un index.

A défaut il faudra que je crée 400 fois le même bout de code appelant une
fonction avec comme argument le numéro du bouton, c'est lourd.

Si cette limite se confirme, je vais être obligé de creuser l'exploitation
des coordonnées du cuseur au moment du click pour m'en sortir, ce qui me
semble lourdingue, mais qui doit me permettre de m'en sortir avec un
handler
unique pour tous mes boutons.

Je suis preneur de toute idée géniale sur ce qui me semble être une
regression significative de .net sur VB6


"Stephane TUET" a écrit :

Si chacun de tes boutons doit posséder un code différent pour l'évènement
Click alors il n'y a aucun intéret à faire ce que je t'ai indiqué puisque
mon code permettait d'avoir la même gestion du click pour chacun des
boutons. S'il n'y a pas deux boutons qui réagissent de la même façon
alors
je ne vois pas d'autre moyen que de les créer un par un. Si par contre tu
peux faire des regroupements entre tes boutons, il faut créer un handler
différent par traitement différent... Par exemple, si tu as 20 boutons,
que
les 10 premiers ont un traitement identiques et les 10 derniers un autre
traitement tu peux faire qq chose comme cela :

for i as integer = 0 to 19
dim Bouton as new Button
if i < 10 then
AddHandler Bouton.Click, addressOf MyClickHandler1
else
AddHandler Bouton.Click, addressOf MyClickHandler2
'Positionne et ajoute le bouton à ton conteneur (Panel)
Bouton.Width = ...
Bouton.Height = ...
Bouton.Left = ...
Bouton.Top = ...
Me.MyPanel.Controls.Add(Bouton)
next

Si tu n'as aucun regroupement possible, alors il faut gérer tes boutons
un
par un, un peu comme tu le faisais en VB6 puisque tu devais avoir un
énorme
select case sur ton index du bouton.

Voilà, en espérant que ça t'aide.

@+
Steph


"400GpJ" a écrit dans le message de
news:

> Après un essai...
>
> La création des boutons marche bien.
>
> addressOf MyClickHandler()
> doit être remplacé par
> addressOf MyClickHandler
>
> ensuite chaque bouton décleche le handler.
>
> En revanche je ne sais pas comment récupérer l'index du bouton dans la
> collection pour que le handler sache quel traitement appliquer selon le
> bouton qui a été utilisé.
>
> Cordialement,
>
>
> "400GpJ" a écrit :
>
>> Bonjour,
>>
>> Merci beaucoup, ça correspond a priori parfaitement à ce que je
>> recherche
>> (et c'est nettement plus propre que ce que j'utilisais en VB6.
>>
>> Je vais essayer.
>>
>> Cordialement.
>>
>>
>>
>> "Stephane TUET" a écrit :
>>
>> > "400GpJ" a écrit dans le message
>> > de
>> > news:
>> >
>> > > Bonjour,
>> > >
>> > > J'utilise des boutons pour constituer des plateaux de jeu. Sous
>> > > VB6
>> > > je les
>> > > créais avec le même nom. J'obtenais un groupe indicé, qui me
>> > > permettait
>> > > d'ajouter du code s'appliquant à tous les boutons et exploitant
>> > > l'indice
>> > > du
>> > > bouton qui était récupéré par l'é&vénement click.
>> > >
>> > > En .Net, je suppose qu'il faut utiliser des collections. J'ai
>> > > essayé
>> > > avec
>> > > un
>> > > panel en y créant des boutons. A priori pas de problème
>> > > particulier
>> > > pour
>> > > accéder aux boutons et les modifier, même si la syntaxe devient un
>> > > peu
>> > > lourde.
>> > >
>> > > En revanche je ne trouve pas :
>> > > 1- comment mettre du code sur l'événement click (par exemple) sans
>> > > dupliquer le code 1 fois par bouton (400 dans le cas présent)
>> > > 2- comment créer dynamiquement les boutons en leur affectant un
>> > > nom
>> > > variable avec une boucle for...next
>> > >
>> > > D'avance merci pour les bonnes idées (même du genre ce n'est pas
>> > > du
>> > > tout
>> > > comme ça qu'il faut faire, une solution plus simple consisterait
>> > > à....).
>> >
>> > Salut,
>> >
>> > Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire,
>> > une
>> > solution plus simple consisterait à" créer dynamiquement tes boutons
>> > à
>> > l'aide d'une boucle et d'ajouter un handler unique sur l'évènement
>> > Click de
>> > chacun d'entre eux... Un truc du genre :
>> >
>> > for i as integer = 0 to 399
>> > dim Bouton as new Button
>> > AddHandler Bouton.Click, addressOf MyClickHandler()
>> > 'Positionne et ajoute le bouton à ton conteneur (Panel)
>> > Bouton.Width = ...
>> > Bouton.Height = ...
>> > Bouton.Left = ...
>> > Bouton.Top = ...
>> > Me.MyPanel.Controls.Add(Bouton)
>> > next
>> >
>> > avec ton handler déclaré ainsi :
>> > private Sub MyClickHandler(sender as Object, e as System.EventArgs)
>> > 'Ici ton code pour l'évènement click
>> > end sub
>> >
>> > Je ne sais pas si ça répond à ta question
>> >
>> > @+
>> > Steph
>> >
>> >
>> >







Avatar
400GpJ
C'est exactement ce qu'il me fallait pour une gestion complètement dynamique
des boutons (c'est nettement plus propre). Juste un point, la syntaxe
proposée ne passe pas ",Control" est refusé, en revanche :
dim index as integer = me.myPanel.Controls.IndexOf(sender)
semble parfaitement fonctionner.

Encore merci.


"Stephane TUET" a écrit :

Ok dans ce cas, tu pourrais mettre tous tes boutons dans le même conteneur
(un panel) et ensuite récupérer l'index du bouton comme ceci dans ton
handler (en partant du principe que tu n'as QUE tes boutons comme contrôles
dans ton panel) :

dim index as integer = me.myPanel.Controls.IndexOf(DirectCast(sender,
Control))

@+
Steph


"400GpJ" a écrit dans le message de news:

> C'est en fait le même code pour tous les boutons, mais qui exploitait
> l'index
> du bouton. Celui-ci m'était retourné par l'événement click après que les
> boutons aient été créés avec le même nom, ce qui provoquait un indicage
> automatique (je nommais le premier X, puis le second X et ils se
> transformaient respectivement en X(0) et X(1))
>
> X_click avait alors un argument index et je pouvais donc les manipuler
> dans
> les deux sens. Tout ce dont j'ai besoin c'est d'un index.
>
> A défaut il faudra que je crée 400 fois le même bout de code appelant une
> fonction avec comme argument le numéro du bouton, c'est lourd.
>
> Si cette limite se confirme, je vais être obligé de creuser l'exploitation
> des coordonnées du cuseur au moment du click pour m'en sortir, ce qui me
> semble lourdingue, mais qui doit me permettre de m'en sortir avec un
> handler
> unique pour tous mes boutons.
>
> Je suis preneur de toute idée géniale sur ce qui me semble être une
> regression significative de .net sur VB6
>
>
> "Stephane TUET" a écrit :
>
>> Si chacun de tes boutons doit posséder un code différent pour l'évènement
>> Click alors il n'y a aucun intéret à faire ce que je t'ai indiqué puisque
>> mon code permettait d'avoir la même gestion du click pour chacun des
>> boutons. S'il n'y a pas deux boutons qui réagissent de la même façon
>> alors
>> je ne vois pas d'autre moyen que de les créer un par un. Si par contre tu
>> peux faire des regroupements entre tes boutons, il faut créer un handler
>> différent par traitement différent... Par exemple, si tu as 20 boutons,
>> que
>> les 10 premiers ont un traitement identiques et les 10 derniers un autre
>> traitement tu peux faire qq chose comme cela :
>>
>> for i as integer = 0 to 19
>> dim Bouton as new Button
>> if i < 10 then
>> AddHandler Bouton.Click, addressOf MyClickHandler1
>> else
>> AddHandler Bouton.Click, addressOf MyClickHandler2
>> 'Positionne et ajoute le bouton à ton conteneur (Panel)
>> Bouton.Width = ...
>> Bouton.Height = ...
>> Bouton.Left = ...
>> Bouton.Top = ...
>> Me.MyPanel.Controls.Add(Bouton)
>> next
>>
>> Si tu n'as aucun regroupement possible, alors il faut gérer tes boutons
>> un
>> par un, un peu comme tu le faisais en VB6 puisque tu devais avoir un
>> énorme
>> select case sur ton index du bouton.
>>
>> Voilà, en espérant que ça t'aide.
>>
>> @+
>> Steph
>>
>>
>> "400GpJ" a écrit dans le message de
>> news:
>>
>> > Après un essai...
>> >
>> > La création des boutons marche bien.
>> >
>> > addressOf MyClickHandler()
>> > doit être remplacé par
>> > addressOf MyClickHandler
>> >
>> > ensuite chaque bouton décleche le handler.
>> >
>> > En revanche je ne sais pas comment récupérer l'index du bouton dans la
>> > collection pour que le handler sache quel traitement appliquer selon le
>> > bouton qui a été utilisé.
>> >
>> > Cordialement,
>> >
>> >
>> > "400GpJ" a écrit :
>> >
>> >> Bonjour,
>> >>
>> >> Merci beaucoup, ça correspond a priori parfaitement à ce que je
>> >> recherche
>> >> (et c'est nettement plus propre que ce que j'utilisais en VB6.
>> >>
>> >> Je vais essayer.
>> >>
>> >> Cordialement.
>> >>
>> >>
>> >>
>> >> "Stephane TUET" a écrit :
>> >>
>> >> > "400GpJ" a écrit dans le message
>> >> > de
>> >> > news:
>> >> >
>> >> > > Bonjour,
>> >> > >
>> >> > > J'utilise des boutons pour constituer des plateaux de jeu. Sous
>> >> > > VB6
>> >> > > je les
>> >> > > créais avec le même nom. J'obtenais un groupe indicé, qui me
>> >> > > permettait
>> >> > > d'ajouter du code s'appliquant à tous les boutons et exploitant
>> >> > > l'indice
>> >> > > du
>> >> > > bouton qui était récupéré par l'é&vénement click.
>> >> > >
>> >> > > En .Net, je suppose qu'il faut utiliser des collections. J'ai
>> >> > > essayé
>> >> > > avec
>> >> > > un
>> >> > > panel en y créant des boutons. A priori pas de problème
>> >> > > particulier
>> >> > > pour
>> >> > > accéder aux boutons et les modifier, même si la syntaxe devient un
>> >> > > peu
>> >> > > lourde.
>> >> > >
>> >> > > En revanche je ne trouve pas :
>> >> > > 1- comment mettre du code sur l'événement click (par exemple) sans
>> >> > > dupliquer le code 1 fois par bouton (400 dans le cas présent)
>> >> > > 2- comment créer dynamiquement les boutons en leur affectant un
>> >> > > nom
>> >> > > variable avec une boucle for...next
>> >> > >
>> >> > > D'avance merci pour les bonnes idées (même du genre ce n'est pas
>> >> > > du
>> >> > > tout
>> >> > > comme ça qu'il faut faire, une solution plus simple consisterait
>> >> > > à....).
>> >> >
>> >> > Salut,
>> >> >
>> >> > Alors à mon avis, "ce n'est pas du tout comme ça qu'il faut faire,
>> >> > une
>> >> > solution plus simple consisterait à" créer dynamiquement tes boutons
>> >> > à
>> >> > l'aide d'une boucle et d'ajouter un handler unique sur l'évènement
>> >> > Click de
>> >> > chacun d'entre eux... Un truc du genre :
>> >> >
>> >> > for i as integer = 0 to 399
>> >> > dim Bouton as new Button
>> >> > AddHandler Bouton.Click, addressOf MyClickHandler()
>> >> > 'Positionne et ajoute le bouton à ton conteneur (Panel)
>> >> > Bouton.Width = ...
>> >> > Bouton.Height = ...
>> >> > Bouton.Left = ...
>> >> > Bouton.Top = ...
>> >> > Me.MyPanel.Controls.Add(Bouton)
>> >> > next
>> >> >
>> >> > avec ton handler déclaré ainsi :
>> >> > private Sub MyClickHandler(sender as Object, e as System.EventArgs)
>> >> > 'Ici ton code pour l'évènement click
>> >> > end sub
>> >> >
>> >> > Je ne sais pas si ça répond à ta question
>> >> >
>> >> > @+
>> >> > Steph
>> >> >
>> >> >
>> >> >
>>
>>
>>





Avatar
Pierre Alexis [MVS]
Stephane TUET a écrit :

Ok dans ce cas, tu pourrais mettre tous tes boutons dans le même conteneur
(un panel) et ensuite récupérer l'index du bouton comme ceci dans ton
handler (en partant du principe que tu n'as QUE tes boutons comme contrôles
dans ton panel) :



Ca par contre c'est ultra pas propre, je dirais même bourrain ^^

Le mieux pour différencier dans ton handler le bouton déclancheur de
l'événement est d'utiliser le paramètre "sender" de l'événement et
d'ensuite travailler avec ça, et pas avec un index.

Bien sûr s'il te faut absolument un index, tu crées une classe bouton
dérivée qui rajoute un champ en plus intitulé "index".

--
Pierre ALEXIS
Most Valuable Student (MVS)
Courriel & messenger :
Homepage : http://student.ulb.ac.be/~palexis/
Avatar
Stephane TUET
Bonjour Alexis

Je veux bien que mon code soit bourrin, je ne suis pas expert .NET et je
n'ai jamais dit que cette solution était la meilleure. Par contre je serais
curieux de savoir comment tu procèderais pour différencier un bouton parmis
400 rien qu'avec le paramètre "sender" et sans travailler avec son index
(c'est à mon avis un problème récurrent).

Steph


"Pierre Alexis [MVS]" a écrit dans le message de
news: %
Stephane TUET a écrit :

Ok dans ce cas, tu pourrais mettre tous tes boutons dans le même
conteneur (un panel) et ensuite récupérer l'index du bouton comme ceci
dans ton handler (en partant du principe que tu n'as QUE tes boutons
comme contrôles dans ton panel) :



Ca par contre c'est ultra pas propre, je dirais même bourrain ^^

Le mieux pour différencier dans ton handler le bouton déclancheur de
l'événement est d'utiliser le paramètre "sender" de l'événement et
d'ensuite travailler avec ça, et pas avec un index.

Bien sûr s'il te faut absolument un index, tu crées une classe bouton
dérivée qui rajoute un champ en plus intitulé "index".

--
Pierre ALEXIS
Most Valuable Student (MVS)
Courriel & messenger :
Homepage : http://student.ulb.ac.be/~palexis/


1 2