前回、電卓アプリケーションのプロシージャを作成しましたが、内容についてはふれませんでした。電卓アプリケーションはすでに完成しましたが、Visual
Basicとプログラミングの理解を進めるために、今回はプロシージャの処理を確認してみます。
各プロシージャで処理するべき内容は、第2回と第6回で考えました。そのページを参照してください。
以下のプロシージャ(ハンドラ)について、説明します。
以下の説明では、説明しやすいようにソースコードの各行の先頭に行番号をつけています。
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行目)、押されたキーが数字キーであることを覚えておきます。
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では、すべての変数をクリアします。つまり、数値(二つとも)と記憶している演算子は全てなし、直前に押されたキーもなしの状態です。変数をクリアするために、それぞれの変数に
0 や OP_NO などを代入しています。
二つ目の数値のクリアは、OnClearEntryでも同じ処理をしますから、OnClearではOnClearEntryを呼び出しています。ただし、わかりきった短い処理なので、OnClearの中に直接処理を記述してもかまわないと思います。
OnClearEntryでは、現在入力中の数値をクリアします。また、電卓の画面からも入力済みの数値を消します(0
にする)。
dblCurrentNumberは数値を記憶する変数なので 0 という数値を、lblNumberは文字を表示する場所なので
"0" という文字を表示させます。
フォームが読み込まれた時とは、すなわち電卓アプリケーションが起動された時です。ここで行わなければならない処理はOnClearと同じです。そこで、calc_OnLoadは単にOnClearを呼び出すだけです。
これも簡単な呼び出しです。キーにあわせて、OnNumberかOnOperationを呼び出しています。引数として自分自身のキーを表す値を渡しています。
いかがでしょうか。作成した電卓アプリケーションが少しでも理解できたでしょうか。
自分なりに理解できたようならば、電卓アプリケーションに機能を追加してもいいでしょう。今回作成した電卓は、VBとプログラミングの教材ということもあり、最低限の機能しか持っていません。これに、メモリ機能、関数演算などの機能を追加してみるといいでしょう。電卓は比較的簡単なアプリケーションであり、またここまで作成した内容を理解できれば、機能の追加はそれほど難しくないと思います。
簡単なアプリケーションとは言うものの、ともかくVBでのプログラミングを完成することができました。これをもとに、もっと複雑な、もっと大規模なプログラミングをぜひとも楽しんでください。
つたない説明におつきいいただき、ありがとうございました。
瀬尾佳隆 (webmaster@seosoft.net) |