Как создать таймер обратного отсчета, используя часы, минуты и секунды? - PullRequest
0 голосов
/ 22 марта 2019

Мне было интересно, как мне отремонтировать таймер обратного отсчета, чтобы он показывал время в часах: минутах: секундах?

, в данный момент выводятся только секунды, и я не уверен, где у меня естьпошло не так.
Любая помощь очень ценится.

Код:

Public Class Form1
    Dim TargetDT As DateTime
    Dim fields() As String
    Dim Days, Hours, minutes, seconds, milliseconds As String

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        fields = Split(TextBox1.Text, ":")
        Hours = fields(0)
        minutes = fields(1)
        seconds = fields(2)

        Dim CountDownFrom As TimeSpan = TimeSpan.FromHours(Hours).FromMinutes(minutes).FromSeconds(seconds)
        Timer1.Interval = 1000
        TargetDT = DateTime.Now.Add(CountDownFrom)
        Timer1.Enabled = True
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
        Dim ts As TimeSpan = TargetDT.Subtract(DateTime.Now)
        If ts.TotalMilliseconds > 0 Then
            Con1Time.Text = ts.ToString("hh\:mm\:ss")
        Else
            Con1Time.Text = "0:00:00"
            Timer1.Stop()
            MessageBox.Show("Done")
        End If
    End Sub
End Class

1 Ответ

0 голосов
/ 22 марта 2019

Начните с присвоения времени обратного отсчета полю TimeSpan. Если вы хотите начать обратный отсчет, позвоните Start на Timer и Stopwatch. В обработчике Tick события Timer получите Elapsed Stopwatch и вычтите его из исходного времени, чтобы получить оставшееся время как TimeSpan. Затем вы можете отформатировать и отобразить это. Когда оставшееся время достигает нуля, отсчет времени истек.

Private countDownTime As TimeSpan
Private countDownWatch As Stopwatch

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    countDownTime = TimeSpan.FromMinutes(30)
    countDownWatch = Stopwatch.StartNew()
    Timer1.Start()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim timeRemaining = countDownTime - countDownWatch.Elapsed

    If timeRemaining < TimeSpan.Zero Then
        timeRemaining = TimeSpan.Zero
    End If

    Label1.Text = timeRemaining.ToString("hh\:mm\:ss")

    If timeRemaining = TimeSpan.Zero Then
        Timer1.Stop()

        MessageBox.Show("Countdown complete")
    End If
End Sub

Тем не менее, ваша конкретная проблема здесь:

Dim CountDownFrom As TimeSpan = TimeSpan.FromHours(Hours).FromMinutes(minutes).FromSeconds(seconds)

Это не делает то, что вы думаете, что делает. Вы получаете только результат вызова FromSeconds. Если вы хотите создать TimeSpan с часами, минутами и секундами, тогда вызовите соответствующий конструктор

Dim CountDownFrom As TimeSpan = New TimeSpan(Hours, minutes, seconds)

Конечно, эти аргументы должны быть Integer значениями, а не Strings. Поверните Option Strict On и используйте правильные типы данных.

...