Menu

Compte à rebours vb.net

Messages postés
1
Date d'inscription
lundi 8 octobre 2018
Dernière intervention
8 octobre 2018
-
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
Afficher la suite 

Votre réponse

4 réponses

Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
Commenter la réponse de cs_Le Pivert
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
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 http://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.
Commenter la réponse de Whismeril
Messages postés
192
Date d'inscription
jeudi 2 mai 2013
Dernière intervention
26 novembre 2018
0
Merci
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
Whismeril
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
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.
Commenter la réponse de Kalissi
Messages postés
192
Date d'inscription
jeudi 2 mai 2013
Dernière intervention
26 novembre 2018
0
Merci
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
Kalissi
Messages postés
192
Date d'inscription
jeudi 2 mai 2013
Dernière intervention
26 novembre 2018
-
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
Whismeril
Messages postés
12370
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
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.
Commenter la réponse de Kalissi