timerでラベルの数字をカウントしたいんですが・・・

解決


シュン  2008-12-11 00:19:05  No: 145473

始めまして。VBを習ったばかりのシュンと申します。早速本題を。
  timerを使い、ボタンを押すとラベルの数字が1,2,3・・・と40までカウントするプログラムを作りたいんですがうまくいきません。
ボタンを押してtimerを起動するようにした後、timer1_tickに
       i = 0
        While i < 40
            i += 1
            CountLabel.Text = i
        End While
とコードを入力したんですがすぐ40とラベルに表示されます。
  どうすればいいでしょうか。


特攻体長まるるう  2008-12-11 00:41:55  No: 145474

今のプログラムは、タイマーが一定時間を計った後、
0から40まで一気にカウントしてラベルを更新し、
タイマーが一定時間を計った後、
0から40まで一気にカウントしてラベルを更新し、
・・・
の繰り返しなのでしょう?

タイマーが一定時間を計った後、
変数に+1してラベルに表示

だけでいいのでは?


通るぜ  2008-12-11 07:45:13  No: 145475

timer1_tickイベントはintervalの時間が経過するたびに発生するのですよー


アクア  URL  2008-12-11 08:39:33  No: 145476

アクアと申します。
既に 特攻体長まるるう さんや 通るぜ さんがアドバイスされてますが、お手伝いさせてください。

通るぜさんのアドバイスはIntervalプロパティの設定は幾つなのかという事です。
1秒ごとにTickイベントを発生させたい場合は1000を値に入れておきましょう。(たぶんこれは大丈夫の様に思います。)

たぶん今回参考になるのは 特攻体長まるるう さんのアドバイスではないでしょうか?

While文を用いておられますが、それを用いてしまうと一回のTickイベントの中で
i += 1
CountLabel.Text = i
を目に見えないほどの速さで40回ほどループ処理されて表示されてしまいます。

今回のご質問の内容を推察すると、
i < 40 の条件を満たすまで i += 1 の処理を繰り返して1秒毎に表示したいのでしょうが、その度にこの処理を抜けなければなりません。
という事は、この時に必要なのはFor〜NextやWhileの様な繰り返し処理ではなくて、if〜End Ifなどの分岐処理が望ましいといえます。

以上を考慮すると、以下の様なコードになると思います。

Private i As Integer = 0

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
    ' Timer1のインターバルを1000ミリ秒(1秒)に設定
    Me.Timer1.Interval = 1000
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Timer1.Tick

    If i = 40 Then
        ' Timer1の実行を現在の状態とは反対に設定。
        Timer1.Enabled() = Not Timer1.Enabled()
        i = 0
    Else
        i += 1
        CountLabel.Text = i.ToString()
    End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1.Click
    ' Timer1の実行を現在の状態とは反対に設定。
    Timer1.Enabled() = Not Timer1.Enabled()
End Sub


シュン  2008-12-11 23:52:05  No: 145477

確かに出来ました。特攻体長まるるうさん、通るぜさん、そしてコードを提供してくれた&詳しいアトバイスをくれたアクアさんありがとうございます。返信が少し遅れてすいませんでした。
  while文を使う前はfor〜next文を使用してましたがよく考えればコードの内容によって同じ動きをするんですね・・・。
  ありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加