DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VBでカウントダウンタイマーを作っています。

環境/言語:[win7,VB]
分類:[.NET]

5分間を計るカウントダウンタイマーを作っています。
分:秒表示にしたいのですが、○分0秒の次が○分−1秒になってしまいます。58秒からは正常に表示されます。

MyBase.Load
timeNm = 5
timeNs = 0
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If Timer1.Enabled = False Then
Button1.Text() = "ストップ"
Timer1.Enabled = True
Else
Button1.Text() = "スタート"
Timer1.Enabled = False
timeNm = 5
timeNs = 0
Label3.Text() = timeNm & ":" & timeNs
End If
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If timeNs < 0 Then
timeNm = timeNm - 1
timeNs = 59
Label3.Text() = timeNm & ":" & timeNs
End If
timeNs = timeNs - 1
Label3.Text() = timeNm & ":" & timeNs
If Label3.Text = "0:0" Then
Button1.Text() = "スタート"
Timer1.Enabled = False
timeNm = 5
timeNs = 0
Label3.Text() = timeNm & ":" & timeNs
My.Computer.Audio.Play(My.Resources.voice1, AudioPlayMode.Background)
End If
End Sub


If timeNs < 0 Then の部分の<を=に変えると、今度は59秒が飛ばされ、0秒の次が58秒になります。
この書き方では解決できないのではないかと思いましたが、他の書き方が思いつきません。
何かいい方法はないでしょうか。
> If timeNs < 0 Then
>     timeNm = timeNm - 1
>     timeNs = 59
>     Label3.Text() = timeNm & ":" & timeNs
> End If
> timeNs = timeNs - 1
> Label3.Text() = timeNm & ":" & timeNs

timeNsが1のときに呼び出されると、timeNs=timeNs-1=0になります。
timeNsが0のときに呼び出されると、timeNs<0は偽ですからtimeNs=timeNs-1で-1になります。

=で比較するようにした場合。
timeNsが0のときに呼び出されると、timeNs=0は真ですからまずIf文の中を処理します。timeNs=59になります。
If文を出た後、さらにtimeNs=timeNs-1しろとあるので、timeNs=58になります。

秒だけで管理して、表示する際に整数除算演算\と剰余演算Modで分と秒を計算する方法がお勧めです。
> timeNsが1のときに呼び出されると、timeNs=timeNs-1=0になります。
> timeNsが0のときに呼び出されると、timeNs<0は偽ですからtimeNs=timeNs-1で-1になります。
>
> =で比較するようにした場合。
> timeNsが0のときに呼び出されると、timeNs=0は真ですからまずIf文の中を処理します。timeNs=59になります。
> If文を出た後、さらにtimeNs=timeNs-1しろとあるので、timeNs=58になります。

なるほど、よくわかりました。
おっしゃる通り、300秒をカウントダウンした上で表示のみm:ssにした方が楽でした。
お答えありがとうございました、無事完成しました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板