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

Comment passer le nom d'un controle comme parametre ?

7 réponses
Avatar
Fabien
Bonjour,
Voilà étant un peu faineant je cherche a eviter de retaper x fois le
même code pour traiter des controles dont la seule difference est le nom.
Est il possible de passer a une procédure le nom d'un controle et que
cette procedure puisse manipuler ce controle ?
ex :

sub test()
dim I as Integer
for i = 1 to 10
Modifie "moncontrole" & i
next i
end sub

Sub modifie (uncontrole as ????)
me.uncontrole.visible = false
end sub

Merci
Fabien

7 réponses

Avatar
Matthieu Napoli \(MadMatt\)
Bonjour,

Pourquoi n'as tu pas utilisé un tableau de controles (avec index) ?
Y'a t'il une raison précise, ou alors tu ne connais peut etre pas ?
Car ça parait la solution la plus appropriée, tu aurais des controles du
style Moncontrole[i]
et tu n'aura plus qu'à faire un :
For i=1 to 10
Modifie( Moncontrole[i] )
Next i
Avatar
Driss HANIB
bonjour

dans VB 6 il est possible de mettre des controles indicés( donc
obligatoirement de même type) qui te permettront de faire ce que tu veux

for i = 0 to MonControl.count
MonControl(I).visibleúlse ' par exemple
MonControle.text = vbnullstring ' si c'st un textbox..
Next I

Driss
"Fabien" a écrit dans le message de
news:46125e0c$0$25910$
Bonjour,
Voilà étant un peu faineant je cherche a eviter de retaper x fois le
même code pour traiter des controles dont la seule difference est le nom.
Est il possible de passer a une procédure le nom d'un controle et que
cette procedure puisse manipuler ce controle ?
ex :

sub test()
dim I as Integer
for i = 1 to 10
Modifie "moncontrole" & i
next i
end sub

Sub modifie (uncontrole as ????)
me.uncontrole.visible = false
end sub

Merci
Fabien


Avatar
Fabien
Driss HANIB a écrit :
bonjour

dans VB 6 il est possible de mettre des controles indicés( donc
obligatoirement de même type) qui te permettront de faire ce que tu veux

for i = 0 to MonControl.count
MonControl(I).visibleúlse ' par exemple
MonControle.text = vbnullstring ' si c'st un textbox..
Next I

Driss
"Fabien" a écrit dans le message de
news:46125e0c$0$25910$
Bonjour,
Voilà étant un peu faineant je cherche a eviter de retaper x fois le
même code pour traiter des controles dont la seule difference est le nom.
Est il possible de passer a une procédure le nom d'un controle et que
cette procedure puisse manipuler ce controle ?
ex :

sub test()
dim I as Integer
for i = 1 to 10
Modifie "moncontrole" & i
next i
end sub

Sub modifie (uncontrole as ????)
me.uncontrole.visible = false
end sub

Merci
Fabien






Merci pour vos réponses.
Honte a moi je n'avais pas précisé que je travaillais avec visual basic
express 2005.
Deplus cette notion de controle indexé m'est etrangère :_-(
Avatar
Patrick Philippot
Bonjour,

Fabien wrote:
Honte a moi je n'avais pas précisé que je travaillais avec visual
basic express 2005.



Dans ce cas, revoyez la gestion des événements. Dans VB .Net, vous pouvez
affecter dynamiquement un gestionnaire d'événements à un événement
particulier en utilisant la fonction AddHandler. Il suffit donc de faire
pointer avec AddHandler l'événement d'un type donné pour chaque contrôle
considéré vers une routine de traitement unique. La différenciation se
faisant par l'argument sender qui est la référence sur le contrôle qui a
généré l'événement:

AddHandler Button1.Click, AddressOf myClickHandler
AddHandler Button2.Click, AddressOf myClickHandler
AddHandler Button3.Click, AddressOf myClickHandler

Private Sub myClickHandler(ByVal sender As System.Object, ByVal e As
System.EventArgs)
MsgBox("Event Handled!")
End Sub

Dans cet exemple, tous les événements Click pour les 3 boutons sont traités
par la même routine. Vous savez de quel bouton il s'agit en regardant
l'argument sender.

Vous pouvez "débrancher" un événement d'une routine en utilisant
RemoveHandler.

Avec ce mécanisme, les control arrays de VB6 dont on a parlé plus haut ne
servent plus à rien.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Fred
Dans : news:,
Patrick Philippot disait :
Bonjour,

