どうも!リョクちゃです。
今回は、タイマーと呼ばれるコントロールの使い方を紹介し、
最終的に3分タイマーをアプリケーションで作れるよう目指していきます。
ちなみに前回はこちら
目次
タイマー
Windowsフォームアプリケーションでは、Form画面を作成していくときに
各種様々なコントロールが取り揃えられています。
これらの中にタイマーと呼ばれるコントロールがあります。
タイマーコントロールは名前の通り、タイマー機能を持ったコントロールです。
時間の計測やある一定の時間が経過するごとに処理を行いたいときなどに
一般的には使われます。
ただし、気を付けないといけない点もあります。
精度が求められるアプリケーションでタイマーを使う場合は注意が必要です。
実はタイマー、精度はあまりよくなく、状況によって精度にばらつきが生じます。
また、使うマシンの依存も少なからずあるため、異なるマシン同士でタイマーを
スタートさせても必ずしも同じタイミングでストップされることがないときもあります。
これらを考慮したうえで、アプリケーションを作る際は気を付けましょう。
※ここはあくまで留意しておくだけでいいと思います。
まずは簡単に使えるようにしていきましょう。
準備編:フォームを作成
それでは早速、タイマーについて実践を踏まえ学んでいきましょう。
まず最初に準備として、下のようなフォームを作成します。
これに加えて、ツールボックスからタイマーを探し、
フォーム画面上へドラッグ&ドロップをします。
追加されると、下の図のようになります。
ちなみに筆者の環境は、
- VisualStudio2019
- Windows 10 64bit
- .Net Framework 4.5.2
です。
タイマーイベントを理解する
タイマーには、ユーザが指定した間隔によって、
タイマーが持つイベントを発生させることができます。
これは
というイベントになります。
使い方としては、
タイマーが持つ、Intervalプロパティにどの間隔でイベントを発生させたいかを
設定してあげる必要があります。
これを設定するには、
と書くことで設定できます。
ちなみに設定をしないと、初期値としては100ミリ秒が与えられます。
今回は、1000ミリ秒に設定をしていきます。
では、配置したタイマーを使い、Intervalを変更していきます。
コードは下のようになります。
1 2 3 4 5 6 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 End Sub End Class |
Timer.Tickイベントを使う
それでは、フォーム上に配置したタイマーをダブルクリックして、
Tickイベントをコードエディタに反映させましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick End Sub End Class |
それでは、Intervalで設定した間隔後にTickイベントが発生したら、
メッセージボックスを表示するコードを書いてきましょう。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
ただ、このままでは実行してもメッセージボックスは表示されません。
まだ、タイマーを使う準備は整っていないからです。
最後にタイマーを起動させるコードを書いてあげる必要があります。
起動させるには、
と書きます。
これを先ほど書いたIntervalの後に書きます。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
これで実行をといいたいのですが、このまま実行してしまうと延々と指定した間隔で、
メッセージボックスが表示されてしまいます。
これを防ぐために、タイマーを停止してあげる必要があります。
タイマーを停止するには、
と書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' タイマーを停止する Me.Timer1.Stop() ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
これで実行すると、指定した間隔で実行した際にタイマーの停止がはいるので、
ボタンを押さない限りは、タイマーのイベントは1回のみになります。
実際にボタンを押して指定間隔経過した際にメッセージボックスが表示されるのが、
下の画面になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Public Class TestTimer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' タイマーを停止する Me.Timer1.Stop() ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
これでタイマーイベントの起動のさせ方、停止のさせ方ができるようになりました。
これらを使って、3分タイマーを作っていきましょう。
3分タイマーを作っていく
フォーム画面はそのままで、タイマーのインターバルもそのままで問題ありません。
作成するアプリケーションの機能としては、
- STARTボタンが押されたらタイマーを起動
- STOPボタンが押されたらタイマーを停止
- 画面起動時ラベルには3:00と表示
- Timer.Tickで1000ミリ秒ごとにラベルに表示される時刻を刻んでいく
この機能を実現できるように作っていきましょう。
まず、それぞれボタンのイベントをコードエディタに反映させましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Public Class TestTimer ''' <summary> ''' STARTボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' STOPボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' タイマーを停止する Me.Timer1.Stop() ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
そして画面が起動されたら3:00と表示がされるように、
フォームのロードイベントにラベルの値を設定します。
コードは下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Public Class TestTimer ''' <summary> ''' フォームがロードされたら(画面起動時) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub TestTimer_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' ラベルの値を3:00に変更 Me.Label2.Text = "3:00" End Sub ''' <summary> ''' STARTボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' STOPボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' タイマーを停止する Me.Timer1.Stop() ' メッセージボックスを表示する MessageBox.Show("Hello") End Sub End Class |
タイマーが経過したら1000ミリ秒ごとに時刻を刻んでいくコードを書いていきます。
最初にコードを下に記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
Public Class TestTimer ' 時刻を秒に変更した値を格納する変数 Private intSec As Integer ''' <summary> ''' フォームがロードされたら(画面起動時) ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub TestTimer_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' ラベルの値を3:00に変更 Me.Label2.Text = "3:00" ' 変数intSecに3:00を秒に換算した値を代入 ' 1. 分と秒に分ける Dim aryTime As String() = Me.Label2.Text.Split(":"c) ' 2. 秒に換算する 分=60秒 intSec = CInt(aryTime(0)) * 60 End Sub ''' <summary> ''' STARTボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 間隔を設定 1000ミリ秒に設定(1秒) Me.Timer1.Interval = 1000 ' タイマーを起動する Me.Timer1.Start() End Sub ''' <summary> ''' STOPボタンが押されたら ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click ' タイマーを停止する Me.Timer1.Stop() End Sub ''' <summary> ''' 指定した間隔で発生 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' 時刻3:00経過したら終了 If Me.Label2.Text = "0:00" Then ' タイマーを停止する Me.Timer1.Stop() Exit Sub End If ' 現在の秒数から1000ミリ秒経過したら-1とする intSec -= 1 ' 変数intSecの値を分に換算する Dim resultMin As Integer = CInt(Math.Floor(intSec / 60)) ' 分への換算(割り算) Dim resultSec As Integer = CInt(intSec Mod 60) ' 秒への換算(あまり) ' ラベルに現在の経過時間を表示 Me.Label2.Text = CStr(resultMin) + ":" + CStr(resultSec).PadLeft(2, "0") End Sub End Class |
以下、考え方やコードの補足をしていきます。
ラベルの時刻を秒に直す
3:00と記述された表記から、秒にまず直さないといけません。
秒に直すには、いろいろなやり方がありますが、今回は文字列なので
分と秒の区切り文字である:(コロン)使って分けています。
分けた後に変数として宣言してあったintSecに分の値を使って秒に換算しています。
➔ 3 × 60 = 180秒
これを画面起動時に書いています。
時刻を刻んでいく
タイマーが起動されたら、指定間隔経過したタイミングで、
最初に時刻が0:00出会った場合は処理が終了するように条件分岐であるif文を書いています。
0:00ではない場合は、時刻を刻む処理をさせています。
時刻を刻むには、画面起動時に換算した変数intSecの値を-1することで、
現在の秒数から刻んでいます。
刻んだ時刻の表示
刻んだ時刻を表示するには、秒から分に換算しなくてはいけません。
秒から分に換算するにはそれぞれ、
- 分 = 現在の秒数 / 60
- 秒 = 現在の秒数 Mod 60 ( 現在の秒数 % 60)
分は、割った値の商を代入しています。
秒は、割った値の余りを代入しています。
VB.Netでは、Modを使うことで余りを取得することができます。
これらを最後に文字列に変換し連結することで現在の経過時刻を表示しています。
STOPボタンを押して、タイマーを停止
STOPボタンを押すことで現在の経過時間を残したまま、
タイマーの停止ができるようになっています。
再度、STARTボタンを押すことで現在の経過時刻から引き続き
時を刻んでいきます。
実行して、コードを確認
実際に実行して3分経過したら0:00で停止するか確認してみましょう。
起動時
途中経過
3:00終了
といった感じになります。
コード内の起動時に表示されるラベルの値を変更することで、
3:00以外でも59:00まではタイマーとして機能します。
以上、3分タイマー?のアプリケーション作成になります、お疲れ様です。
まとめ
タイマーを使うには
- タイマーの間隔を設定(初期値は100ミリ秒)
Timer.Interval
- タイマーをスタート
Timer.Start()
- タイマーをストップ
Timer.Stop()
の順番の処理を忘れずに。
指定間隔経過した際に処理をするイベントとして
があります。
タイマーは使えるようになるとアプリケーションの開発の幅が広がります。
ぜひ使っていただけたらなと思います。
ご覧いただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。