Site: | Cours VB.net |
E 3.1 | Exercice:ConversionF/E. |
Comment créer un programme de conversion Francs=>Euros et Euros=> Francs ?
Voici l'interface utilisateur:
Euros
2 |
Francs:
13.12 |
Il y a une zone de saisie Euros, une zone Francs, si je tape dans la zone Euros '2' il s'affiche '13.12' dans la zone Francs; cela fonctionne aussi dans le sens Francs=>Euros.
Conseils:
Un formulaire affichera les zones de saisie, un module standard contiendra les procédures de conversion.
On crée un formulaire Form1 contenant :
2 TextBox BoiteF et BoiteE, leurs propriétés Text=""
2 labels dont la propriété Text sera ="Euros" et "Francs", on les positionnera comme ci-dessus.
Un module Module1 contiendra 2 routines ConversionFE ConversionEF
Réponse en bas:
Dans le formulaire, je dimensionne un flag (ou drapeau): flagAffiche, il sera donc visible dans la totalité du formulaire. Je l'initialise à True.
Public
Class Form1Inherits System.Windows.Forms.Form
Dim flagAffiche As Boolean = True
Comme la conversion doit se déclencher automatiquement lorsque le texte de BoiteF ou BoiteE change, j'utilise les évènements 'TextChanged' de ces TextBox:
Pour la conversion Euros=>Francs, dans la procédure TextChanged de BoiteE, je récupère le texte tapé (BoiteE.Text), j'appelle la fonction ConversionEF en lui envoyant comme paramètre ce texte. La fonction me retourne un double que je transforme en string et que j'affiche dans l'autre TextBox(BoiteF).
Private Sub BoiteE_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoiteE.TextChanged
If flagAffiche = True Then
flagAffiche = False
BoiteF.Text = (ConversionEF(BoiteE.Text)).ToString
flagAffiche = True
End If
End Sub
Idem pour l'autre TextBox:
Private Sub BoiteF_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BoiteF.TextChanged
If flagAffiche = True Then
flagAffiche = False
BoiteE.Text = (ConversionFE(BoiteF.Text)).ToString
flagAffiche = True
End If
End Sub
End Class
A quoi sert le flag : flagAffiche?
A éviter une boucle sans fin: sans flag, BoiteF_TextChanged modifie BoiteE_Text qui déclenche BoiteE_TextChanged qui modifie BoiteF_Text qui déclenche BoiteF_TextChanged.....
Avec le flag, quand je vais modifier la propriété Text d'une TextBox, le met le flag à False, cela indique à l'autre évènement TextChanged de ne pas lui aussi convertir et afficher.
Enfin il faut écrire les procédures qui font la conversion: ConversionEF et ConversionFE dans un module standard. Ces procédures 'Function' appellent elles mêmes une autre fonction qui arrondi les résultats à 2 décimales.
Pour transformer des Euros en Francs, je les multiplie par 6.55957 puis j'arrondis .
On remarque que ces procédures reçoivent une string en paramètres et retourne un double.
Module
Module1 Public Function ConversionEF(ByVal e As String) As DoubleDim somme As Double Dim resultat As Double
somme = Val(e)
resultat = Arrondir(somme * 6.55957)
Return resultat End FunctionPublic Function ConversionFE(ByVal e As String) As Double
Dim somme As Double Dim resultat As Double
somme = Val(e)
resultat = Arrondir(somme / 6.55957)
Return resultat End Function
Enfin la Function Arrondir arrondit à 2 décimales: pour cela on multiplie par 100, on arrondit à l'entier avec Round puis on divise par 100.
Public Function Arrondir(ByVal Valeur As Double) As Double 'arrondi a 2 chiffres après la virgule
Return (Math.Round(Valeur * 100)) / 100 End Function
End
ModuleA noter que l'on aurait pu utiliser une surcharge de Round qui arrondit directement à 2 décimales:
Return
(Math.Round(Valeur, 2))Exercice:
Quel code mettre dans la procédure Button_Click d'un bouton nommé 'Remise à zéro' qui met les 2 zones de saisie à zéro?
(Penser au flag)
Amélioration:
Si l'utilisateur tape une virgule il y a problème car la fonction Val utilisée pour convertir le nombre saisi en numérique reconnaît uniquement le point, il faut donc transformer les virgules en points avec
e = Replace(e, ",", ".")
On peut tester si l'utilisateur a bien tapé un nombre, avec la fonction IsNumeric.