Boucle selective

Résolu
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007 - 23 juin 2007 à 07:23
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 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.

Merci d'avance

19 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #   
3
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
23 juin 2007 à 07:50
Bonjour,

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

Remplace donc Label.BackColor
pat
 ctrl.BackColor
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
23 juin 2007 à 07:53
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) ?
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
23 juin 2007 à 08:25
A vérifier (je ne connais pas VB.Net) :
le label sur lequel tu cliques devrait être le :

System.Windows.Forms.Application.ActiveForm.ActiveControl
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
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

end if
Next
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
23 juin 2007 à 09:22
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #   
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 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.

gilles
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #   
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 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 .
0
fiko81 Messages postés 381 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 5 septembre 2010 3
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 />
0
fiko81 Messages postés 381 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 5 septembre 2010 3
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 />
0
fiko81 Messages postés 381 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 5 septembre 2010 3
23 juin 2007 à 10:31
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 />
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 juin 2007
23 juin 2007 à 10:47
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #   
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 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 
0
fiko81 Messages postés 381 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 5 septembre 2010 3
23 juin 2007 à 11:10
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 />
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #   
0
gillesrun Messages postés 49 Date d'inscription vendredi 11 août 2006 Statut Membre Dernière intervention 26 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 .

Merci pour tout casy  !!!
0