TD : Mise en oeuvre des formulaires et contrôles
(4)
Les contrôles (suite)
Nous allons réaliser, tout de suite, une première version du
code source nécessaire pour calculer le résultat et l'afficher. Nous verrons
ensuite quels sont les inconvénients de cette méthode et comment y remédier
...
Pour déclencher le calcul, l'utilisateur cliquera sur le bouton
"Calculer". C'est donc dans l'événement Click() de ce
contrôle qu'il faudra implémenter notre code source. Il s'agira de tester quel
a été le choix de l'utilisateur quand à l'opération a effectuer. Nous
réaliserons cela en testant la propriété "Value" de chacun
des boutons d'option grâce à une structure If ... then ... elseif ...
then ... endif.
Nous allons créer une procédure privée "DoCalc" qui
réalisera le calcul et affichera le résultat dans le label prévu à cet
effet. Puis, nous appellerons cette procédure depuis la procédure
événementielle "Private Sub cmdCalc_Click()".
Entrez le code suivant dans le module du formulaire frmCalc :
|
'------------------------------------------------------------
Private Sub DoCalc()
'------------------------------------------------------------
' Calcule et affiche le résultat de l'opération sélectionnée
'------------------------------------------------------------
' Gestion des erreurs dans le contexte
On Error Resume Next
' Utilisation d'un test elseif
If Me.optPlus Then
lblRes = Me.txtC1 + txtC2
ElseIf Me.optMoins Then
lblRes = txtC1 - txtC2
ElseIf Me.optMult Then
lblRes = txtC1 * txtC2
ElseIf Me.optDiv Then
lblRes = txtC1 / txtC2
Else
MsgBox "Sélectionnez une opération", _
vbInformation, _
"Calculatrice"
End If
' Gestion des erreurs potentielles
If Err.Number <> 0 Then
MsgBox Err.descrition, vbCritical, "Sub DoCalc"
Err.Clear
End If
End Sub
'-----------------------------------
Private Sub cmdCalc_Click()
'-----------------------------------
' Appel de la procédure réalisant le calcul
' et l'affichage du résultat
'-----------------------------------
DoCalc
End Sub
|
 |
