Bonjour,
Il existe plusieurs façons de traiter l'ensemble du projet (comme tu peux le voir avec les diverses proprositions d'approche).
Le but étant d'apprendre et découvrir, je te propose d'utiliser le contrôle TabControl (et ce malgrès quelques contraintes que nous résolverons) et une classe pour les données (pour étendre les connaissances sur la P.O.O.).
Commençons par la classe, rien de bien sorcier (Form1 est une classe), mais nous allons en créer une qui gérera nos données (pas de partie graphique)
Afin de faire simple pour déjà appréhender cette classe nous mettrons les données séparées (vu qu'elle sont de même type elles auraient pu être regroupées dans une collection, par exemple un dictionnaire)
Notre classe contiendra 3 propriétés pour les réponses utilisateurs et une méthode qui nous donnera le résultat (ainsi nous allons créer un objet qui traitera nos données) (rappel un dictionnaire aurait simplifié, mais commençons simplement)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| Public Class clsReponses
Private Reponse1Value As Integer = 0
Public Property Reponse1() As Integer
Get
Return Reponse1Value
End Get
Set(ByVal value As Integer)
Reponse1Value = value
End Set
End Property
Private Reponse2Value As Integer = 0
Public Property Reponse2() As Integer
Get
Return Reponse2Value
End Get
Set(ByVal value As Integer)
Reponse2Value = value
End Set
End Property
Private Reponse3Value As Integer = 0
Public Property Reponse3() As Integer
Get
Return Reponse3Value
End Get
Set(ByVal value As Integer)
Reponse3Value = value
End Set
End Property
Function Resultat() As Integer
Return Reponse1 + Reponse2 + Reponse3
End Function
End Class |
Dans notre form (ici Form5), nous déclarons une variable de type "clsReponses" Public LesReponses As clsReponses et nous créons une instance de ce type que nous affectons à la variable (c'est la fin de la ligne = New clsReponses.
1 2 3
| Public Class Form5
Public LesReponses As clsReponses = New clsReponses |
Voila un objet qui va nous servir pour travailler
Créer le tabcontrol avec 4 pages dans le designer (qui sont dans une collection)
Ce contrôle est pratique pour regrouper des ensembles que l'on souhaite répartir, mais il a un inconvénient. On ne peut pas utiliser la propriété visible des pages, mais on peut contourner le problème.
Il faut enlever les pages, et les remettre au fur et à mesure des besoins. (attention elle sont placées dans l'ordre d'ajout) (les pages pourraient être enlevées dans une boucle, attention il y a un piège)
sur le load nous enlevons les pages à cacher
1 2 3 4 5
| Private Sub Form5_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
TabControl1.TabPages.Remove(TabPage2)
TabControl1.TabPages.Remove(TabPage3)
TabControl1.TabPages.Remove(TabPage4)
End Sub |
A chaque validation, nous rajouterons la page si elle n'est pas dans la collection, et nous donnerons le focus à cette page. (nous faisons une méthode pour traiter cela)
1 2 3 4
| Sub selectionnePage(page As TabPage)
If Not TabControl1.TabPages.Contains(page) Then TabControl1.TabPages.Add(page) ' ajoute la page si elle n'existe pas
TabControl1.SelectedIndex = TabControl1.TabPages.IndexOf(page) ' donne le focus à cette page
End Sub |
Pour chaque validation, nous notons le résultat de la réponse dans notre classe
1 2 3 4
| Private Sub btnValiderPage1_Click(sender As System.Object, e As System.EventArgs) Handles btnValiderPage1.Click
If rbParis.Checked Then LesReponses.Reponse1 = 1 Else LesReponses.Reponse1 = 0 ' note la reponse
selectionnePage(TabPage2)
End Sub |
idem pour les autres pages.
Quand nous arrivons sur la dernière page, nous affichons le résultat
1 2 3
| Private Sub TabPage4_Enter(sender As System.Object, e As System.EventArgs) Handles TabPage4.Enter
Label1.Text = String.Format("Vous avez {0} bonne(s) réponse(s)", LesReponses.Resultat)
End Sub |
Comme tu peux le voir, tes données sont bien regroupées dans un objet de travail, et indépendantes des saisies et affichage.
________________
Voyons maintenant comment simplifier le code ; utilisons un dictionnaire et factorisons les parties saisies
Notre classe contient une variable de type dictionnaire
A la création le new cré tous les éléments du dico
Nous avons une propriété pour accéder à un élément du dico par sa clé
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| Public Class clsDicoReponses
Private dicoReponse As Dictionary(Of Integer, Integer) ' collection (clé/valeur) pour stocker les valeurs
Private NbRep As Integer = 3
Sub New()
GenereDico()
End Sub
Private Sub GenereDico()
dicoReponse = New Dictionary(Of Integer, Integer)
For i As Integer = 1 To NbRep
dicoReponse.Add(i, 0)
Next
End Sub
''' <summary>Une réponse accessible par sa clé (ici sous forme d'index numérique).</summary>
Public Property Reponse(cle As Integer) As Integer
Get
Return dicoReponse(cle)
End Get
Set(ByVal value As Integer)
dicoReponse(cle) = value
End Set
End Property
Function Resultat() As Integer
Dim Reponse As Integer = 0
' exercice
Return Reponse
End Function
End Class |
Exercice : créer la boucle (For Each) qui parcours la collection des valeurs des éléments du dico (...) afin d'en faire la somme.
Dans la form (création)
1 2
| Public Class Form5
Public DicoReponses As clsDicoReponses = New clsDicoReponses |
La mise à jour des réponses
If rbParis.Checked Then DicoReponses.Reponse(1) = 1 Else DicoReponses.Reponse(1) = 0 ' note la reponse
Mais comme l'on répète cette ligne faire une méthode (Notereponse) qui reçoit en paramètre si la réponse est correcte (boolean) et la page concernée (integer) et met à jour le dico de la classe. (peut aussi être fait dans l'exemple précédant)
Partager