Afficher un nombre "en cristaux liquides"

Mode d'emploi
Le code
Explications

Mode d'emploi - Exemple

La procédure "digit" permet d'afficher dans une zone d'image un nombre en forme d'afficheur à cristaux liquides. Le cristal liquide remplit toute la zone d'image; ainsi, dans votre feuille Visual Basic, il devra y avoir une zone d'image pour chaque afficheur voulu.

Pour afficher un afficheur, il faut taper :

Call Digit(Image, Valeur$, NbDigit%, coulallum!, couleteint!, coulfonds!)

La procédure "Digit" admet de nombreux paramétres, dont nous allons préciser le rôle.

Image Nom du contrôle graphique dans lequel sera dessiné l'afficheur.
Attention ! Le cotnrôle image utilisé doit avoir sa propriété "autoredraw" égale à "true".

Valeur$ Chaîne contenant le "nombre" à afficher.
Le "nombre" Valeur$ peut contenir les caractères suivants : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, H, -, ainsi que l'ESPACE et le POINT.

NbDigit% Nombre de "digits" (= caractères) de l'afficheur.
Si le nombre de caractères contenus dans Valeur$ est supérieur à NbDigit%, seul les NbDigit% premiers caractères de Valeur$ sont affichés. Si le nombre de caractères contenus dans Valeur$ est inférieur à NbDigit%, l'expression Valeur$ est complétée à droite par des "0" pour faire la bonne taille. Ainsi, Si Valeur$="123" avec NbDigit%=5, la chaîne Valeur$ sera complétée pour devenir "12300".

Remarques :
  • Si vous donnez la valeur "0" à NbDigit%, la valeur de NbDigit% s'ajustera au nombre de caractères de Valeur$
  • Le point ne compte pas comme caractère, l'expression "9.32" fait 3 digits et non 4
  • Il ne peut y avoir qu'un seul point dans une expressions affichée. Si vous en mettez plusieurs, seul le premier sera pris en compte
  • Les caractères affichées après le point le sont avec une hauteur plus petite (le point n'étant pas très visible de loin, cela permet de ne pas confondre les décimales avec des chiffres normaux)
coulallum! Couleur des segements allumés.

couleteint! Couleur des segements éteints.

coulfonds! Couleur du fonds de l'afficheur.

Exemple d'utilisation :
  ' Un premier afficheur avec tout les caractères :
  Dim Valeur$
  Dim NbDigit%
  Dim coulallum!, couleteint!, coulfonds!
  Valeur$ = "ABCDEFH -1234567890.123ABC"
  NbDigit% = 25
  coulallum! = 65280
  couleteint! = 25600
  coulfonds! = 0
  Call Digit(Image1, Valeur$, NbDigit%, coulallum!,
couleteint!, coulfonds!)
  '
  ' Un second afficheur :
  Call Digit(Image2, "89.56", 7, 65535, 25700, 0)
  ' Une montre à quartz :
  Call Digit(Image3, "18h30.55", 7, 0, &HE0E0E0,
&HF0F0F0)
On obtient le résultat suivant :

On obtient un afficheur dans chaque zone d'image

Le code


Explications

Dans un premier temps, on traite la chaîne Valeur$. Notemments, on élimine les points "." et on repère la position du premier. En effet, par la suite, la chaîne Valeur$ est parcourue caractère par caractère pour être affichée, donc il faut éliminer le point car le point ne prends pas la place d'un caractère. Mais il faut noter la position du point dans la chaîne, que l'on stocke dans la variable DigitPoint.
Ainsi, la chaîne "19.536" devient "19536" et DigitPoint = 3.
Pour connaître la position du point, on utilise la fonction Instr(Valeur$,".") qui retourne un entier contenant la positon du premier "." dans Valeur$.
Ensuite, pour éliminer les points contenus dans Valeur$, on utilise le petit bout de code suivant :
DigitDummy = ""
For i = 1 To Len(Valeur$)
    If Mid$(Valeur$, i, 1) <> "." Then
        DigitDummy = DigitDummy + Mid$(Valeur$, i, 1)
    End If
Next i
Valeur$ = DigitDummy
Le principe est de copier caractères à caractères la chaîne Valeur$ dans la chaîne DigitDummy, sauf quand on tombre sur des points ".". On y arrive grace à la fonction Mid$(Valeur$, i, 1) qui retourne le "i"éme caractére de la chaîne Valeur$.

Une fois ceci fait, comme je vous l'ai dit plus haut, l'afficheur remplit toute la zone d'image. Alors, il faut prendre connaissance des dimensions de la zone d'image (grâce aux propriétés "width" et "height"), puis, connaissant NbDigit%, calculer et stocker les dimensions de chaque chiffre.

Enfin, on parcour à nouveau la chaîne Valeur$ grace à la fonction Mid$, et on effectue un test sur chaque caractère comme ceci :
Select Case Digitch
Case "-"
    instructions pour -
Case "0"
    instructions pour 0
Case "1"
    instructions pour 1
...
...
Case "h"
    instructions pour h
End Select
La commande "Select Case ... Case ... End Select" du Visual Basic est très pratique. Voilà ce qu'il se passe avec l'exemple ci-dessus :
Si Digitch est égal à "-", c'est "instructions pour -" qui est executé.
Si Digitch est égal à "0", c'est "instructions pour 0" qui est executé.
ect ...
De plus, si on peut rajouter un "Case else"; alors, ce qu'il y a en dessous de ce "case else" sera executé si aucun autre des cas précédents ne corresponds.