Horloge diode avec 3 alarmes et remise à l'heure

Soyez le premier à donner votre avis sur cette source.

Vue 6 081 fois - Téléchargée 1 353 fois

Description

Bonjour,

Suite à une question vue en vbNet, j'ai fait cette horloge de type 7 diodes avec 3 alarmes et une remise à l'heure (selon autorisation).
Développement en vbNet 10.

Source / Exemple :


'
' horloge (form1) : vbNet 10
Option Explicit On
Public Class Form1
  Dim t As Integer
  Dim ri
  Dim alarme(3) As Boolean
  Dim Halarme(3) As String
  Dim alternat As Boolean

  Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim i As Integer
    Me.Left = 10
    Me.Top = 10
    Timer1.Enabled = False
    Timer1.Interval = 1000
    Timer1.Enabled = True
    For i = 0 To 59
      If i < 24 Then
        ComboBox1.Items.Add(Format(i, "00"))
        ComboBox4.Items.Add(Format(i, "00"))
        ComboBox7.Items.Add(Format(i, "00"))
        ComboBox10.Items.Add(Format(i, "00"))
      End If
      ComboBox2.Items.Add(Format(i, "00"))
      ComboBox3.Items.Add(Format(i, "00"))
      ComboBox5.Items.Add(Format(i, "00"))
      ComboBox6.Items.Add(Format(i, "00"))
      ComboBox8.Items.Add(Format(i, "00"))
      ComboBox9.Items.Add(Format(i, "00"))
      ComboBox11.Items.Add(Format(i, "00"))
      ComboBox12.Items.Add(Format(i, "00"))
    Next
    ComboBox1.SelectedIndex = 0
    ComboBox2.SelectedIndex = 0
    ComboBox3.SelectedIndex = 0
    ComboBox4.SelectedIndex = 0
    ComboBox5.SelectedIndex = 0
    ComboBox6.SelectedIndex = 0
    ComboBox7.SelectedIndex = 0
    ComboBox8.SelectedIndex = 0
    ComboBox9.SelectedIndex = 0
    ComboBox10.SelectedIndex = Now.Hour
    ComboBox11.SelectedIndex = Now.Minute
    ComboBox12.SelectedIndex = Now.Second
    Label1.BackColor = Color.FromArgb(225, 225, 225)
    Label2.BackColor = Color.FromArgb(225, 225, 225)
    Label3.BackColor = Color.FromArgb(225, 225, 225)
  End Sub

  Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    t = Mid(TimeOfDay, 1, 1) ' hh:mn:ss
    Call quelleImage()
    PictureBox1.Image = ri
    t = Mid(TimeOfDay, 2, 1)
    Call quelleImage()
    PictureBox2.Image = ri
    t = Mid(TimeOfDay, 4, 1)
    Call quelleImage()
    PictureBox3.Image = ri
    t = Mid(TimeOfDay, 5, 1)
    Call quelleImage()
    PictureBox4.Image = ri
    t = Mid(TimeOfDay, 7, 1)
    Call quelleImage()
    PictureBox5.Image = ri
    t = Mid(TimeOfDay, 8, 1)
    Call quelleImage()
    PictureBox6.Image = ri
    '
    alternat = Not alternat
    If alarme(1) = True Then
      If TimeOfDay >= CDate(Halarme(1)) Then
        If alternat = True Then Label1.BackColor = Color.FromArgb(225, 225, 225)
        If alternat = False Then Label1.BackColor = Color.FromArgb(255, 0, 0)
      End If
    End If
    If alarme(2) = True Then
      If TimeOfDay >= CDate(Halarme(2)) Then
        If alternat = True Then Label2.BackColor = Color.FromArgb(225, 225, 225)
        If alternat = False Then Label2.BackColor = Color.FromArgb(255, 0, 0)
      End If
    End If
    If alarme(3) = True Then
      If TimeOfDay >= CDate(Halarme(3)) Then
        If alternat = True Then Label3.BackColor = Color.FromArgb(225, 225, 225)
        If alternat = False Then Label3.BackColor = Color.FromArgb(255, 0, 0)
      End If
    End If
  End Sub

  Sub quelleImage()
    Select Case t
      Case 0 : ri = My.Resources._0
      Case 1 : ri = My.Resources._1
      Case 2 : ri = My.Resources._2
      Case 3 : ri = My.Resources._3
      Case 4 : ri = My.Resources._4
      Case 5 : ri = My.Resources._5
      Case 6 : ri = My.Resources._6
      Case 7 : ri = My.Resources._7
      Case 8 : ri = My.Resources._8
      Case 9 : ri = My.Resources._9
    End Select
  End Sub

  Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    alarme(1) = False
    Label1.BackColor = Color.FromArgb(225, 225, 225)
    Label1.Text = "Alarme à l'arrêt"
  End Sub

  Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    alarme(2) = False
    Label2.BackColor = Color.FromArgb(225, 225, 225)
    Label2.Text = "Alarme à l'arrêt"
  End Sub

  Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    alarme(3) = False
    Label3.BackColor = Color.FromArgb(225, 225, 225)
    Label3.Text = "Alarme à l'arrêt"
  End Sub

  Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Halarme(1) = Format(ComboBox1.SelectedIndex, "00") & ":" & Format(ComboBox2.SelectedIndex, "00") & ":" & Format(ComboBox3.SelectedIndex, "00")
    Label1.Text = "Alarme = " & CDate(Halarme(1))
    alarme(1) = True
  End Sub

  Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    Halarme(2) = Format(ComboBox4.SelectedIndex, "00") & ":" & Format(ComboBox5.SelectedIndex, "00") & ":" & Format(ComboBox6.SelectedIndex, "00")
    Label2.Text = "Alarme = " & CDate(Halarme(2))
    alarme(2) = True
  End Sub

  Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    Halarme(3) = Format(ComboBox7.SelectedIndex, "00") & ":" & Format(ComboBox8.SelectedIndex, "00") & ":" & Format(ComboBox9.SelectedIndex, "00")
    Label3.Text = "Alarme = " & CDate(Halarme(3))
    alarme(3) = True
  End Sub

  Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    Try
      TimeOfDay = New Date(Now.Year, Now.Month, Now.Day, ComboBox10.SelectedIndex, ComboBox11.SelectedIndex, ComboBox12.SelectedIndex)
    Catch ex As Exception
      MsgBox(Err.Number & vbLf & vbLf & Err.Description, vbExclamation)
    End Try
  End Sub

