gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007
-
23 juin 2007 à 07:23
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007
-
23 juin 2007 à 11:33
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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 juin 2007 à 10:27
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 #
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 juin 2007 à 08:38
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 juin 2007 à 09: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 #
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007 23 juin 2007 à 09:48
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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 juin 2007 à 10:00
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 #
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007 23 juin 2007 à 10:11
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 .
fiko81
Messages postés381Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 5 septembre 20103 23 juin 2007 à 10:18
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 />
fiko81
Messages postés381Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 5 septembre 20103 23 juin 2007 à 10:20
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 />
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 juin 2007 à 10:48
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 #
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007 23 juin 2007 à 11:01
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 23 juin 2007 à 11:26
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 #
gillesrun
Messages postés49Date d'inscriptionvendredi 11 août 2006StatutMembreDernière intervention26 juin 2007 23 juin 2007 à 11:33
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 .