あまりにも記事にすることがないので、VBのサンプルを載せていく。
記念すべき第1回は3分ラーメンタイマーを作ってみる。
尚、開発環境はVisual Basic2008とする。
1.プロジェクトの新規作成
Visual Stadioを起動し、ファイル(F) > 新しいプロジェクト を選択。
ダイアログが開くので、Windows フォーム アプリケーション を選択し、名前を適当に入力する。今回は「Noodle_Timer」とする。
プロジェクトの作成が完了。
2.必要なコントロールをフォーム上に配置する。
ツールボックスウィンドウを開きコントロールを選択し配置していく。
ツールボックスが表示されていない場合は 表示(V) > ツールボックス
任意のコントロールをドラッグ&ドロップで簡単に追加できる。
<配置したコントロール>
※プロパティは「プロパティウィンドウ」から変更する。
・Labelコントロール ... Label1
プロパティは特に変更なし。
・Buttonコントロール ... bStart
Name = bStart (このコントロールの名前)
Text = start (ボタンに表示する文字)
・Buttonコントロール ... bStop
Name = bStop
Text = stop
Enabled = False (選択できないようにする)
・Timerコントロール ... Timer1
Interval = 1000(イベントが発動するタイミングをミリ秒で設定 この例では1秒毎に発動)
3.タイマーをスタートさせる。
デザイナ上のbStartボタンをダブルクリックすると、下図のようにソースコード(以下ソース)が開かれる。
Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click End Sub自動的に作成されたこのソースは、bStartボタンをクリックした時に発動する箇所である。
このように何かしらのアクションがあった場合に発動する動作をイベントと呼ぶ。イベントはコントロールによって様々だが、プロパティウィンドウからどのタイミングで発動するのか確認できるので暇な時にでも見ておこう。
Public Class Form1 ' タイマー起動フラグ Private fStart As Boolean = False ' 経過秒数
Private Count As Integer = 0
' タイマー時間
Private Const TimeLimit As Integer = 180
' スタートボタン クリックイベント Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click ' もし、タイマーが起動していなかったら If fStart = False Then ' タイマーを起動する Timer1.Start() ' フラグを立てる fStart = True ' スタートボタンを選択できないようにする bStart.Enabled = False ' ストップボタンを選択できるようにする bStop.Enabled = True End If End Sub End Class
上の行から順に説明していく。
Private fStart As Boolean = False
まず最初にタイマーが起動しているか判定する為のフラグ変数を定義する。変数についてここでは詳しく説明しないが、データを保持する為の入れ物だと思っておいて良いと思う。
「Private」は、"この変数をどの範囲で使用するのか”の定義であり、このソース内ならどこからでも参照できるが、別ソースからは参照することができない。
「fStart」は、この変数の名前。これは何でも良いが、適当に付けると後々何のための変数なのか判らなくなるので面倒でも意味のある名前にしといたがいい。サンプルではFlagのfを取りfStartとしている。
「As」は、おまじないみたいなもんだから。
「Boolean」は、この変数の型。型と言ってもいまいちピンとこないかもしれないが、今は特に気にしないでよい。Boolean型はTrue(真)・False(偽)の値を持つことができる。RPGツクールをプレイした事がある人は解るハズ。
Private Count As Integer = 0
経過秒数を保持する為の変数。
「Integer」は整数値を保持する型。
Private Const TimeLimit As Integer = 180
タイマーの終了時間を保持する変数。この数値を変える事で時間を変えることができる。3分は180秒。
「Const」はこの変数の値を固定するという意味。後のソースからミスで値を変えられたくない場合はこれで安心。
If fStart = False Then
・・・
End If
たぶんプログラミングで一番使用する事が多いのが、このif文と呼ばれる判定式。
見たまんまの動作で、If(もしも)~が成立した場合のみ、End Ifの間に書かれたソースを実行する。
If fStart = False Then
↑の判定がTrue(真)ならここを実行
Else
False(偽)ならここを実行
End If
また、上記のようにEnd If の前にElseを書くことで、False(偽)の場合の動作を記述することができる。
サンプルでは、タイマーが起動していない場合のみ処理を行うようにしている。
Timer1.Start()
タイマーを起動する。前項のプロパティ設定で「Interval = 1000」と設定しているので、1秒毎にタイマーイベントが発動する。Start()の部分は関数と呼ばれる物で、この場合はコントロールで用意されたものであり特に深く考える必要は無い。唱えれば起動するよぐらいの魔法です。
fStart = True
タイマー起動のフラグを立てる。
bStart.Enabled = False
bStop.Enabled = True
ボタンの選択可否を設定。見えるけど触れなくしたりする。
4.タイマーイベントを書く
次にタイマーイベントをコーディングしていく。デザイナを表示し、Timer1を選択する。その状態でプロパティウィンドウの雷マークをクリックすると、このコントロールが持つイベントが一覧で表示される。
イベント一覧の「Tick」をダブルクリックすると、先程と同様で自動的にソースコードに追加される。
' タイマーイベント Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If fStart = True Then ' タイマーが起動している場合は実行 ' 経過秒数に1秒足す Count = Count + 1 If Count < TimeLimit Then ' タイムリミット内ならここを実行 ' 残り時間を計算する Dim Time As Integer = TimeLimit - Count ' 分 Dim Minute As Integer = Math.Floor(Time / 60) ' 秒 Dim Second As Integer = Time Mod 60 ' ラベルの文字を更新する Label1.Text = "残り " & Minute.ToString & "分" & Second.ToString & "秒" Else ' タイムリミットに達したらここを実行 ' ラベルの文字を更新する Label1.Text = "時間だよ!" ' タイマーを停止 Timer1.Stop() ' フラグを消す fStart = False ' 経過時間を初期化 Count = 0 ' ボタンの選択可否を設定 bStart.Enabled = True bStop.Enabled = False End If End If End Sub
タイマーイベント内に上記を記述する。
先ずタイマーが起動しているかの判定を行う(本当はこれいらないんだけどね)。
次に経過時間を保持する変数"Count"に1を追加する。プログラミングで行う演算式は、数学等で使用する演算式とは少し異なっており、代入先を左側に書くのが特徴だ。
Count(代入先) = Count + 1(計算式)
この場合は1を足しているだけなので
Count += 1
と書いてもよい。
また、VBの"="は代入と等価判定の二つの意味を持っている。C言語等では代入は"="、等価判定は"=="と別々なのだが、VBは困ったことにごっちゃなので注意すること。
例:
VBの場合
If hoge = 1 then ←ここは等価判定
hoge = 1 ←ここは代入
End If
Cの場合
If ( hoge == 1 ) { ←ここは等価判定
hoge = 1; ←ここは代入
}
次にタイムリミット内であれば、残り分秒を計算してラベルに表示する。
Dim Time As Integer = TimeLimit - Count
は変数「TimeLimit」から経過時間「Count」を引いて、残り秒数を変数「Time」に代入をしている。この様に変数同士でも計算することも可能。
Dim Minute As Integer = Math.Floor(Time / 60)
ここで分を変数「Minute」に代入している。
まず”Time / 60”は”残り秒数÷60秒”という意味である。その計算結果を”Math.Floor(ここ)”に入れ、小数点以下を切り捨て整数として返している。
Dim Second As Integer = Time Mod 60
次に秒数を取得する。Modという演算子を使用しているが、これは”Time”を60(1分)で割った余りを返すという意味。60で割り切れなかった余りは秒数となる。
例: 残り78秒 Mod 60 = 1分 余り 18秒
Label1.Text = "残り " & Minute.ToString & "分" & Second.ToString & "秒"
ここでラベルコントロールの文字を変更している。
まず"残り "や"分"・"秒"だが、""で囲まれている部分は文字列を表している。
&は文字列を結合するという意味。
”ToString”は、整数値型のInteger型を文字列型のString型に変換するという意味。これは数値->文字列に変換する場合は記述しなくても暗黙的に変換してくれるのだが、文字列->数値の場合にはエラーの原因となる事が多いので明示的に書いていた方が後々見直したときにも楽。
上にも書いたが、型とは入れ物のことであり、入れるモノが別の型だったらエラー吐く場合があるので注意してほしい。
最後にタイムリミットに達した時には、タイマーを止め、経過時間を初期化したりなんやかんやする。
5.タイマーを途中で止めれるようにする。
このままでは3分経つまで何も動作を受け付けないプログラムになってしまうので、途中で止めれるように、bStopボタンに停止処理をコーディングする。
項目3と同じ要領で、デザイナからbStopボタンをダブルクリックしイベントコードを作成する。
' ストップボタン クリックイベント Private Sub bStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStop.Click If fStart Then ' タイマーが起動している場合は実行 ' ラベルの文字を更新する Label1.Text = "" ' タイマーを停止 Timer1.Stop() ' フラグを消す fStart = False ' 経過時間を初期化 Count = 0 ' ボタンの選択可否を設定 bStart.Enabled = True bStop.Enabled = False End If End Sub
ここのソースは前項のタイムリミット時とほぼ同じなので説明は省く。
以下ソースコード全体
Public Class Form1 ' タイマー起動フラグ Private fStart As Boolean = False ' 経過秒数 Private Count As Integer = 0 ' タイマー時間 Private Const TimeLimit As Integer = 180 ' スタートボタン クリックイベント Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click ' もし、タイマーが起動していなかったら If fStart = False Then ' タイマーを起動する Timer1.Start() ' フラグを立てる fStart = True ' スタートボタンを選択できないようにする bStart.Enabled = False ' ストップボタンを選択できるようにする bStop.Enabled = True End If End Sub ' タイマーイベント Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If fStart = True Then ' タイマーが起動している場合は実行 ' 経過秒数に1秒足す Count += 1 If Count < TimeLimit Then ' タイムリミット内ならここを実行 ' 残り時間を計算する Dim Time As Integer = TimeLimit - Count ' 分 Dim Minute As Integer = Math.Floor(Time / 60) ' 秒 Dim Second As Integer = Time Mod 60 ' ラベルの文字を更新する Label1.Text = "残り " & Minute.ToString & "分" & Second.ToString & "秒" Else ' タイムリミットに達したらここを実行 ' ラベルの文字を更新する Label1.Text = "時間だよ!" ' タイマーを停止 Timer1.Stop() ' フラグを消す fStart = False ' 経過時間を初期化 Count = 0 ' ボタンの選択可否を設定 bStart.Enabled = True bStop.Enabled = False End If End If End Sub ' ストップボタン クリックイベント Private Sub bStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStop.Click If fStart Then ' タイマーが起動している場合は実行 ' ラベルの文字を更新する Label1.Text = "" ' タイマーを停止 Timer1.Stop() ' フラグを消す fStart = False ' 経過時間を初期化 Count = 0 ' ボタンの選択可否を設定 bStart.Enabled = True bStop.Enabled = False End If End Sub End Class
最後になったが" ' ~"はコメントと呼ばれるもので、ソースコード内に「ここはこんな事してますよ」とメモ書きみたいなもの。これを怠ると1年後とかに泣くことになるので、小まめに書いとくのが吉。