Sélection de 4 boutons avec 2 couleurs différentes + la réponse après 3 secondes

Fermé
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 - Modifié le 17 avril 2019 à 22:58
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 19 avril 2019 à 09:49
Bonjour,

Bonjour,

Je fais un programme avec actuellement 2 question qui amène à 4 propositions dont deux sont valides.

Voici la fonction pour les 4 boutons en même temps.

Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        Dim B As Button = CType(sender, Button)


cette commande permet de mettre les toutes les réponses en vert avec un clique puis avec un second clique des même boutons les remettre à la couleur par défaut.

If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If
End Sub



et concernant la réponse, j'aimerai bien le mettre après un Timer de 3 seconde.


voici la commande concernant la réponse:

'IndiceQuestionActuelle est uune variable globale qui permet à toute portion de code de savoir de quelle question on s'occupe à cet instant.
        ' Dans cette procédure (BResponse_Click), il s'agit de vérifier le bon choix du bouton (A, B, C et D) fait par l'utilisateur pour la question actuellemebt posée.
        ' Bref, il s'agit de savoir s'il a bien répondu à cette paire de questions et d'agir en conséquence (ici, ça se résume à changer la couleur des boutons).

        ' Marquage à l'écran des bonnes réponses faites. Si le bouton cliqué est celui de la bonne réponse, il devient Yellow, sinon il devient Gray
        ' Les boutons qui ne sont pas cliqués restent dans le couleur d'affichage de départ.
        If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Or
            B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
            B.BackColor = Color.Green
        Else
            B.BackColor = Color.Red
        End If

        ' Marquage dans le tableau des questions des bonnes réponses faites : la réponse (A ou B, et C ou D) est remplacée par OK si la réponse a été correcte
        ' Il est alors possible de relire le tableau (à faire ... ) en agissant selon que le RepOK1 vaut "OK" ou non, pour la question primaire
        ' et selon que le RepOK2 vaut "OK" ou non, pour la question secondaire
        Select Case B.Text
            Case "A", "B"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK1 = "OK"
                End If
            Case "C", "D"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK2 = "OK"
                End If
        End Select
End Sub


cela est possible ou pas ?

(PS: Les lignes de commande sont vérifiées et bonnes, il manque juste à mettre un Timer de 3 secondes entre les deux).

Merci de votre compréhension.




Configuration: Windows / Chrome 73.0.3683.103


A voir également:

5 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 avril 2019 à 07:13
Bonjour
Peux tu détailler à quel moment (pour l’utilisateur) tu veut un délai?
0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
Modifié le 18 avril 2019 à 11:44
Bobjour,

voici ce que je souhaitai avoir:



ou la deux deuxième solution



cela dépendra quel est le mieux.

On m'a parler de "la méthode sleep" aussi qu'on peut utiliser mais cependant je ne l'a connais pas.
si vous avez aussi un exemple à me proposer en rapport avec mon programme afin que je comprenne mieux.



Merci de votre compréhension.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 18 avril 2019 à 12:10
Thread.Sleep va figer ton logiciel car tu es dans le thread principal.
Cela pourrait être une solutuion si tu faisais du multithread.

Dans ton cas le timer est plus adapté.
Il faut que tu mettes tout le code à retarder dans le tick du timer.
Il faut aussi que ta variable B soit déclarée dans la classe et plus dans le bouton.

Dans le bouton tu demarres le timer et dans le timer tu l’arrêtes sinon il va répéter le code toutes les 3 secondes.

0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
Modifié le 18 avril 2019 à 12:34
Oui justement, c'est la variable B qui me pose problème, comment la déclarer?

je souhaiterai le mettre sans bouton apparenté
je souhaiterai qu'il se fasse après cela

Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        Dim B As Button = CType(sender, Button)
        If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If
    End Sub



voici ce que j'ai fait:

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 avril 2019 à 16:28
Voila comment déclarer B.

Dim B As Button
Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        B = CType(sender, Button)


Et c’est dans le bouton qu’il faut démarrer le timer.
Pour du code, merci de ne pas mettre de capture, les balises sont là pour ça
0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
18 avril 2019 à 17:23
Bon jour,

Merci pour ce tuyau,

Et concernant les capture c'était pour vous montré les erreur qui sont en rouge et qu'on ne vous pas forcément si je les met sous forme de balise écrite.