End Class

Conclusion :


Il faut d'abord faire les 10 images avec Paint, les 10 images des 10 chifrfes, qui sont joints dans le code.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

NHenry
Messages postés
14552
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 septembre 2019
136 -
Bonsoir,

Je pense qu'il faut que tu apprenne les règles de présentations basiques :
- Nommer ses contrôles de manière adaptée, Button6 fait quoi ?
- Activer Option Strict et Option Explicit
- MsgBox doit être évité, on lui préfère MessageBox.Show(...)
- Mid doit être remplacé par MaChaine.SubString(...)
- Retirer l'import automatique de Microsoft.VisualBasic (Propriétés du projet, Références).
- Ne pas utiliser Err ou On Error, utilises un Try/Catch et l'objet d'Exception qui est retourné.

Ensuite, concernant le code :
- Le code :
# Dim alarme(3) As Boolean
# Dim Halarme(3) As String
Me fait penser qu'une structure contenant un Booléen et un Date remplacerait avantageusement ces 2 tableaux.
Tu peux aussi regarder du coté de List(Of ...) pour gérer autant d'alarmes que désirer.

# Sub quelleImage()
# Select Case t
# Case 0 : ri = My.Resources._0
# Case 1 : ri = My.Resources._1
# Case 2 : ri = My.Resources._2
# Case 3 : ri = My.Resources._3
# Case 4 : ri = My.Resources._4
# Case 5 : ri = My.Resources._5
# Case 6 : ri = My.Resources._6
# Case 7 : ri = My.Resources._7
# Case 8 : ri = My.Resources._8
# Case 9 : ri = My.Resources._9
# End Select
# End Sub
Peut être ramplacée par un Dictionary(Of ...), cela limitera la conso mémoire et simplifiera ton code.

Réponds déjà à ces quelques remarques, on verra pour la suite.
ehjoe
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
2 -
Bonsoir,

Je ne nomme jamais les contrôles car si on se passe le code, ça pénalise trop la personne qui doit donner un nom à chaque contrôle, il est mieux d'indiquer simplement dans la procédure ce que fait le contrôle, ce qui ici a été omis car on comprend ce que ça fait, c'est en somme marqué sur le bouton, suffit de venir de la feuille au code.

Option explicit on, est activé, le reste n'a pas d'importance.

MsgBox est un héritage vb6, c'est au choix.

