Boucle selective

Résolu
Signaler
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007
-
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007
-
Bonjour , j'ai un petit soucis avec la boucle " For each " , voila mon code:

Dim ctl as Control


For Each ctl In Me.Controls
If Ctl.GetType Is GetType(label) Then
Label.BackColor = System.Drawing.Color.Black
( vb me demande de declarer label.backcolor, hors je voudrais que cela soit generalisé a l'ensemble des labels )


end if
Next

Je possede plusieur label qui sont avec la declaration  " click " , c'est a dire quand je clic dessus , il change de couleur.
Hors avec cette boucle , quand je clic sur un label , tous changent de couleur alors que je ne voudrais que seul le label cliqué change.
Et le probleme , c'est que j'ai besoin de faire une boucle car il y a beaucoup de label.

Merci d'avance

19 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Ca change rien parce que pour ta boucle, tu sera obligé d'aller mettre un appel dans l'évènement click de chacun des 30 labels.

MAintenant, tu as une autre solution si tu ne gere que la couleur du label dans le click, c'est de creer une seule fonction de gestion de l'évènement avec le code que j'ai donné, et au chragement de l'écran tu abonne chacun des évènements click de tes labels à cette fonction. Là effectivement il te faudra une boucle, mais une seule fois au chargement de l'écran.

La methode :
Tu prend l'évènement click du premier label.
Eventuellement tu peut renommer la fonction qui doit etre Label1_Click en MesLabels_Click.
Tu vas à la fin de la déclartaion et tu vire "Handles Label1.Click"

Ensuite dans le form_load tu met cette boucle (semblable à celle quet tu as fait)
        For Each lbl As Control In Me.Controls
            If lbl.GetType Is GetType(Label) Then
                AddHandler lbl.Click, AddressOf MesLabels_Click
            End If
        Next

Comme ça pour le click, tous tes labels pointeront vers la même fonction, et tu n'auras à tapper le code qu'une seule fois (et la boucle ne sera faite qu'une fois à l'ouverture de l'écran)

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonjour,

Tu fais une boucle par laquelle tu extrais chaque "ctrl'

Remplace donc Label.BackColor
pat
 ctrl.BackColor
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Et si tu ne veux cjanger que le label sur lequel tu cliques : pourquoi ne pas te référer au seul contrôle actif (ton label) ?
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
A vérifier (je ne connais pas VB.Net) :
le label sur lequel tu cliques devrait être le :

System.Windows.Forms.Application.ActiveForm.ActiveControl
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Et si (pour une raison quelconque) tu passes par ta boucle, ça devrait ressembler à :

For Each ctl In Me.Controls
  If Ctl.name = system.Windows.Forms.Application.ActiveForm.ActiveControl.name Then
  ctrl.BackColor = System.Drawing.Color.Black

end if
Next
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

Je te remercie pour ton aide mais j'ai testé ton code mais il me dit que :

System.Windows.Forms.Application.ActiveForm 

n'est pas un membre de system.windows.forms.application .

gilles
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Si resume bien, lorsque tu clique sur un label spécifique, tu veux que celui-ci change de couleur ?

Déjà regarde au niveau de l'évènement click de ton label. Tu as un paramètre Sender qui se trouve etre le controle à l'origine du click.
Il te suffit de mettre le code suivant dans l'évènement click du label :

Dim lbl as Label = CType(sender , Label)
lbl.Backcolor = Color.Black

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

merci casy,

mais j'ai plusieur label , une trentaine.  Je sais changer la couleur pour  un label quand on clic dessus mais pour une question de confort, je voudrais utiliser la boucle.  c'est a dire que si je clic sur un label , seul le label cliqué change de couleur.

gilles
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
je ne vois pas ou une boucle va t'ammener du confort, le paramètre Sender dans le code que j'ai donné, représente le seul et unique controle sur lequel tu as cliqué à l'instant t ou l'évènement a été déclenché par le click.

Je ne vois pas l'interet sur un click de passer en revue l'ensemble des controles pour trouver celui qui a été clické puisque l'info nous est directement passée en clair.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

C'est vrai , ton code marche , mais je suis obligé de le mettre dans les evenements click de chaque label.........j'en ai une trentaine et je vais  encore en  rajouter autant....voila pourquoi je voulais utiliser une boucle , pour ne pas  avoir à taper chaque label .
Messages postés
381
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
5 septembre 2010
3
Salut,
"mais je suis obligé de le mettre dans les evenements click"
Je pense qu'il te suffit d'associer tout test controle en handler :

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click, Label2.Click, Label3.Click, Label4.Click, Label5.Click, Label6.Click,...
   
'+ le code de casy et tu devrais pouvoir t'en sortir

End Sub

 Fiko ;-)

La reponse vous convient pensez > Accepter <
<hr />
Messages postés
381
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
5 septembre 2010
3
D'ailleur tu peux même l'appler :

Private Sub Click_Sur_Groupe_Label(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Label1.Click, Label2.Click, Label3.Click,
Label4.Click, Label5.Click, Label6.Click,...
   
'+ le code de casy et tu devrais pouvoir t'en sortir

End Sub

 Fiko ;-)

La reponse vous convient pensez > Accepter <
<hr />
Messages postés
381
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
5 septembre 2010
3
Mais casy : ça ne revient pas au même d'aboner tes label à la fonction directement dans l'ide ?
Il me semble que le résultat sera le même ? Non ?

 Fiko ;-)

