Compte à rebours vb.net
medom7
Messages postés
1
Statut
Membre
-
Utilisateur anonyme -
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 :
Je vous remercie
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
A voir également:
- Compte à rebours vb.net
- Créer un compte google - Guide
- Installer windows 10 sans compte microsoft - Guide
- Créer un compte gmail - Guide
- Comment savoir qui regarde mon compte facebook - Guide
- Compte facebook désactivé - Guide
4 réponses
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.
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.
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 çaString.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.
Bonjour,
Pour le plaisirs de programmer, voici un autre exemple ou le timer est réalisé maison :-)
K
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
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
En plus, tu affiches des millisecondes, mais tu en perds partout.
Un exemple ici
Et puis ceci
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.
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.
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
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
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
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
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.
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.