Mid fonctionne très bien.

L'importe de MS, le paramétrage, ça regarde celui qui va l'installer ensuite...

Je n'ai pas utilisé error ou on error !

La structure que j'utilise est une structure VB qui fonctionne, c'est suffisant, on peut en effet mettre une variable à deux entrées i(x,y), c'est au choix, ou trois variables i, j, k, vu le faible nombre ça n'a pas à être discuté.

Pour le select case, j'utilise au maximum les directives VB, et surtout B (de Basic) dans le code.

Concernant la RAM, elle est passé de 64 ko à 4 Go et maintenant davantage en 64 bits, il est ridicule de tenter de faire une économie de bouts de chandelles avec si peu de place prise, on s'en préoccupe si réellement une grande place mémoire est prise.

Concernant le Timer et le temps processeur, là c'est certain que le processeur n'aime pas les Timer, mais bon, c'est nécessaire dans le code, à moins de faire une boucle avec des goto, ce qui reviendrait sans doute au même, voire pire, donc on n'y peut rien c'est comme ça !

Cordialement.

Joe.
NHenry
Messages postés
14552
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 septembre 2019
136 -
Bonsoir,

Pour information, je suis développeur pro, donc certains conseils sont directement issus de ce monde.

Le nommage des contrôles permet aussi d'éviter de chercher à chaque fois que l'on ajoute une ligne "Quel est le contrôle qui contient l'information désirée ?"
Par exemple, TxtHeureAlarme1 est plus facilement logiquement utilisable que TextBox12.
C'est une règle qui est indispensable dans les projets de tailles modérée et plus, et c'est une habitude essentielle à prendre.

MsgBox, mid, ... sont des fonctions issues de VB6, conservées pour compatibilité, mais sont à éviter quand il y a des alternatives plus respectables et plus logiques dans les classes standards du framework. Par exemple, Mid index les caractère sur une base 1 alors que partout dans le framework on est en base 0, l'utiliser, revient à faire en permanence une gymnastique intellectuelle, fatiguante et source d'erreur.

Certes, tu n'utilises pas On Error, mais tu utilises Err :
# Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
# Try
# TimeOfDay = New Date(Now.Year, Now.Month, Now.Day, ComboBox10.SelectedIndex, ComboBox11.SelectedIndex, ComboBox12.SelectedIndex)
# Catch ex As Exception
# MsgBox(Err.Number & vbLf & vbLf & Err.Description, vbExclamation)
# End Try
# End Sub
Utilises plutôt l'objet Exception fourni par le Catch.

Concernant la collection et la structure, faire cela pourra te permettre, sans réclamer beaucoup de code, de pouvoir changer le nombre d'alarme disponible.

Concernant la RAM, vouloir l'économiser à l'excès, c'est vrai que ce n'est pas utile, mais ne pas la gaspiller inutilement est quand même respectable, bons nombre d'ordinateur n'ont pas forcément 4Go de RAM.

Je n'ai pas fait de remarque sur l'usage du Timer.
Tous les processeurs (je parle des PC) actuellement, utilisent les Timers à foison, donc ce n'est pas un de plus qui va les déranger.
ehjoe
Messages postés
728
Date d'inscription
samedi 4 avril 2009
Statut
Membre
Dernière intervention
30 mars 2014
2 -
Ah, je t'assure, quand dans un forum (où je ne te vois pas = VBnet de Microsoft), on me passe un code avec des noms personnels sur ls objets, c'est réellement pénible, car il faut écrire les nom sur les objets pour que ça marche sauf si on a tout le code, en plus certain d'onne des noms qui ne sont significatifs que pour eux, alors je ne mets jamais de nom... mais je commente la procédure si besoin.

Pour l'affichage avec erreur, oui, mais je n'utilise pas error, c'est juste de l'affichage, en fait c'est simple, tout ce qui tourne en vb6 et n'est pas plus performant à l'oeil, je le mets en vb6.

Cordialement, marche pas ce forum, je perd souvent le curseur !

Joe
NHenry
Messages postés
14552
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 septembre 2019
136 -
A la place de
MsgBox(Err.Number & vbLf & vbLf & Err.Description, vbExclamation)
Fais plutot :
MessageBox.Show(ex.ToString)
Tu aura plus d'information.

Concernant les noms des contrôles, certes, mais c'est souvent plus clair.
Surtout quand tu cherches à comprendre une source.

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.