.
Présentation
Dans la même veine (la même inutilité ?) que la précédente (que je vous invite à relire tant elles se ressemblent), voici toujours sous Word, et avec des Segments, une Horloge ..Numérique, aussi appelée "7 Segments".
Si vous êtes pressé(e)s de la voir à l'oeuvre, vous pouvez commencer par l'intégrer à un nouveau document, et vous préoccuper des explications ultérieurement. Sinon, elles figurent sous ce code..
Le Code
Démarrez Word (version 2000 ou supérieure), ouvrez un nouveau document (vierge), et lancez l'éditeur VBA via le menu Outils > Macros, ou les touches Alt-F11. Repérez (ou affichez) l'explorateur de projets, et double-cliquez sur "ThisDocument". Ceci ouvre une fenêtre de code "ThisDocument (Code)". Effacez les lignes qui s'y trouveraient éventuellement, et collez le code ci-dessous.
Enregistrez (l'icône disquette ou Ctrl-S) le document, refermez l'éditeur VBA, ainsi que le document sauvegardé. Vérifiez au besoin (menu Outils > Macros > Sécurité) que le niveau de sécurité des macros ne soit pas sur "haut". Rouvrez le document, le code devrait démarrer, moyennant peut-être de valider "Activer les macros"..
' -----------------
' Zone Déclarations
' -----------------
Dim TD As Document
' ---------------------
' SUB: Horloge Digitale
' ---------------------
Private Sub Document_Open()
' Nettoyage
Set TD = ThisDocument
TD.Content.Delete
' Création des Chiffres ("L01" à "L42")
N = 0: X0 = 16: Y0 = 70
Z0$ = "1,0;3,0;4,1;4,3;4,5;4,7;3,8;1,8;0,7;0,5;0,3;0,1;1,4;3,4;"
For T = 1 To 6
Z$ = Z0$: X0 = X0 + 64 + 16 * (T Mod 2): GoSub SS1
Next T
' Création des Points ("L43" to "L46")
For X0 = 220 To 364 Step 144
Z$ = "0,2;0,3;0,5;0,6;": GoSub SS1
Next X0
' Boucle Infinie
Do
' Attente
Do: K$ = Time$: DoEvents: Loop While K$ = K0$: K0$ = K$
' Décryptage
For T = 1 To 6
V0 = Val(Mid$(K$, Int(1.4 * T), 1)): N = 7 * T - 6
V = V0 <> 1 And V0 <> 4: GoSub SS2
V = V0 < 5 Or V0 > 6: GoSub SS2
V = V0 <> 2: GoSub SS2
V = (V0 Mod 3) <> 1: GoSub SS2
V = (V0 Mod 2) = 0 And V0 <> 4: GoSub SS2
V = V0 = 0 Or (V0 > 3 And V0 <> 7): GoSub SS2
V = V0 > 1 And V0 <> 7: GoSub SS2
Next T
DoEvents
Loop
Exit Sub
' SSUB: Ajout Segments
SS1:
While Z$ <> ""
T1 = InStr(Z$, ","): T2 = InStr(T1 + 1, Z$, ";")
T3 = InStr(T2 + 1, Z$, ","): T4 = InStr(T3 + 1, Z$, ";")
N = N + 1: Z2$ = "L" + Format$(N, "00")
TD.Shapes.AddLine( _
X0 + 10 * Val(Left$(Z$, T1 - 1)), _
Y0 + 10 * Val(Mid$(Z$, T1 + 1, T2 - T1 - 1)), _
X0 + 10 * Val(Mid$(Z$, T2 + 1, T3 - T2 - 1)), _
Y0 + 10 * Val(Mid$(Z$, T3 + 1, T4 - T3 - 1)) _
).Name = Z2$
Z$ = Mid$(Z$, T4 + 1)
TD.Shapes(Z2$).Line.Weight = 11
TD.Shapes(Z2$).Line.ForeColor = &H800000
Wend
Return
' SSUB: Etat d'un Segment
SS2: TD.Shapes("L" + Format$(N, "00")).Visible _
= IIf(V, msoTrue, msoFalse): N = N + 1
Return
End Sub
Explications
Nous ne nous attarderons pas sur la création-même des Segments, ils ont été détaillés précédemment. Notez qu'ici la façon de les créer est "pilotée" par la chaîne Z$. Pour chacun des 6 Chiffres, la même séquence sera répétée.
En observant Z$, une séquence s'y reproduit, c'est "X,Y;". Pris séquentiellement par deux, ces Points (X,Y) serviront à créer et positionner les segments de chaque chiffre dans un ordre précis. Accessoirement, ces segments seront nommés également séquentiellement, pour le premier chiffre (dizaines d'heures) de "L01" à "L07", le second de "L08" à "L14", etc.. jusqu'au sixième (unités de secondes) de "L36" à "L42". Cette numérotation permet d'adresser un segment par deux paramètres: la position du chiffre, et la position du segment dans le chiffre.
La même méthode de construction est appliquée pour la création des deux paires de points ("L43" à "L46").
La boucle infinie, ainsi que la boucle d'acquisition de l'heure sont les mêmes que dans l'horloge précédente, à ce détail près: nous allons récupérer l'heure non pas via le Timer, mais la fonction Texte Time$(), plus adaptée ici, d'autant que nous n'utiliserons pas de centièmes pour faire clignoter les deux deux-points. Time$() renvoie une chaîne de 8 caractères selon ce motif: "hh:mm:ss". Une formule simple permet de transformer {1;2;3;4;5;6} et {1;2;4;5;7;8} afin d'éliminer les deux-points..
Reste la partie la plus intéressante, la conversion d'un chiffre de 0 à 9 en l'allumage ou l'extinction des 7 segments qui stylisent ce chiffre. Dressons le tableau..
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
L01 | # | # | # | # | # | # | # | # | ||
L02 | # | # | # | # | # | # | # | # | ||
L03 | # | # | # | # | # | # | # | # | # | |
L04 | # | # | # | # | # | # | # | |||
L05 | # | # | # | # | ||||||
L06 | # | # | # | # | # | # | ||||
L07 | # | # | # | # | # | # | # | |||
Il suffit alors de relire ce tableau, d'abord en français, puis en code..
(V0 est la valeur du chiffre, et V l'état allumé/éteint résultant)
L01 s'allume pour les valeurs autres que 1 et 4
=> V = V0 <> 1 And V0 <> 4
L02 s'allume si la valeur est inférieure à 5 ou supérieure à 6
=> V = V0 < 5 Or V0 > 6
L03 s'allume si la valeur est différente de 2
=> V = V0 <> 2
L04 s'allume pour toute valeur dont le reste de la division entière par 3 n'est pas 1
=> V = (V0 Mod 3) <> 1
..et ainsi de suite (essayez avec les 3 segments restants) !
Dernière chose: les DoEvents permettent de rendre du temps CPU au système lorsque le programme n'en requiert pas 100%, par exemple pour ..rafraîchir l'affichage :)
-MyLzz59-
2 Commentaire(s):
j avais pas capté que les segments des digits etaient gerés individuellement....
miam!
:p
bon, ça fonctionne....encore bravo...
:*
(suis le seul à essayer ces(ses) jouets!? dites moi?)
:* Taz,
-MyLzz59-
Rem: "Miam" ? :P
Enregistrer un commentaire