logo UsualSoft   Skip Navigation Links
Accueil
Références
Tutoriels
Formations
Liens téléchargements

Contact : cgruchet@usualsoft.fr - Tél: 02 38 34 99 88 / 06 22 82 90 55
Microsoft Certified Professional
Cours : Visual-Basic

Interface utilisateur 

TD : Formulaires et contrôles

Claude Gruchet
Initiation TD1-P4

Retour Début du TD1

TD : Mise en oeuvre des formulaires et contrôles (4)

Télécharger le début du projet

Prévu pour se décompacter dans "C:\Mes documents\PForms"

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.

 

Télécharger le projet

Prévu pour se décompacter dans "C:\Mes documents\PForms"

Suite du TD ...Filtrage des saisies.


Retour Début du TD1