Boucle ? Pas boucle ?

Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
- - Dernière réponse : Efferp
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
- 19 mai 2018 à 19:37
Bonjour à tous,

je suis sur une petite application et je voudrais profiter de vos connaissance

Voici mon code, et je voudrais savoir si il y'a possibilité d’éviter de le recopier pour mes 40 picturebox... ( pas très esthétique ) :

Contraintes :
1. Je clique sur une picturebox bien définie pour récupérer une image ressource

2. Je clique sur une de mes 40 autres picturebox qui est remplacée par celle que j'ai précédemment cliqué.

3. Chaque picturebox est indépendante les unes des autres ( je veux pas que chaque picturebox change, juste celle que je clique )

Merci d'avance pour vos conseils :)


	
	' Définition des variables
	Dim CouleurSelectionnee as Image
	' Récupération de l'image source
	Sub Img_CouleurRougeClick(sender As Object, e As EventArgs)
		CouleurSelectionnee = Me.img_CouleurRouge.Image
	End Sub
	' Changement de l'image destination
	Sub Img_01Click(sender As Object, e As EventArgs)
		Me.Img_01.Image = CouleurSelectionnee
	End Sub
	
	Sub Img_02Click(sender As Object, e As EventArgs)
		Me.Img_01.Image = CouleurSelectionnee
	End Sub

	Sub Img_03Click(sender As Object, e As EventArgs)
		Me.Img_01.Image = CouleurSelectionnee
	End Sub
	...
	...
Afficher la suite 

Votre réponse

15 réponses

Messages postés
1730
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
bonjour !
Ce n'est guère évident à faire car VB Net n'a pas les mêmes facilités que VB 6 avec les tableaux de contrôles
La marche à suivre est de créer une collection de Picturebox et de déposer celles-ci par code dans une boucle sur la Form . Chaque Picturebox a la même propriété Name suivie d'un indice : Image0, Image1, Image2, etc.……
Note qu'en VB Net les tableaux et les collections commencent à l'indice 0 .
ensuite une seule Sub gère le click sur n'importe quelle Picturebox : on sait quelle est la Picturebox en récupérant l'indice .
Je te mets la source à télécharger d'un de mes projets ( c'est un jeu tout simple) où j'utilise ce procédé pour gérer les cases du jeu : https://codes-sources.commentcamarche.net/source/102091-rollit
Etudie la Sub Form_Load pour comprendre comment créer par code les cases du jeu ainsi la Sub PictMouseDown(sender As Object, e As MouseEventArgs) qui récupère l'indice de la Picturebox cliquée ( surtout les 2 premières lignes )
Commenter la réponse de vb95
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour

Je pense qu’il y a bien plus simple.
Il faut une variable globale à la form et abonner tous les éléments click à la même méthode.
Dans cette méthode, si la variable ne contient rien, tu y places l’image de la picture box (sender) et s’il y a une image tu la mets dans la PictureBox (encore sender) et tu vides la variable.
Commenter la réponse de Whismeril
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
Merci à vous deux,

petit souci quand j'essaye de télécharger ta source vb95 :

Access Denied
You don't have permission to access "http://ec.ccm2.net/codes-sourc....
vb95
Messages postés
1730
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
16 décembre 2018
-
bonjour !
Bizarre : chez moi toutes mes sources se téléchargent et même celles des autres membres !
Efferp
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
-
Tu aurais un autre lien de téléchargement sous la main ?
vb95
Messages postés
1730
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
16 décembre 2018
> Efferp
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
-
Voici le code de la Form simplifié
Si besoin ajuste les dimensions de la Form
On dessine les 64 cases pour un jeu
Public Class Form1

    Private Pictjeux As New List(Of PictureBox) ' la collection de Picturebox
    Public IndexCase as Integer ' l'index d'une PictureBox
   
    ' Affichage de la form
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim Pict As PictureBox
        Dim PictLeft As Integer, PictTop As Integer ' coordonnées X et Y pour les cases
        Dim Index As Integer = 0

        ' les 64 cases du jeu
        Pict = Nothing
        PictTop = 58 ' position Y de la première case
        For row = 0 To 7 ' 8 lignes
            PictLeft = 78 ' position X de la première case
            For col = 0 To 7 ' 8 colonnes
                Pict = New Picturebox ' une nouvelle case à déposer
                With Pict
                    .Name = "Pictjeux" & (Index).ToString
                    .BackColor = Color.White
                    .BorderStyle = BorderStyle.FixedSingle
                    .SizeMode = PictureBoxSizeMode.StretchImage
                    .Size = New Size(50, 50)
                    .Location = New Point(PictLeft, PictTop)
                    .Enabled = True
                End With
                Pictjeux.Add(Pict) ' on ajoute la case à la collection
                AddHandler Pict.MouseDown, AddressOf PictMouseDown ' évènement MouseDown pour sélection case
                Controls.Add(Pict) ' on ajoute la case sur la Form
                PictLeft = PictLeft + Pict.Width ' suivante case à droite
                Index = Index + 1
            Next
            PictTop = PictTop + Pict.Height ' case suivante en début de nouvelle  ligne
        Next
        
    End Sub

    ' Sélection d'une case
    Private Sub PictMouseDown(sender As Object, e As MouseEventArgs)

        Dim IndexCase As Integer = Convert.ToInt32((DirectCast(sender, PictureBox).Name).Substring(8)) ' Index case sélectionnée
        ' On met toutes les cases en blanc
        For i = 0 to 63
                Pictjeux(i).BackColor = Color.White
        Next
        ' sauf celle-ci en rouge
        PictJeux(IndexCase).BackColor = Color.Red

     End Sub

