デジタル時計の早送り

解決


DEN  2012-04-15 11:10:40  No: 143279  IP: 192.*.*.*

デジタル時計を作っています。

VB初心者です。宜しくお願いします。

このデジタル時計はformが開かれると午前6:00から現在の時刻(たとえば11:00)の時間まで早送りされ、現在の時間まで到達したら通常のタイマーの動きになるようにしたいと思います。デジタル時計までは何とか動くようにしました。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        '現在の日付時刻をローカルから取得する
        Dim dtNow As DateTime = DateTime.Now
        '取得した時刻をLabel.TEXTにセットする
        Me.Label1.Text = Format(dtNow, "HH:mm:ss")
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Timer1.Interval = 1000
        Me.Timer1.Start()
End Sub

上記のソースにどのようにてを加えればいいかわかりません。宜しくお願いします。

編集 削除
LL  2012-04-15 17:05:48  No: 143280  IP: 192.*.*.*

こういう感じですかねえ

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        '現在の日付時刻をローカルから取得する
        Dim dtNow As DateTime = DateTime.Now

        Select Case Me.Timer1.Interval
            Case 10 '早送り(巻き戻し)?の場合の処理
                Static flag1st As Boolean = True
                Static dtLast As DateTime
                Static intStep As Integer
                If flag1st Then '初回は早送り・巻き戻し・同じ時刻かをチェック
                    flag1st = False
                    dtLast = DateTime.Today.Date.AddHours(6)
                    intStep = Math.Sign(DateTime.Compare(dtNow, dtLast)) * 3 '3分刻みで早送り(巻き戻し)
                End If

                Select Case intStep
                    Case Is > 0 '早送りの場合
                        dtLast = dtLast.AddMinutes(intStep)
                        If dtLast > dtNow Then '早送りし過ぎの場合
                            dtLast = dtNow
                            Me.Timer1.Interval = 1000
                        End If
                    Case Is < 0 '巻き戻しの場合
                        dtLast = dtLast.AddMinutes(intStep)
                        If dtLast < dtNow Then '巻き戻し過ぎの場合
                            dtLast = dtNow
                            Me.Timer1.Interval = 1000
                        End If
                    Case Else '今の時刻と同じなのでタイマーを1000MSに間隔に変更する
                        Me.Timer1.Interval = 1000
                End Select

                Me.Label1.Text = Format(dtLast, "HH:mm:ss")
                Me.Label1.Refresh()

            Case 1000 '早送りが終わった一秒刻みの処理
                '取得した時刻をLabel.TEXTにセットする
                Me.Label1.Text = Format(dtNow, "HH:mm:ss")

        End Select
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Label1.Text = Format(DateTime.Today.Date.AddHours(6), "HH:mm:ss") '当日6時を初期値として表示
        Timer1.Interval = 10
    End Sub

    Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        'formが最初に表示された時からスタートする
        Static flag1st As Boolean = True
        If flag1st Then
            flag1st = False
            Me.Timer1.Start()
        End If
    End Sub

編集 削除
DEN  2012-04-15 19:01:18  No: 143281  IP: 192.*.*.*

望んだ回答以上でびっくりしました。

Timer1_TickとForm1_Loadをこうやって使うんですね。タイマーというものの勉強になります。

Timer1_TickとForm1_Loadの関係がわからなかったら、Select Case をForm1_Loadで使って迷宮入りするところでした。

ありがとうございました。

それにしても本当にすごいですね。

編集 削除