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 Form1

Inherits 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 Double

Dim somme As Double

Dim resultat As Double

somme = Val(e)

resultat = Arrondir(somme * 6.55957)

Return resultat

End Function

 

Public 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 Module

A 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.