cependant j'ai une problème pour affecter une commande à partir du timer voici mon erreur:



Merci beaucoup cordialement.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 18 avril 2019 à 18:40
Sauf que je ne les ai pas vues tes erreurs sur ta capture précédente parce que j'étais sur un téléphone.
Et là que j'en vois une je ne peux pas copier coller pour t'expliquer.
0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
18 avril 2019 à 18:50
Désolé, je ne savais pas que vous êtiez sur téléphone.

Voici le code:

Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        Dim B As Button = CType(sender, Button)
        If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If
        Timer1.Start()
        Timer1.Interval = 2000

    End Sub
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If Timer1.Interval = 2000 Then
            AfficheReponseQuestion()
        End If

    End Sub


    Dim C As Button
    Private Sub AfficheReponseQuestion(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        C = CType(sender, Button)

        'IndiceQuestionActuelle est uune variable globale qui permet à toute portion de code de savoir de quelle question on s'occupe à cet instant.
        ' Dans cette procédure (BResponse_Click), il s'agit de vérifier le bon choix du bouton (A, B, C et D) fait par l'utilisateur pour la question actuellemebt posée.
        ' Bref, il s'agit de savoir s'il a bien répondu à cette paire de questions et d'agir en conséquence (ici, ça se résume à changer la couleur des boutons).
        ' Marquage à l'écran des bonnes réponses faites. Si le bouton cliqué est celui de la bonne réponse, il devient Yellow, sinon il devient Gray
        ' Les boutons qui ne sont pas cliqués restent dans le couleur d'affichage de départ.
        If C.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Or
            C.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
            C.BackColor = Color.Green
        Else
            C.BackColor = Color.Red

        End If
        ' Marquage dans le tableau des questions des bonnes réponses faites : la réponse (A ou B, et C ou D) est remplacée par OK si la réponse a été correcte
        ' Il est alors possible de relire le tableau (à faire ... ) en agissant selon que le RepOK1 vaut "OK" ou non, pour la question primaire
        ' et selon que le RepOK2 vaut "OK" ou non, pour la question secondaire
        Select Case C.Text
            Case "A", "B"
                If C.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK1 = "OK"
                End If
            Case "C", "D"
                If C.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK2 = "OK"
                End If
        End Select

        ' '' Il y a les Label des questions et des réponses : ils peuvent aussi être coloriés ...
        'LQuestion1.BackColor ...   et ForeColor aussi ...
        'LResponseA.BackColor ...
        'LResponseB.BackColor ...
        'LQuestion2.BackColor ...
        'LResponseC.BackColor ...
        'LResponseD.BackColor ..
        Timer1.Stop()

    End Sub
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 avril 2019 à 18:57
Alors cette méthode
Private Sub AfficheReponseQuestion(ByVal sender As System.Object, ByVal e As System.EventArgs)
demande en paramètre un object et un System.EventArgs

et là
        If Timer1.Interval = 2000 Then
            AfficheReponseQuestion()
        End If

tu ne luis fournis pas. En passant, je pense que le if ne sert à rien.

Avant d'aller plus loin, pourquoi avoir abonner 2 méthodes au click de tes boutons?
Ce que ça fait faire c'est:
  • appeler simultanément BResponse_Click et AfficheReponseQuestion
  • au bout de 2 secondes appeler une 2eme fois AfficheReponseQuestion



0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
Modifié le 18 avril 2019 à 20:08
oui j'avais pensez aussi de le faire mais je ne trouve pas le moyen de le faire.

Le premier met les couleur de section en vert:

Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        Dim B As Button = CType(sender, Button)
        If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If
       

    End Sub



et le deuxième met les couleur pour signaler la bonne réponse ou pas.

Timer1.Start()
        Timer1.Interval = 2000

        'IndiceQuestionActuelle est uune variable globale qui permet à toute portion de code de savoir de quelle question on s'occupe à cet instant.
        ' Dans cette procédure (BResponse_Click), il s'agit de vérifier le bon choix du bouton (A, B, C et D) fait par l'utilisateur pour la question actuellemebt posée.
        ' Bref, il s'agit de savoir s'il a bien répondu à cette paire de questions et d'agir en conséquence (ici, ça se résume à changer la couleur des boutons).
        ' Marquage à l'écran des bonnes réponses faites. Si le bouton cliqué est celui de la bonne réponse, il devient Yellow, sinon il devient Gray
        ' Les boutons qui ne sont pas cliqués restent dans le couleur d'affichage de départ.
        If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Or
            B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
            B.BackColor = Color.Green
        Else
            B.BackColor = Color.Red

        End If
        ' Marquage dans le tableau des questions des bonnes réponses faites : la réponse (A ou B, et C ou D) est remplacée par OK si la réponse a été correcte
        ' Il est alors possible de relire le tableau (à faire ... ) en agissant selon que le RepOK1 vaut "OK" ou non, pour la question primaire
        ' et selon que le RepOK2 vaut "OK" ou non, pour la question secondaire
        Select Case B.Text
            Case "A", "B"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK1 = "OK"
                End If
            Case "C", "D"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK2 = "OK"
                End If
        End Select

        ' '' Il y a les Label des questions et des réponses : ils peuvent aussi être coloriés ...
        'LQuestion1.BackColor ...   et ForeColor aussi ...
        'LResponseA.BackColor ...
        'LResponseB.BackColor ...
        'LQuestion2.BackColor ...
        'LResponseC.BackColor ...
        'LResponseD.BackColor ..
        Timer1.Stop()



après au bout de 2 secondes je n'arrive pas à trouver un lien qui les relie sur si je met dans le même bouton.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 avril 2019 à 19:41
Sauf que là en abonnant les 2 méthodes au click des boutons elles vont s’exécuter « en même temps » ça va se jouer à quelques millisecondes et le résultat sera incertain.

Donc je te répète ma question pourquoi tu as fait ça? Dans un but précis ou au petit bonheur la chance?
0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
18 avril 2019 à 20:06
Différencier les actions était pour moi la méthode la plus simple qu'associer les codes dans le même boutons (même fonction).

voici le code entier:

Private Sub BResponse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BResponseA.Click, BResponseB.Click, BResponseC.Click, BResponseD.Click
        Dim B As Button = CType(sender, Button)
        If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If

        Timer1.Start()
        Timer1.Interval = 2000

        'IndiceQuestionActuelle est uune variable globale qui permet à toute portion de code de savoir de quelle question on s'occupe à cet instant.
        ' Dans cette procédure (BResponse_Click), il s'agit de vérifier le bon choix du bouton (A, B, C et D) fait par l'utilisateur pour la question actuellemebt posée.
        ' Bref, il s'agit de savoir s'il a bien répondu à cette paire de questions et d'agir en conséquence (ici, ça se résume à changer la couleur des boutons).
        ' Marquage à l'écran des bonnes réponses faites. Si le bouton cliqué est celui de la bonne réponse, il devient Yellow, sinon il devient Gray
        ' Les boutons qui ne sont pas cliqués restent dans le couleur d'affichage de départ.
        If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Or
            B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
            B.BackColor = Color.Green
        Else
            B.BackColor = Color.Red

        End If
        ' Marquage dans le tableau des questions des bonnes réponses faites : la réponse (A ou B, et C ou D) est remplacée par OK si la réponse a été correcte
        ' Il est alors possible de relire le tableau (à faire ... ) en agissant selon que le RepOK1 vaut "OK" ou non, pour la question primaire
        ' et selon que le RepOK2 vaut "OK" ou non, pour la question secondaire
        Select Case B.Text
            Case "A", "B"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK1 = "OK"
                End If
            Case "C", "D"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK2 = "OK"
                End If
        End Select

        ' '' Il y a les Label des questions et des réponses : ils peuvent aussi être coloriés ...
        'LQuestion1.BackColor ...   et ForeColor aussi ...
        'LResponseA.BackColor ...
        'LResponseB.BackColor ...
        'LQuestion2.BackColor ...
        'LResponseC.BackColor ...
        'LResponseD.BackColor ..
        Timer1.Stop()
    End Sub




Par contre il va directement à ce code là.

 'IndiceQuestionActuelle est uune variable globale qui permet à toute portion de code de savoir de quelle question on s'occupe à cet instant.
        ' Dans cette procédure (BResponse_Click), il s'agit de vérifier le bon choix du bouton (A, B, C et D) fait par l'utilisateur pour la question actuellemebt posée.
        ' Bref, il s'agit de savoir s'il a bien répondu à cette paire de questions et d'agir en conséquence (ici, ça se résume à changer la couleur des boutons).
        ' Marquage à l'écran des bonnes réponses faites. Si le bouton cliqué est celui de la bonne réponse, il devient Yellow, sinon il devient Gray
        ' Les boutons qui ne sont pas cliqués restent dans le couleur d'affichage de départ.
        If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Or
            B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
            B.BackColor = Color.Green
        Else
            B.BackColor = Color.Red

        End If
        ' Marquage dans le tableau des questions des bonnes réponses faites : la réponse (A ou B, et C ou D) est remplacée par OK si la réponse a été correcte
        ' Il est alors possible de relire le tableau (à faire ... ) en agissant selon que le RepOK1 vaut "OK" ou non, pour la question primaire
        ' et selon que le RepOK2 vaut "OK" ou non, pour la question secondaire
        Select Case B.Text
            Case "A", "B"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK1 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK1 = "OK"
                End If
            Case "C", "D"
                If B.Text = TableauDesQuestions(IndiceQuestionActuelle).RepOK2 Then
                    TableauDesQuestions(IndiceQuestionActuelle).RepOK2 = "OK"
                End If
        End Select

        ' '' Il y a les Label des questions et des réponses : ils peuvent aussi être coloriés ...
        'LQuestion1.BackColor ...   et ForeColor aussi ...
        'LResponseA.BackColor ...
        'LResponseB.BackColor ...
        'LQuestion2.BackColor ...
        'LResponseC.BackColor ...
        'LResponseD.BackColor ..
        Timer1.Stop()
    End Sub


sans passer par ce code là.

 Dim B As Button = CType(sender, Button)
        If B.ForeColor = Color.White And B.BackColor = Color.Green Then
            B.ForeColor = Color.Black
            B.BackColor = Color.Transparent
        Else
            B.ForeColor = Color.White
            B.BackColor = Color.Green
        End If
       


c'est pour cela que je voulais placer un Timer de 2 sec pour bien différencier les action (test).
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 18 avril 2019 à 20:20
Par contre il va directement à ce code là.
...
sans passer par ce code là.


Alors je répète, encore une fois, ces 2 codes sont exécutés quasiment simultanément parce que tu les as abonnés tous les 2 au même événement. Et donc le résultat final dépend de qui est exécuté en premier et qui écrase le résultat précédent puisque exécuter quelques millisecondes après.
0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
Modifié le 18 avril 2019 à 20:49
donc je dois le mettre dans deux éventements différent? et mettre le timer dans ma première événement ?

et que je dois mettre cette commande là dans le deuxième événement:

Dim B As Button
Private Sub AfficheReponseQuestion(ByVal sender As System.Object, ByVal e As System.EventArgs)
B = CType(sender, Button)
0

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

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 avril 2019 à 23:41
En gros on en est là parce que
  • tu poses une question sur un forum, au message 3 après un petit éclaircissement je te propose une solution et toi, pour une raison qui m’échappe, tu fais totalement autre chose.
  • les 12 messages qui suivent sont un dialogue de sourd entee moi qui te demande pourquoi tu n’as pas essayé ce que je t’ai proposé et t’explique que ce tu as écrit n’est pas cohérent et toi qui démontre que tu n’as pas tout compris aux bases de vb.


Je te propose donc deux choses et je m’arreterai ici:
  • relis le message 3, et essaye
  • laisse ton projet de côté quelques jours, le temps d’apprendre les bases de vb, par exemple avec le coirs de plassere https://plasserre.developpez.com/cours/vb-net/ il ne fera pas de toi une codeuse hors pair, ça il n’y a que le temps et la persévérance qui t’y mèneront, mais il comblera quelques trous dans tes fondations

0
yannel777 Messages postés 129 Date d'inscription lundi 4 mai 2009 Statut Membre Dernière intervention 24 janvier 2023 35
19 avril 2019 à 02:33
Oui, vous avez raison, je vais suive vos conseil :) en apprenant d'avantage :)
désolé d'avoir fait perdre votre temps.

cordialement.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
19 avril 2019 à 09:49
C’est toi qui perd du temps, ce n’est pas sur un forum qu’on va t’expliquer de a à z le fonctionnement des événements.
Il y a des cours pour ça.
0