Horloge binaire

Soyez le premier à donner votre avis sur cette source.

Vue 5 755 fois - Téléchargée 621 fois

Description

Une petite horloge binaire pas si facile à lire que ça mais qui se distingue par un code source particulièrement compact.

Source / Exemple :


Private Sub Command1_Click()
'Afficher ou masquer le poids des bits et l'heure décimale.
'Les 9 contrôles "Label" forment un groupe et sont indexés de 1 à 9.
'Fonctionne comme un switch True-False : propriété Visible = Not (propriété Visible)
Dim i As Integer

For i = 1 To 9
  txtTime(i).Visible = Not (txtTime(i).Visible)
Next i

End Sub

Private Sub Form_Load()
'Définit l'intervalle du contrôle Timer pour afficher l'heure au démarrage (= 1/1000ème seconde)
Timer1.Interval = 1
'Définit l'intervalle du contrôle Timer une fois l'horloge lancée (= 1 seconde)
Timer1.Interval = 1000

End Sub

Private Sub Timer1_Timer()
Dim i As Integer

'On renseigne les 3 labels qui affichent l'heure décimale.
txtTime(1).Caption = Hour(Now)
txtTime(2).Caption = Minute(Now)
txtTime(3).Caption = Second(Now)

'Sur le formulaire chaque "bit" de l'affichage est constitué de 2 contrôles Image
'superposés : 1 sphère blanche sous 1 sphère rouge.
'En jouant avec la propriété Visible de la sphère rouge, on fait apparaître
'la sphère désirée. Les sphères blanches sont fixes et ne sont jamais sollicitées.
'Il y a 3 groupes de contrôles pour les sphères rouges : btS, btM et btH pour
'les secondes, minutes et heures.
'btS, btM et btH sont indexés de 0 à 5 afin de pouvoir arriver pour les secondes
'et les minutes à la valeur 59 : 00111011
'et pour les heures à la valeur 23 : 00010111
'NB : btH(5) est un contrôle Image vide ! Nécessaire pour la boucle de 0 à 5.

'On se sert des index de ces contrôles pour s'adresser à chaque sphère rouge à
'l'aide d'une boucle For...To...Next.
'Et on effectue une opération binaire AND entre les secondes (par exemple) et 2 à
'la puissance de l'index. Ceci indique si le bit représenté par l'index est à 1 ou à 0.
'Exemple, nous en sommes à 27 secondes et nous cherchons quelles sphères rouges
'il faut afficher. Du contrôle btS(0) au contrôle btS(5) on fait :
'     bit 0 = 27 AND 2^0 = 00011011 AND 00000001 = 00000001 > 0  donc Visible = True
'     bit 1 = 27 AND 2^1 = 00011011 AND 00000010 = 00000010 > 0  donc Visible = True
'     bit 2 = 27 AND 2^2 = 00011011 AND 00000100 = 00000000 = 0  donc Visible = False
'     bit 3 = 27 AND 2^3 = 00011011 AND 00001000 = 00001000 > 0  donc Visible = True
'     bit 4 = 27 AND 2^4 = 00011011 AND 00010000 = 00010000 > 0  donc Visible = True
'     bit 5 = 27 AND 2^5 = 00011011 AND 00100000 = 00000000 = 0  donc Visible = False

'C'est ainsi qu'avec la petite boucle ci-dessous on gère l'horloge numérique.

For i = 0 To 5
  btS(i).Visible = (Second(Now) And 2 ^ i)
  btM(i).Visible = (Minute(Now) And 2 ^ i)
  btH(i).Visible = (Hour(Now) And 2 ^ i)
Next i

End Sub

Conclusion :


En jouant avec les contrôles indexés, les puissances de 2 et l'opération binaire AND, une seule boucle FOR...TO...NEXT suffit à faire fonctionner cette horloge.
Je pense sincèrement qu'on ne peut pas faire plus court !
Tous les détails sont expliqués dans le code en commentaires.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
2 avril 2009 à 13:28
Timer1.Interval = 1
Timer1.Interval = 1000

tu n'as pas lourd de garantie qu'un tick s'effectue.
cs_Apolinaire
Messages postés
44
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
25 avril 2019

2 avril 2009 à 13:20
Merci de tes remarques. J'ai mis à jour en conséquence.
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
2 avril 2009 à 10:25
1 - Gaffe au startupPosition: ma barre de taches est a gauche, en vertical et ta form passe partiellement dessous

2 - au chargement, pas de Tick du Timer la première seconde ; l'heure s'affiche pas de suite. Mets 1 dans l'interval de ton timer et remet le à 1000 dans le Timer1_Timer

3 - le test > 0 est inutile. btH(i).Visible = (Hour(Now) And 2 ^ i)
suffit
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
2 avril 2009 à 10:14
J'aime la simplicité de ton code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.