Notez 2 choses :
- l'utilisation de "On Error Resume Next"
pour pouvoir garder la main en cas d'erreur d'exécution et, donc être capable
de la traiter sans "planter" le programme (nous étudierons cela
plus en détail un peu plus loin).
- l'utilisation du caractère de soulignement
"_" pour pouvoir saisir une instruction VB sur plusieurs lignes (dans
notre exemple c'est la cas du premier appel à MsgBox)
|
Enregistrez votre travail puis, lancez le programme
(Ctrl-F5) après avoir corrigé les éventuelles erreurs de syntaxe que la
commande Ctrl-F5 va détecter pour vous.
Vous pouvez appeler la calculatrice et lancer des opérations.
Toutefois vous allez constater quelques disfonctionnements ! ... Rassurez
vous, c'est "normal". Le code que nous avons écrit pour le moment ne
représente qu'un squelette (reconnaissons qu'il y en a très peu !) ...
Certains points restent à corriger pour un fonctionnement correct
mais d'autres (beaucoup plus nombreux) sont à ajouter pour donner à
notre programme toute la convivialité que l'utilisateur peut souhaiter.
L'erreur la plus flagrante est ce qui se
passe lorsque vous faites une addition : le programme concatène
les caractères au lieu de réaliser une addition. C'est à dire que 2 +
3 donnent "23" au lieu de 5 !!!
Ceci est du au fait que l'opérateur "+" est un
opérateur polymorphe. Cela veut dire qu'il est capable de traiter
plusieurs types de données et qu'il peut réagir différemment en fonction du
type utilisé. En effet l'opérateur "+" utilisé avec des opérandes
numériques réalise une addition mais s'il est utilisé avec des opérateurs
alphanumériques, il réalise une concaténation ainsi "A" +
"B" = "AB".
Les autres opérateurs ne sont, eux, pas polymorphes, ils ne
fonctionnent qu'avec des opérandes numériques (ou convertibles en numérique).
Dans la version actuelle de notre code source, nous utilisons
les opérateurs avec des opérandes alphanumériques : le contenu de nos
zones de texte (TextBox). C'est la propriété par défaut (c'est pourquoi nous
ne sommes pas obligés de l'indiquer) du contrôle TextBox, la propriété
"Text" (MaTextBox.Text) qui contient sa valeur. Cette
propriété (comme son nom le laisse à penser) est de type alphanumérique. en
fait nous ne faisons pas :
2 + 3
mais
"2" + "3"
C'est pourquoi le résultat affiché est "23". Pour corriger cela, il
va nous falloir
convertir nos
opérandes et tout va rentrer dans
l'ordre.
Mais, une petite remarque s'impose : si le problème vient du type des
opérandes et que les opérateurs autres que le "+" ne sont pas
polymorphes, comment se fait-il qu'ils fonctionnent ?
C'est tout simplement parce que Visual-basic 6 est capable de convertir
automatiquement les opérandes alphanumériques en opérandes numériques
avant de réaliser l'opération. Nos zones de texte ne contenant que des chiffres
(si on a fait attention à ce qu'on a saisi, nous verrons plus loin comment
filtrer les saisies), elles sont aisées à convertir en opérandes numériques.
Cela s'appelle le transtypage automatique.
VB réalisera d'ailleurs un autre transtypage automatique au moment de
l'affichage. En effet, la propriété "Caption" (propriété
par défaut) d'un contrôle "Label" est une propriété de type texte
(alphanumérique) . Il faut donc convertir le résultat numérique obtenu
en chaîne de caractères pour l'afficher. Vous pouvez remarquer que VB fait ça
automatiquement, nous n'avons écrit aucun code de conversion !
En fait, Visual-basic est un langage très permissif pour ce qui est des
types de données. En cela, il est très différent des langages tels que C++ ou
Pascal qui sont fortement typés.
Nous allons donc gérer des variables locales de type numérique (double)
pour réaliser nos calculs. Si vous n'êtes pas familier avec ces notions
n'hésitez pas à relire la page sur la déclaration
et l'utilisation des constantes et variables avant de continuer.
Modifiez votre code source comme suit, notez l'utilisation de deux variables
locales de type "double". Le contenu des zones de texte est
convertit dans les variables grâce à la fonction CDbl(). Le
résultat numérique est, ensuite, convertit de nouveau en chaîne à
l'aide de la fonction CStr().
|
'------------------------------------------------------------
Private Sub DoCalc()
'------------------------------------------------------------
' Calcule et affiche le résultat de l'opération sélectionnée
'------------------------------------------------------------
Dim ldbl1 As Double
Dim ldbl2 As Double
' Gestion des erreurs dans le contexte
On Error Resume Next
ldbl1 = CDbl(Me.txtC1)
ldbl2 = CDbl(Me.txtC2)
' Utilisation d'un test elseif
If Me!optPlus Then
lblRes = CStr(ldbl1 + ldbl2)
ElseIf Me!optMoins Then
lblRes = CStr(ldbl1 - ldbl2)
ElseIf Me!optMult Then
lblRes = CStr(ldbl1 * ldbl2)
ElseIf Me!optDiv Then
lblRes = CStr(ldbl1 / ldbl2)
Else
MsgBox "Sélectionnez une opération", _
vbInformation, _
"Calculatrice"
End If
' Gestion des erreurs potentielles
If Err.Number <> 0
Then
MsgBox Err.descrition, vbCritical, "Sub DoCalc"
Err.Clear
End If
End Sub
|
Si vous avez compris à quel point peut être important le type des données
traitées dans un programme, alors le but de cette partie du TD est atteint !
Mais ... que se passe t-il si l'utilisateur saisit autre chose que des
chiffres ? ... Nous allons voir ça dans la page suivante de ce TD.