Fabien wrote:
Honte a moi je n'avais pas précisé que je travaillais avec visual
basic express 2005.



Dans ce cas, revoyez la gestion des événements. Dans VB .Net, vous
pouvez affecter dynamiquement un gestionnaire d'événements à un
événement particulier en utilisant la fonction AddHandler. Il suffit
donc de faire pointer avec AddHandler l'événement d'un type donné
pour chaque contrôle considéré vers une routine de traitement unique.
La différenciation se faisant par l'argument sender qui est la
référence sur le contrôle qui a généré l'événement:

AddHandler Button1.Click, AddressOf myClickHandler
AddHandler Button2.Click, AddressOf myClickHandler
AddHandler Button3.Click, AddressOf myClickHandler

Private Sub myClickHandler(ByVal sender As System.Object, ByVal e As
System.EventArgs)
MsgBox("Event Handled!")
End Sub



Ou bien

Private Sub myClickHandler(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click, Button2.Click, Button3.Click

Si les boutons ne sont pas créés dynamiquement.

Mais je ne suis pas sûr que c'est exactement le problème de Fabien.

Pour récupérer un contrôle par son nom, il peut aussi écrire :

Conteneur.Controls("Button1")

En supposant que Conteneur est l'objet contenant les boutons.
La Form par exemple ce qui donne : Me.Controls("Button1")
Le conteneur peut-être aussi un GroupBox ou un Panel :
Me.Panel1.Controls("Button1")

Syntaxe par ailleurs utilisable aussi en VB6 si mes souvenirs sont bons.

Si les propriétés à modifier ne sont pas communes à tous les contrôles,
il faudra peut-être faire un cast :

Dim b as Button = Me.Controls("Button1")
b.UnePropriétéSpécifiqueDuBouton



--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Fabien
Fred a écrit :
Dans : news:,
Patrick Philippot disait :
Bonjour,

Fabien wrote:
Honte a moi je n'avais pas précisé que je travaillais avec visual
basic express 2005.



Dans ce cas, revoyez la gestion des événements. Dans VB .Net, vous
pouvez affecter dynamiquement un gestionnaire d'événements à un
événement particulier en utilisant la fonction AddHandler. Il suffit
donc de faire pointer avec AddHandler l'événement d'un type donné
pour chaque contrôle considéré vers une routine de traitement unique.
La différenciation se faisant par l'argument sender qui est la
référence sur le contrôle qui a généré l'événement:

AddHandler Button1.Click, AddressOf myClickHandler
AddHandler Button2.Click, AddressOf myClickHandler
AddHandler Button3.Click, AddressOf myClickHandler

Private Sub myClickHandler(ByVal sender As System.Object, ByVal e As
System.EventArgs)
MsgBox("Event Handled!")
End Sub



Ou bien

Private Sub myClickHandler(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click, Button2.Click, Button3.Click

Si les boutons ne sont pas créés dynamiquement.

Mais je ne suis pas sûr que c'est exactement le problème de Fabien.

Pour récupérer un contrôle par son nom, il peut aussi écrire :

Conteneur.Controls("Button1")

En supposant que Conteneur est l'objet contenant les boutons.
La Form par exemple ce qui donne : Me.Controls("Button1")
Le conteneur peut-être aussi un GroupBox ou un Panel :
Me.Panel1.Controls("Button1")

Syntaxe par ailleurs utilisable aussi en VB6 si mes souvenirs sont bons.

Si les propriétés à modifier ne sont pas communes à tous les contrôles,
il faudra peut-être faire un cast :

Dim b as Button = Me.Controls("Button1")
b.UnePropriétéSpécifiqueDuBouton





Ok merci, La solution de Fred me va bien.
Merci a tout les deux du temps passé ;-)
@+
Fabien
Avatar
Fred
Dans : news:46134214$0$25949$,
Fabien disait :

Merci a tout les deux du temps passé ;-)



Merci pour le retour.
J'en profite pour compléter mon message précédent.

Pour vb 2005 il est préférable d'aller sur :

microsoft.public.fr.dotnet.vb
(Le langage vb.NET)

microsoft.public.fr.dotnet
(Le framework)

microsoft.public.fr.dotnet.adonet
(Accès aux données)

microsoft.public.fr.dotnet.visualstudio
(L'environnement de développement)

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)