End Class
Commenter la réponse de Efferp
Messages postés
5614
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour a tous,

comme ceci a adapter pour 40 PictureBox!

Option Strict On
Public Class Form1
    ' Définition des variables
    Dim CouleurSelectionnee As Image
    Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click
        CouleurSelectionnee = Me.PictureBox1.BackgroundImage
    End Sub
    Private Sub PictureBox_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click, PictureBox3.Click, PictureBox4.Click, PictureBox5.Click, PictureBox6.Click  'a adapter pour 40
        Dim pictTmp As PictureBox = DirectCast(sender, PictureBox)
        For Each ctrl As Control In Me.Controls
            If TypeOf ctrl Is PictureBox Then
                If ctrl.Name = "PictureBox1" Then
                    'rien
                Else
                    ctrl.BackgroundImage = Nothing
                End If
            End If
        Next
        pictTmp.BackgroundImage = CouleurSelectionnee
    End Sub
End Class

Commenter la réponse de cs_Le Pivert
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonsoir

Je n'ai pas testé vos codes.
Mais je n'ai pas l'impression qu'ils répondent à la question.
Il veut cliquer successivement sur 2 pictureBox pour passer l'image de la première vers la 2eme.
Il ne me semble pas lire cela dans vos codes.

Un truc comme ça (pas testé non plus) devrait répondre
    Private imageATransferer As Image = Nothing

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) _
        Handles PictureBox1.Click, PictureBox2.Click, PictureBox3.Click 'etc.... on abonne chaque PictureBox
        Dim picBoxCliquee As PictureBox = DirectCast(sender, PictureBox)

        If imageATransferer Is Nothing Then 'y'a pas d'image sauvegardée
            imageATransferer = picBoxCliquee.Image

        Else 'y'a une image sauvegardée 
            picBoxCliquee.Image = imageATransferer
            imageATransferer = Nothing 'on vide pour le prochain click
        End If
    End Sub



vb95
Messages postés
1730
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
16 décembre 2018
-
Bonsoir Whismeril !
tu as sûrement raison mais il faut aussi dire que la demande n'était pas très claire !

Le code que je lui ai montré ne faisait que gérer 64 Picturebox avec des indices et de savoir quelle est la Picturebox qui a été cliquée !
Ensuite reste plus qu'à définir le code à exécuter à chaque clic !
C'est vrai que je n'ai pas penser aux Handles groupés sur un seul évènement
Commenter la réponse de Whismeril
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
demande pas très claire :'(

je viens de tester vs 2 codes ( Whismeril et LePivert ) et j'ai du louper qqchose car j'ai un message :

La clause Handles requiert une variable WithEvents définie dans le type conteneur ou l'un de ses types de base. (BC30506)

j'ai regardé sur msdn mais je comprends pas grand chose à leurs explications.
Commenter la réponse de Efferp
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
Problème "à priori" résolu.

j'ai enlevé la gestion de l'événement Handles de ma procédure, et j'ai rajouté dans le designer vb la gestion :

AddHandler Me.pictureBox1.Click, AddressOf Me.PictureBoxClick


qui a priori contrairement à la méthode handles est une méthode dynamique qui se créée avec l'initialisation du picturebox ( si j'ai bien compris mais j'en suis même pas sur ? )

