Compte à rebours vb.net

medom7 Messages postés 1 Statut Membre -  
 Utilisateur anonyme -
Bonjour à tous,
Je suis débutant en Programmation, je cherche à faire un compte à rebours tout simple. J'ai essayé mais ça ne marche pas. Jutilise NumericUpDown pour entrer les valeurs au debut.

voici mon code :
Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer_Countdown.Tick
        Dim ss As Integer
        Dim mm As Integer
        Dim hh As Integer
        ss = NumericUpDown3.Value
        mm = NumericUpDown2.Value
        hh = NumericUpDown1.Value
        If hh>= 0 Then

            If mm >= 0 Then

                If ss >= 0 Then
                    ss -= 1
                    Me.TextBox.Text = Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")

                End If
                ss = 60
                mm -= 1
                Me.TextBox.Text = Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")
            End If
            mm = 60
            hh -= 1
            Me.TextBox.Text = Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")
        End If


Je vous remercie

4 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    le code du Pivert (que je salue au passage) est très bien mais pas forcément accessible à un débutant.

    Dans le code que tu montres, il y a plusieurs erreur "de débutant", ce n'est ni une critique, ni une moquerie, c'est juste une constation.
    • 1 un contrôle n'est pas une variable, cela sert à transmettre et/ou afficher une donnée pour l'homme, mais son travail n'est pas de la traiter. En l'occurence, tu devrais faire les calculs sont une variable en seconde par exemple, puis afficher la correspondance. Mais il y a le petit 4.
    • 2 cette ligne
      Me.TextBox.Text = Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")
      est répétée 4 fois, cela veut dire que s'il y a une erreur, il faudra la corriger 4 fois. On évite au maximum la duplication de code.
    • 3 ceci
      Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")
      se réduit comme ça
      String.Format("{0:00}:{1:00}:{2:00}", hh, mm, ss)
    • 4 il y a des types de données qui caractérisent un moment (DateTime) ou une durée (TimeSpan), ces 2 types de données permettent des calculs sur le temps et l'extraction facile en Heures, minutes et secondes


    Te viendrait-il à l'idée de construire une voiture sans avoir appris les rudiments de la mécanique? Probablement pas, pourtant, comme 99.9999% des autodidactes en programmation (j'en ai fait parti, y'a longtemps et je me suis cassé les dents), tu t'es lancé dans ton projet en faisant l'impasse sur les 4 rudiments je viens de lister.

    Le meilleur conseil que l'on puisse te donner, c'est de poser ton projet quelques jours , de suivre un cours en ligne, celui-là est pas mal https://plasserre.developpez.com/cours/vb-net/ même s'il considère l'objet comme une mode (VB.Net a écrit conçu pour être codé 100% objet), celui d'openclassroom est un peu moins abordable mais plus orienté objet. Fais bien tout, dans l'ordre, même si ça te parait simple.
    Une fois finit, tu pourras reprendre bien plus facilement ton projet.
    0
  2. Kalissi Messages postés 221 Statut Membre 20
     
    Bonjour,

    Pour le plaisirs de programmer, voici un autre exemple ou le timer est réalisé maison :-)

    
    Imports System.Data.Objects.DataClasses
    Imports System.Runtime.Serialization
    Imports System.ComponentModel
    
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    '''  Systême              : WF_Essais
    '''  Classe                 : FrmChrono
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    ''' <summary>
    ''' - - Description de la classe FrmChrono
    ''' </summary>
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    ''' <History>
    ''' Historique des modifications: <br />
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    ''' Demande    Date              Nom                     Description <br />
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    ''' [100000]     2018-10-10   Programmeur      Création Initiale <br />
    ''' </History>
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    ''' <remarks>
    ''' </remarks>
    ''' ---------------------------------------------------------------------------------------------------------- <br />
    <EdmEntityTypeAttribute(NamespaceName:="WF_Essais", Name:="FrmChrono")>
    <DataContractAttribute(IsReference:=True)>
    <Serializable(), CLSCompliant(True)>
    Public Class FrmChrono
    
    #Region "--- Région Constantes ---"
    
    #End Region
    
    #Region "--- Région Attributs ---"
    
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zContexte As XContexte = Nothing
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zUtilTemp As Stopwatch = Nothing
    
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zTemporisateurDecompte As TimeSpan = Nothing
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zTemporisateurEcoule As TimeSpan = Nothing
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zTemporisateurTimer As TimeSpan = Nothing
    
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never)>
        Private zActif As Boolean = False
    
    #End Region
    
    #Region "--- Région Propriétés ---"
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property Contexte As XContexte
            Get
                Return Me.zContexte
            End Get
            Set(value As XContexte)
                Me.zContexte = value
            End Set
        End Property
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property TempUtil As Stopwatch
            Get
                Dim OldInst As Stopwatch = Me.zUtilTemp
                If (OldInst Is Nothing) Then
                    Me.zUtilTemp = New Stopwatch
                End If
                Return Me.zUtilTemp
            End Get
            Set(value As Stopwatch)
                Me.zUtilTemp = value
            End Set
        End Property
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property TemporisateurTimer As TimeSpan
            Get
                Return Me.zTemporisateurTimer
            End Get
            Set(value As TimeSpan)
                Me.zTemporisateurTimer = value
            End Set
        End Property
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property TemporisateurDecompte As TimeSpan
            Get
                Return Me.zTemporisateurDecompte
            End Get
            Set(value As TimeSpan)
                Me.zTemporisateurDecompte = value
            End Set
        End Property
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property TemporisateurEcoule As TimeSpan
            Get
                Return Me.zTemporisateurEcoule
            End Get
            Set(value As TimeSpan)
                Me.zTemporisateurEcoule = value
            End Set
        End Property
    
        <EdmScalarPropertyAttribute()>
        <DataMemberAttribute()>
        Private Property Actif As Boolean
            Get
                Return Me.zActif
            End Get
            Set(value As Boolean)
                Me.zActif = value
            End Set
        End Property
    
    #End Region
    
    #Region "--- Région Constructeurs ---"
    
        Public Sub New(ByRef pContexte As XContexte)
    
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
    
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.zContexte = pContexte
    
    
        End Sub
    
    #End Region
    
    #Region "--- Région Méthodes ---"
    
    #Region "--- Région Évènements ---"
    
    #Region "--- Région Évènements Formulaire ---"
    
        Private Sub FrmChrono_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
    
    #End Region
    
    #Region "--- Région Évènements Boutons ---"
    
        Private Sub btnDemarrer_Click(sender As Object, e As EventArgs) Handles btnDemarrer.Click
    
            TemporisateurTimer = CaptureDelaiTotalTim(Contexte)
            TempUtil.Start()
            Actif = True
            Me.txtDepart.Text = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            VerifieTemps(Contexte)
    
        End Sub
    
        Private Sub btnArreter_Click(sender As Object, e As EventArgs) Handles btnArreter.Click
    
            TempUtil.Stop()
            Me.txtArret.Text = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            Actif = False
    
        End Sub
    
        Private Sub btnReset_Click(sender As Object, e As EventArgs) Handles btnReset.Click
    
            TempUtil.Reset()
    
        End Sub
    
        Private Sub btnQuitter_Click(sender As Object, e As EventArgs) Handles btnQuitter.Click
    
            Me.Close()
    
        End Sub
    
    #End Region
    
    #Region "--- Région Évènements TextBox ---"
    
        Private Sub txtHeure_TextChanged(sender As Object, e As EventArgs) Handles txtHeure.TextChanged
    
            ChangementDelaiSouhaite(Contexte)
    
        End Sub
    
        Private Sub txtMinute_TextChanged(sender As Object, e As EventArgs) Handles txtMinute.TextChanged
    
            ChangementDelaiSouhaite(Contexte)
    
        End Sub
    
        Private Sub txtSeconde_TextChanged(sender As Object, e As EventArgs) Handles txtSeconde.TextChanged
    
            ChangementDelaiSouhaite(Contexte)
    
        End Sub
    
    
    #End Region
    
    #End Region
    
    #Region "--- Région Procédures ---"
    
        Private Sub ChangementDelaiSouhaite(ByRef Contexte As XContexte)
    
            Dim Heure As String = "00"
            Dim Minute As String = "00"
            Dim Seconde As String = "00"
    
            If (Not (String.IsNullOrEmpty(Me.txtHeure.Text))) Then
                Heure = Me.txtHeure.Text.PadLeft(2, "0"c)
            End If
            If (Not (String.IsNullOrEmpty(Me.txtMinute.Text))) Then
                Minute = Me.txtMinute.Text.PadLeft(2, "0"c)
            End If
            If (Not (String.IsNullOrEmpty(Me.txtSeconde.Text))) Then
                Seconde = Me.txtSeconde.Text.PadLeft(2, "0"c)
            End If
    
            Me.txtDelaiSouhaite.Text = String.Concat(Heure, ":", Minute, ":", Seconde)
    
    
        End Sub
    
    #End Region
    
    #Region "--- Région Fonctions ---"
    
        Private Function VerifieTemps(ByRef Contexte As XContexte) As String
    
            Dim Chaine As String = String.Empty
    
            While Actif
                TemporisateurEcoule = TempUtil.Elapsed
                Me.txtTempEcoule.Text = ConvertirTimeSpanVersChaine(Contexte, TemporisateurEcoule)
                Me.txtDecompte.Text = CalculDuDecompte(Contexte, TemporisateurEcoule)
                Chaine = Me.txtTempEcoule.Text
                Application.DoEvents()
    
            End While
    
            Return Chaine
    
        End Function
    
        Private Function CalculDuDecompte(ByRef Contexte As XContexte, ByVal pTemp As TimeSpan) As String
    
            Dim TempRestantStr As String = String.Empty
            Dim Minute As Int64 = 0
            Dim Seconde As Int64 = 0
            Dim MilliSeconde As Int64 = 0
    
            Dim TempsTotal As TimeSpan = TemporisateurTimer
            Dim TempASoustraire As TimeSpan = pTemp
    
            Dim TempRestant As TimeSpan = TempsTotal - TempASoustraire
    
            TempRestantStr = ConvertirTimeSpanVersChaine(Contexte, TempRestant)
    
            Return TempRestantStr
    
        End Function
    
        Private Function CaptureDelaiTotalTim(ByRef Contexte As XContexte) As TimeSpan
    
            Dim Delai As TimeSpan = New TimeSpan(0)
    
            Dim Heure As Int32 = Convert.ToInt32(Me.txtHeure.Text)
            Dim Minute As Int32 = Convert.ToInt32(Me.txtMinute.Text)
            Dim Seconde As Int32 = Convert.ToInt32(Me.txtSeconde.Text)
    
            ' DD HH MM SS MILLI
            Delai = New TimeSpan(0, Heure, Minute, Seconde, 0)
    
            Return Delai
    
        End Function
    
        Private Function ConvertirTimeSpanVersChaine(ByRef Contexte As XContexte, ByVal pTemp As TimeSpan) As String
    
            Dim ChaineTemps As New System.Text.StringBuilder
    
            Dim TempJour As String = pTemp.Days.ToString
            Dim TempHeure As String = pTemp.Hours.ToString
            Dim TempMinute As String = pTemp.Minutes.ToString
            Dim TempSeconde As String = pTemp.Seconds.ToString
            Dim TempMilliSeconde As String = pTemp.Milliseconds.ToString
    
            ChaineTemps.Append(TempJour)
            ChaineTemps.Append(" ")
            ChaineTemps.Append(TempHeure.PadLeft(2, "0"c))
            ChaineTemps.Append(":")
            ChaineTemps.Append(TempMinute.PadLeft(2, "0"c))
            ChaineTemps.Append(":")
            ChaineTemps.Append(TempSeconde.PadLeft(2, "0"c))
            ChaineTemps.Append(".")
            ChaineTemps.Append(TempMilliSeconde.PadLeft(3, "0"c))
    
            Return ChaineTemps.ToString
    
        End Function
    
    #End Region
    
    #End Region
    
    #Region "--- Région Commentaires ---"
    
    #End Region
    
    End Class
    
    


    K
    0
    1. Utilisateur anonyme
       
      Bonjour Kalissi,

      Je n'ai pas regardé en détail, mai je trouve ton programme paradoxal.
      La question vient d'un débutant, donc l'inonder de
      <EdmEntityTypeAttribute(NamespaceName:="WF_Essais", Name:="FrmChrono")>
      <DataContractAttribute(IsReference:=True)>
      <Serializable(), CLSCompliant(True)>
      risque de le perdre en route.

      En plus, tu affiches des millisecondes, mais tu en perds partout.
      Un exemple ici
         Private Function CalculDuDecompte(ByRef Contexte As XContexte, ByVal pTemp As TimeSpan) As String
      
              Dim TempRestantStr As String = String.Empty
              Dim Minute As Int64 = 0
              Dim Seconde As Int64 = 0
              Dim MilliSeconde As Int64 = 0 'ces 3 variable ne servent à rien, temps perdu à les déclarer, et pourquoi en int64?
      
              Dim TempsTotal As TimeSpan = TemporisateurTimer 'pourquoi ne pas te servir directement de TemporisateurTimer, tu perds du temps d'exécution
              Dim TempASoustraire As TimeSpan = pTemp 'idem
      
              Dim TempRestant As TimeSpan = TempsTotal - TempASoustraire 'TempRestant pourrait-être une variable globale à la classe pour là encore gagner en temps d'exécution
      
              TempRestantStr = ConvertirTimeSpanVersChaine(Contexte, TempRestant) 'cette fonction est elle vraiment utile, un timespan sait se convertir en chaine tout seul, https://docs.microsoft.com/fr-fr/dotnet/standard/base-types/custom-timespan-format-strings
              
      
              Return TempRestantStr
      
          End Function




      Et puis ceci
              While Actif
                  TemporisateurEcoule = TempUtil.Elapsed
                  Me.txtTempEcoule.Text = ConvertirTimeSpanVersChaine(Contexte, TemporisateurEcoule)
                  Me.txtDecompte.Text = CalculDuDecompte(Contexte, TemporisateurEcoule)
                  Chaine = Me.txtTempEcoule.Text
                  Application.DoEvents() 'en perte de temps y pas pire
      
              End While


      Un doevents bloque ton application, dis à windows fait ce que tu veux et rends mois la main quand tu veux, donc là autant te dire, que windows des millisecondes il ne se prive pour s'en octroyer.

      Si tu veux faire un timer toi même, la meilleure solution est de mettre ton while dans un thread avec éventuellement un Sleep de n millisecondes.
      0
  3. Kalissi Messages postés 221 Statut Membre 20
     
    Bonjour,

    Je comprends ton point de vue ...
    Si Medom a des questions je lui répondrai selon mes disponibilités ...
    Si mon code te déplait, je suis désolé ...
    Personnellement, je préfère un code explicit ...

    K
    0
    1. Kalissi Messages postés 221 Statut Membre 20
       
      Bonjour,

      Les méta instructions qui précèdent les signatures ne sont présentent que parce que j'utilise des extraits de code "snippets" qui insère une classe par défaut dans un projet quelconque.

      Le demandeur peut ignorer cet exemple si celui-ci ne lui convient pas.
      Si ce code est considéré comme nuisant, un modérateur peut aussi le retirer.

      K
      0
    2. Utilisateur anonyme
       
      Il n'est ni question de me plaire ou même de nuire à qui que ce soit, je te proposais juste des pistes d'améliorations, d'être constructif.
      A toi de voir si tu veux en tenir compte ou pas.
      Par exemple je ne suis pas anti DoEvents, si tu cherches un peu tu trouveras des centaines de posts sur tous les forums, qui disent qu'il ne faut pas s'en servir sans autre forme de procès. Il y en a quelques uns qui expliquent pourquoi c'est "dangereux" et peu performant.
      Dans ton cas, faire un chronomètre à la milliseconde et en rendre au moins 30 (c'est un minimum) au processeur à chaque boucle, en terme de performance c'est pas cohérent. Si tu veux afficher le 1/10 de secondes, je n'ai plus rien à en dire.

      Pour mon travail aussi j'utilise des snipets, mais pas pour répondre sur le forum.
      Le code utile pour la question posée arrive à la ligne 156, tout ce qui est avant, ne lui est pas encore accessible, c'est un coup à le dégouter.
      Et ça n'est pas du tout explicite pour un débutant.

      D'ailleurs, pour l'être vraiment, il manque quelques commentaires aux lignes clés.
      0