Créer Boucle for qui next a chaque click d'un bouton

fox97 Messages postés 4 Date d'inscription mercredi 16 septembre 2015 Statut Membre Dernière intervention 14 juillet 2016 - Modifié par fox97 le 14/07/2016 à 00:56
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 14 juil. 2016 à 13:11
Bonjour,
Je suis présentement en train de coder un petit programme qui affiche un total de 10 images aléatoirement. Chaque image est affiché une fois. J'aimerais pouvoir faire en sorte que lorsque un autre bouton continuer est appuyé, ma boucle "for i = 0 to 9 " fait une pause jusqu'à ce que le bouton continuer soit appuyé, ce qui lui ferait un "next". Le bouton devra etre appuyé 10 fois afin d'afficher l'ensemble des images. Voici mon code.

Public Class frmChoix
    Dim Random As Integer
    Dim n(9) As Boolean
    Dim i As Integer = 0

    Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click
        frmMenu.Show()
        Me.Hide()
    End Sub

    Sub btnAccepter_Click(sender As Object, e As EventArgs) Handles btnAccepter.Click

        For lCnt As Integer = 0 To n.Length - 1
            n(lCnt) = False
        Next lCnt


        Randomize()
        For i = 0 To 9
Start:
            Random = (Rnd() * 9) + 1


            If Not n(Random - 1) Then

                If Random = 1 Then
                    PictureBox1.Image = My.Resources.bergerallemand1
                    n(Random - 1) = True

                ElseIf Random = 2 Then
                    PictureBox1.Image = My.Resources.bergerallemand2
                    n(Random - 1) = True

                ElseIf Random = 3 Then
                    PictureBox1.Image = My.Resources.dingo1
                    n(Random - 1) = True

                ElseIf Random = 4 Then
                    PictureBox1.Image = My.Resources.dingo2
                    n(Random - 1) = True

                ElseIf Random = 5 Then
                    PictureBox1.Image = My.Resources.husky1
                    n(Random - 1) = True

                ElseIf Random = 6 Then
                    PictureBox1.Image = My.Resources.husky2
                    n(Random - 1) = True

                ElseIf Random = 7 Then
                    PictureBox1.Image = My.Resources.wolf1
                    n(Random - 1) = True

                ElseIf Random = 8 Then
                    PictureBox1.Image = My.Resources.loup2
                    n(Random - 1) = True

                ElseIf Random = 9 Then
                    PictureBox1.Image = My.Resources.fox1
                    n(Random - 1) = True

                ElseIf Random = 10 Then
                    PictureBox1.Image = My.Resources.renard2
                    n(Random - 1) = True
                End If
            Else
                GoTo Start
            End If
        Next

    End Sub

End Class

1 réponse

cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
14 juil. 2016 à 09:01
Bonjour,

pour moi il y a deux problèmes dans ton code.

1. les labels sont déconseillés depuis le début du vb (même vb6)
et compliquent ta logique.

2. ton random (si tu n'as vraiment pas de chance) pourrait tu faire boucler longtemps pour obtenir tous les élements placés.

Pour moi tu dois te servir de l'evenement Click uniquement pour changer d'image et préparer une liste d'images à afficher.

voici un exemple que j'ai écris, il y a moyen de l'améliorer mais bon. si tu as des questions n'hésites pas.

Public Class Form1

    Dim listImg As List(Of Integer)         'liste qui contiendra l'ordre des images a afficher
    Dim currentImg As Integer = 0

    Private Sub initList()
        listImg = New List(Of Integer)
        Dim listPossible As New List(Of Integer)    'les images possible au départ
        For index = 0 To 9
            listPossible.Add(index)
        Next

        Dim Random As Integer
        Randomize()

        For i = 9 To 1 Step -1
            Random = Rnd() * i                  'on choisi parmi les i images restant dispo   
            listImg.Add(listPossible(Random))   'on ajoute celle choisie 
            listPossible.RemoveAt(Random)       'on la retire de la liste disponible
        Next
        listImg.Add(listPossible(0))       'après 9 iteration il n'en reste qu'une donc plus de random et on ajoute la derniere
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If currentImg < 0 Or currentImg > 9 Then
            Exit Sub
        End If
        Select Case listImg(currentImg)
            Case Is = 0
                PictureBox1.Image = My.Resources.bergerallemand1
            Case Is = 1
                PictureBox1.Image = My.Resources.bergerallemand2
            Case Is = 2
                PictureBox1.Image = My.Resources.dingo1
            Case Is = 3
                PictureBox1.Image = My.Resources.dingo2
            Case Is = 4
                PictureBox1.Image = My.Resources.husky1
            Case Is = 5
                PictureBox1.Image = My.Resources.husky2
            Case Is = 6
                PictureBox1.Image = My.Resources.wolf1
            Case Is = 7
                PictureBox1.Image = My.Resources.loup2
            Case Is = 8
                PictureBox1.Image = My.Resources.fox1
            Case Is = 9
                PictureBox1.Image = My.Resources.renard2
        End Select
        currentImg = currentImg + 1
    End Sub

    Public Sub New()

        ' Cet appel est requis par le concepteur.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        initList()  'on initialise l'ordre
    End Sub
End Class


bonne journée
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
14 juil. 2016 à 11:30
Bonjour

une petite précision, quand cgandco parle de Label, il ne s'agit pas du contrôle, mais de "l'ancre" associée à une instruction Goto.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024
14 juil. 2016 à 12:35
Bonjour,
Je viens conforter la remarque de Whismeril, que je salue.
- un label est un contrôle d'affichage (une étiquette)
- une instruction Goto ne renvoie ni à un Label, ni à une "étiquette", mais à une ligne spécifiée de code.
Il est vrai que VB dénonce l'absence d'un "label" (en Anglais) ou d'étiquette (en français) pour un Goto X alors que X n'est pas une ligne spécifiée de code. Mais tout cela n'est que le résultat d'une certaine pauvreté de la lanque de Shakespeare. VB a choisi le mot "label". Il aurait aussi bien pu choisir "flag" (drapeau) , "line" (ligne), etc ...
En Français, X (dans goto X) n'est pas une "étiquette", mais une "étiquette de ligne".
Voilà ...
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656 > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
14 juil. 2016 à 12:55
Bonjour aussi
0
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9 > Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024
14 juil. 2016 à 13:05
Bonjour,

Vu que l'on ne doit pas les utiliser, autant ne pas les nommer.

Bonne journée.
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656 > cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017
14 juil. 2016 à 13:11
Non, de la façon dont tu l'as formulé, on peut confondre avec le contrôle, d'ou mon intervention.
La précision d'Uc est bonne dans le sens ou l'expression "étiquette de ligne" est sans ambiguité.
0
Rejoignez-nous