第10回 - プロシージャの解説

[ 目次へ | 第9回へ ]

今回の目標
前回作成した、プロシージャの中身を見てみます。
アプリケーションのソースコードを通して、Visual Basicを理解します。

前回、電卓アプリケーションのプロシージャを作成しましたが、内容についてはふれませんでした。電卓アプリケーションはすでに完成しましたが、Visual Basicとプログラミングの理解を進めるために、今回はプロシージャの処理を確認してみます。

各プロシージャで処理するべき内容は、第2回第6回で考えました。そのページを参照してください。


以下のプロシージャ(ハンドラ)について、説明します。


OnNumber

以下の説明では、説明しやすいようにソースコードの各行の先頭に行番号をつけています。

 1 : Private Sub OnNumber(intKey As Integer)
 2 :     If intPrevOperation = OP_ERROR Then Exit Sub
 3 : 
 4 :     If intLastKey <> KEY_NUMBER Then
 5 :         lblNumber.Caption = "0"
 6 :     End If
 7 : 
 8 :     If intKey = -1 Then
 9 :         lblNumber.Caption = lblNumber.Caption & "."
10 :     Else
11 :         If lblNumber.Caption = "0" Then
12 :             lblNumber.Caption = CStr(intKey)
13 :         Else
14 :             lblNumber.Caption = lblNumber.Caption & CStr(intKey)
15 :         End If
16 :     End If
17 : 
18 :     dblCurrentNumber = CDbl(lblNumber.Caption)
19 :     intLastKey = KEY_NUMBER
20 : End Sub 

2行目で、エラーが発生していないかのチェックをします。エラーは(後のコードで出てきますが)、0で除算をした後に発生します。また、このエラーはCキーをクリックすることでかいじょされます。それまでは他の操作をすべて禁止するためのコードが、2行目です。
4〜6行目では、直前のキーが数字ではない場合、つまり演算子キーであった場合(電卓の使い始めの場合もこれに該当しますが)の処理です。今回のキーから新しい数値の入力が始まったので、8行目からの処理にそなえて、電卓の表示を0にします。

8〜16行目は、電卓の表示を更新します。入力されたキーとして、intKeyに-1が入っていれば、今回のキーは小数点であったことになります(cmdPeriod_Clickプロシージャで、OnNumber(-1)としているので)。そこで、現在の電卓の表示に、"."をつなげます。9行目は、「電卓の表示(lblNumber.Caption)と"."を連結して(&は文字列の連結に使います)、その結果をlblNumber.Captionに代入しています。
intKeyが-1以外の場合には、0〜9の数字が押されたことになります。単純に押されたキーに応じた値を電卓の表示に連結します。この時、元の表示が0であった場合は、今回のキーだけを表示します。つまり、元々0であり、今回1を押したとすれば、結果は"01"ではなくて"1"とします。

18行目で、表示している数値(これは文字列)を数値に変換して、dblCurrentNumber、つまり二つ目の数値の変数に代入します。

最後に(19行目)、押されたキーが数字キーであることを覚えておきます。


OnOperation

 1 : Private Sub OnOperation(intOp As Integer)
 2 :     If intPrevOperation = OP_ERROR Then
 3 :         Exit Sub
 4 :     End If
 5 : 
 6 :     If intLastKey = KEY_NUMBER Or intOp = OP_EQUAL Then
 7 :         Select Case intPrevOperation
 8 :         Case OP_PLUS
 9 :             dblPrevNumber = dblPrevNumber + dblCurrentNumber