La reponse vous convient pensez > Accepter <
<hr />
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

Merci Casy et merci aux autres , ça marche !!!!

Du coup ,  je pourrais aussi utiliser ton principe dans d'autre cas.
Pour ceux  que ça interesse , voila le code made in casy :

Private

Sub
Form1_Load(
ByVal
eventSender
As
System.Object,
ByVal
eventArgs
As
System.EventArgs)
Handles

MyBase
.Load

For
Each
lbl
As
Control
In

Me
.Controls

If lbl.GetType
Is

GetType
(Label)
Then

AddHandler lbl.Click,
AddressOf
MesLabels_Click

End
If

Next

Private
Sub
MesLabels_Click(
ByVal
sender
As
System.Object,
ByVal
e
As
System.EventArgs)

Dim lbl
As
Label =
CType
(sender, Label)lbl.BackColor = Color.Black

End
Sub

Gilles
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Le résultat sera effectivement le même à une petite différence près tout de même

Si tu as une 60ène de controles à abonner, la ligne de code telle que tu la propose va vite devenir pénible à écrire et illisible.
L'abonnement dynamique me semble plus propre. Mais ce n'est effectivement que de l'estétique.
Niveau execution c'est strictement identique.

Un petit détail quand même, avec l'abonnement dynamique, tu ajoute ou supprime un label, c'est totalement transparent niveau code.
Avec l'abonnement sur la ligne de déclaration, il faut penser à systématiquement aller rajouter ou supprimer les controles.

L'abonnement dynamique permettrait aussi éventuellement l'ajout de controle dynamiquement, chose que ne permet pas la ligne de déclaration.

Après, chacun sa méthode

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

Je vais abuser de ta patience casy , mais j'ai essayer ton code qui marche a merveille pour changer la couleur des labels mais pour le code suivant , ça ne marche pas!  c'est un code pour rendre les labels rond .

Dim X, HRegion, Y
As
IntegerX = VB6.PixelsToTwipsX(Label1.Width) / VB6.TwipsPerPixelX - 2

Y = VB6.PixelsToTwipsY(Label1.Height) / VB6.TwipsPerPixelY - 2

HRegion = CreateEllipticRgn(0, 0, X, Y)

 

SetWindowRgn(Label1.Handle.ToInt32, HRegion,

False)

PS : tu as le droit de m'envoyer bouler , j'ai deja pas mal avancé grace a toi 
Messages postés
381
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
5 septembre 2010
3
D'accord pigé.
Merci des explications casy : j'adhère à ta théorie du c'est plus propre

 Fiko ;-)

La reponse vous convient pensez > Accepter <
<hr />
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
Si ça marche.

Sur le même principe que pour le click, il te suffit de remplacer Label1 par la variable utilisée pour le label courant, lbl dans le code donné plus haut

Pour info : VB6.PixelsToTwipsX(Label1.Width) / VB6.TwipsPerPixelX - 2 revient à écrire Label1.Width - 2

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
Messages postés
49
Date d'inscription
vendredi 11 août 2006
Statut
Membre
Dernière intervention
26 juin 2007

rien a dire casy , ça fonctionne tres bien........je fais dans le compliqué alors que quand on te le dit , c'est là que tu te dis " ben oui , c'est tout simple " mais bon , faut dire que je suis debutant .

Merci pour tout casy  !!!