cela fonctionne mais cela ne me satisfait pas car je ne comprends pas pourquoi votre façon de faire ne marche pas et que je ne suis pas sur que cette méthode soit la bonne ( je suis pas fan de bidouille, je préfère apprendre en collant au mieux aux règles du codage propre pour pouvoir comprendre ce que j'ai fait si je dois revenir plus tard dessus )

Si vous pouviez
1. me dire si j'ai bien compris la différence handles / AddHandler
2. me dire ce que j'ai loupé dans votre code pour qu'il fonctionne ? (déclaration de withevents à priori ? )
Commenter la réponse de Efferp
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour,

c'est la même chose.

Le Pivert et moi avons abonné la méthode en utilisant le designer graphique (voir ce message https://www.commentcamarche.net/forum/affich-35167871-my-settings-x#2) cela faisant, VS a écrit le AddHandler dans un fichier caché.


Commenter la réponse de Whismeril
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
Bonsoir à tous,

problème à priori résolu, en modifiant moi même le fichier .designer.vb en mode tout à la main.

Par contre,
existe-t-il un moyen de savoir quelle était l'image source car pour mon appli. j'ai besoin de testé si la personne a mis du rouge, du bleu, ... ?

en passant une variable en même temps peut-être mais qui s'affecte à l'image de destination ?
Commenter la réponse de Efferp
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour
en modifiant moi même le fichier .designer.vb en mode tout à la main.


Ça tu ne le refais jamais, si le fichier est caché c'est pas pour rien.
Ce que fais VS doit rester son domaine réservé, si tu modifies un tant soit peu de travers ce fichier, ton projet est mort.

Tu as le droit, c'est parfaitement propre de gérer tes propres Event Handler dans un fichier à toi.
Quand tu utilises un objet sans interface graphique (la très grande majorité des objets entre nous), c'est le seul moyen de s'abonner à un évènement.


existe-t-il un moyen de savoir quelle était l'image source car pour mon appli.....en passant une variable en même temps peut-être mais qui s'affecte à l'image de destination ?

T'as regardé ce que fait mon code au moins?


Commenter la réponse de Whismeril
Messages postés
5614
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Je comprends de moins en moins ce que tu veux faire!

Qu'attends-tu pour ouvrir un nouveau projet pour essayer les codes que nous t'avons proposés pour nous dire celui qui ressemble le plus à ce que tu veux obtenir. Cela nous ferait gagner du temps et nous éviterait de nous disperser, nous sommes des bénévoles!

Commenter la réponse de cs_Le Pivert
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
Bonsoir,

je sais très bien que vous êtes bénévole et c'est pour ça que je vous remercie du temps perdu à cause de moi et de mes soucis de compréhension.

Le code de Whismeril correspond à ce que je veux faire, j'ai juste demandé si en plus de copier l'image il y'avait possibilité de passer une variable Integer en même temps que l'image source. J'ai l'impression de pas être très clair dans ce que je vous demande alors que dans ma tête c'est plutôt compréhensible.

Alors je vais essayer de réexpliquer :

- j'ai 6 images sources et 40 images réception.
- je clique sur une image source, et ensuite sur une des images réception pour coller l'image source.
- je vérifie si l'image source choisie correspond bien a celle demandée par le logiciel et je valide ou pas le passage à la suite.

on pourrait apparenter cela à un puzzle ou l'utilisateur clique sur une pièce décide de la mettre à un endroit et qu'il puisse vérifier ses choix tous les x coups ( avec x = niveau de difficulté ).

c'est pour cela que je pense passer une variable en même temps qui s'affecterait à l'image réception afin que lors du clic sur le bouton de vérification je puisse contrôler toutes les variables et ainsi valider ou pas les choix.

J'espère avoir été plus clair ce coup-ci

Encore merci de votre aide et patience à mon égard.
Commenter la réponse de Efferp
Messages postés
5614
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 décembre 2018
Commenter la réponse de cs_Le Pivert
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour

les sources postées par Le Pivert vont peut-être t'aider.

Cependant, même si ton dernier message est plus détaillé, ça n'est pas encore parfaitement clair.

J'ai l'impression de pas être très clair dans ce que je vous demande alors que dans ma tête c'est plutôt compréhensible.

Ça c'est l'axiome de base de la communication, il y a
  • ce que tu sais
  • ce que tu voudrais en dire
  • ce que tu en dis
  • ce qu'exprime ton langage corporel
  • ce qu'entends l'interlocuteur
  • ce qu'en comprend l'interlocuteur
  • ce que comprend le "décrypteur" corporel de l'interlocuteur
  • l'environnement et le contexte


Par ordinateurs interposés, on s'assoit sur le langage corporel, sur l'environnement et sur la majorité du contexte (même si tu viens d'en donner une description plus détaillée).
Donc être le plus précis possible est un atout pour obtenir une réponse adéquate.
T'es pas le premier a qui à 2 ou 3 répondent des choses différentes, le hasard a voulu que cette fois je sois plus sur ta longueur d'onde que VB ou Le Pivert, mais ça reste un hasard.
D'autre part, il est souvent préférable d'exprimer un besoin plutôt qu'une solution.

Revenons à ton problème

Par contre,
existe-t-il un moyen de savoir quelle était l'image source car pour mon appli. j'ai besoin de testé si la personne a mis du rouge, du bleu, ... ?

en passant une variable en même temps peut-être mais qui s'affecte à l'image de destination ?

Passer par une variable intermédiaire est exactement ce que fait mon code, donc moi je me suis dit que tu te foutais un peu de moi....

j'ai juste demandé si en plus de copier l'image il y'avait possibilité de passer une variable Integer en même temps que l'image source.
et non, t'as pas écrit integer. Et même si tu avais juste ajouté ce mot, je n'aurais pas compris ta demande (bon je ne l'aurais pas mal pris, ce qui aurait déjà été ça...)


c'est pour cela que je pense passer une variable en même temps qui s'affecterait à l'image réception afin que lors du clic sur le bouton de vérification je puisse contrôler toutes les variables et ainsi valider ou pas les choix.
Ça c'est une solution, et en ce qui me concerne, elle ne me parrait pas logique.
Si tu testes dès que le "joueur" choisi l'image, pourquoi le laissait aller plus loin.
Et puis s'il a 40 destinations possibles, je suppose que le choix dépend aussi de la destination donc il faut tester au moment du choix de la position.

    Private imageATransferer As Image = Nothing

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) _
        Handles PictureBox1.Click, PictureBox2.Click, PictureBox3.Click 'etc.... on abonne chaque PictureBox
        Dim picBoxCliquee As PictureBox = DirectCast(sender, PictureBox)

        If imageATransferer Is Nothing Then 'y'a pas d'image sauvegardée
            imageATransferer = picBoxCliquee.Image

        Else 'y'a une image sauvegardée 
            If TestDuChoixSelonTesCritères = True Then
                  picBoxCliquee.Image = imageATransferer
                  imageATransferer = Nothing 'on vide pour le prochain click
            End if
        End If
    End Sub


Le contexte maintenant, ce code ne savait pas qu'il y avait 6 sources et 40 destinations, donc si tu commence par une destination et que tu cliques ensuite par une source, et bien ça va mettre l'image de la destination dans le PictureBox source, ce qui finalement n'est pas souhaitable.

Maintenant que je sais ça, je pense qu'il faut 2 méthodes, une pour les sources et une pour les destinations

    Private imageATransferer As Image = Nothing

    Private Sub PictureSource_Click(sender As Object, e As EventArgs) _
        Handles PictureBox1.Click, PictureBox2.Click, PictureBox3.Click 'etc.... on abonne chaque PictureBox
        Dim picBoxCliquee As PictureBox = DirectCast(sender, PictureBox)
        imageATransferer = picBoxCliquee.Image'on charge l'image quoi qu'il arrive, ça laisse la possibilité au joueur de changer de choix
      End Sub


    Private Sub PictureDestination_Click(sender As Object, e As EventArgs) _
        Handles PictureBox10.Click, PictureBox11.Click, PictureBox12.Click 'etc.... on abonne chaque PictureBox

        If Not (imageATransferer Is Nothing) Then 'y'a une image sauvegardée 
            If TestDuChoixSelonTesCritères = True Then
                  picBoxCliquee.Image = imageATransferer
                  imageATransferer = Nothing 'on vide pour le prochain click
            End if
        End If
    End Sub


Encore une fois, c'est tapé de tête et pas testé.
Whismeril
Messages postés
12410
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 décembre 2018
-
Peut-être qu'il faut mettre
imageATransferer = Nothing
que l'image soit juste ou pas, ça dépend de ton game play.
Commenter la réponse de Whismeril
Messages postés
23
Date d'inscription
jeudi 27 février 2014
Dernière intervention
19 mai 2018
0
Merci
Merci de votre aide.

Je teste ça au plus vite et revient vers vous pour vous dire si j'ai réussi à mettre en place.
Commenter la réponse de Efferp

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.