10 :             lblNumber.Caption = CStr(dblPrevNumber)
11 :         Case OP_MINUS
12 :             dblPrevNumber = dblPrevNumber - dblCurrentNumber
13 :             lblNumber.Caption = CStr(dblPrevNumber)
14 :         Case OP_MULTIPLE
15 :             dblPrevNumber = dblPrevNumber * dblCurrentNumber
16 :             lblNumber.Caption = CStr(dblPrevNumber)
17 :         Case OP_DIVIDE
18 :             If dblCurrentNumber = 0 Then
19 :                 lblNumber.Caption = "E"
20 :                 intPrevOperation = OP_ERROR
21 :                 Exit Sub
22 :             Else
23 :                 dblPrevNumber = dblPrevNumber / dblCurrentNumber
24 :                 lblNumber.Caption = CStr(dblPrevNumber)
25 :             End If
26 :         End Select
27 :     End If
28 : 
29 :     dblPrevNumber = CDbl(lblNumber.Caption)
30 : 
31 :     Select Case intOp
32 :     Case OP_PLUS
33 :         intPrevOperation = OP_PLUS
34 :         dblCurrentNumber = CDbl(lblNumber.Caption)
35 :     Case OP_MINUS
36 :         intPrevOperation = OP_MINUS
37 :         dblCurrentNumber = CDbl(lblNumber.Caption)
38 :     Case OP_MULTIPLE
39 :         intPrevOperation = OP_MULTIPLE
40 :         dblCurrentNumber = CDbl(lblNumber.Caption)
41 :     Case OP_DIVIDE
42 :         intPrevOperation = OP_DIVIDE
43 :         dblCurrentNumber = CDbl(lblNumber.Caption)
44 :     End Select
45 : 
46 :     If intOp = OP_EQUAL Then
47 :         intLastKey = KEY_EQUAL
48 :     Else
49 :         intLastKey = KEY_OTHER
50 :     End If
51 : End Sub

4行目は、OnNumberの最初と同じようにエラーチェックです。

6〜27行目では、二つの数値を演算しています。ただし、これは前回押されたキーが数値の時か、前回の演算子が=の時です。それ以外の時は、演算子の押しなおしです。9〜10行目は、前の演算子が+の時に実行されます。二つの数値を足しています。その結果は文字列に変換して電卓の表示にも反映させます。
11行目以降に、引き算、掛け算、割り算が続いています。割り算だけは特別の処理が追加されています。二つ目の数値が0の時は割り算はできないのでエラーを発生させています(19〜21行目)。OnNumberの説明で出てきたエラーとはこれのことです。

29行目は、電卓に表示されている数値を一つ目の数値の変数に代入しています。これは演算子の後のキーは数値であることが予想されますが、現在表示されている数値を一つ目の数値として扱い、この次に押される数字キーを二つ目の数値として扱うための処理です。

31〜44行目は、今回押されたキーが四則演算子のキーであった場合に限り、つまり「=」キー以外であった場合の処理です。そのキーの種類によってそれぞれ二つの処理をしています。一つは、今回の演算子をintPrevOperationに記憶しています。もう一つは、すべての演算子に共通の処理で、電卓の表示を二つ目の数値の変数に代入しています。これは、+ =、- =などのキー操作の時に正しく演算するためです(第2回を参照してください)。

46〜50行目では、今回のキーの種類をintPrevKeyに記憶しています。


OnClear

OnClearでは、すべての変数をクリアします。つまり、数値(二つとも)と記憶している演算子は全てなし、直前に押されたキーもなしの状態です。変数をクリアするために、それぞれの変数に 0 や OP_NO などを代入しています。
二つ目の数値のクリアは、OnClearEntryでも同じ処理をしますから、OnClearではOnClearEntryを呼び出しています。ただし、わかりきった短い処理なので、OnClearの中に直接処理を記述してもかまわないと思います。


OnClearEntry

OnClearEntryでは、現在入力中の数値をクリアします。また、電卓の画面からも入力済みの数値を消します(0 にする)。
dblCurrentNumberは数値を記憶する変数なので 0 という数値を、lblNumberは文字を表示する場所なので "0" という文字を表示させます。


Form_Load

フォームが読み込まれた時とは、すなわち電卓アプリケーションが起動された時です。ここで行わなければならない処理はOnClearと同じです。そこで、calc_OnLoadは単にOnClearを呼び出すだけです。


cmdXXX_Click

これも簡単な呼び出しです。キーにあわせて、OnNumberかOnOperationを呼び出しています。引数として自分自身のキーを表す値を渡しています。


いかがでしょうか。作成した電卓アプリケーションが少しでも理解できたでしょうか。

自分なりに理解できたようならば、電卓アプリケーションに機能を追加してもいいでしょう。今回作成した電卓は、VBとプログラミングの教材ということもあり、最低限の機能しか持っていません。これに、メモリ機能、関数演算などの機能を追加してみるといいでしょう。電卓は比較的簡単なアプリケーションであり、またここまで作成した内容を理解できれば、機能の追加はそれほど難しくないと思います。

簡単なアプリケーションとは言うものの、ともかくVBでのプログラミングを完成することができました。これをもとに、もっと複雑な、もっと大規模なプログラミングをぜひとも楽しんでください。

つたない説明におつきいいただき、ありがとうございました。

[ 目次へ | 第9回へ ]


メール 瀬尾佳隆 (webmaster@seosoft.net)