前回、電卓アプリケーションのプロシージャを作成しましたが、内容についてはふれませんでした。今回はプロシージャの処理を確認して、電卓アプリケーションの作成を完結します。
各プロシージャで処理するべき内容は、第2回と第5回で考えました。そのページを参照してください。
以下のプロシージャ(ハンドラ)について、説明します。
OnNumber
説明しやすいように、各行の先頭に行番号を付けたソースコードを以下に示します。
1: Sub OnNumber(intKey) 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キーでクリアするまで他の操作をすべて禁止します。
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
OnNumberと同じように行番号付きのソースコードを以下に示します。
1: Sub OnOperation(intOp) 2: dim intResult 3: 4: if intPrevOperation = OP_ERROR then exit sub 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_DEVIDE 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_DEVIDE 42: intPrevOperation = OP_DEVIDE 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行目)。
29行目は、電卓に表示されている数値を一つ目の数値の変数に代入しています。これは演算子の後のキーは数値であることが予想されますが、現在表示されている数値を一つ目の数値として扱い、この次に押される数字キーを二つ目の数値として扱うための処理です。
31〜44行目は、今回押されたキーが四則演算子のキーであった場合に限り、つまり「=」キー以外であった場合の処理です。そのキーの種類によってそれぞれ二つの処理をしています。一つは、今回の演算子をintPrevOperationに記憶しています。もう一つは、すべての演算子に共通の処理で、電卓の表示を二つ目の数値の変数に代入しています。これは、+ =、- =などのキー操作の時に正しく演算するためです(第2回を参照してください)。
46〜50行目では、今回のキーの種類をintPrevKeyに記憶しています。
OnClear
OnClearでは、すべての変数をクリアします。つまり、数値(二つとも)と記憶している演算子はなし、直前に押されたキーもなしの状態です。変数をクリアするために、それぞれの変数に
0 や OP_NO などを代入しています。
二つ目の数値のクリアは、OnClearEntryでも同じ処理をしますから、OnClearではそれを呼び出しています。
OnClearEntry
OnClearEntryでは、現在入力中の数値をクリアします。また、電卓の画面からも入力済みの数値を消します(0
にする)。
dblCurrentNumberは数値を記憶する変数なので 0 という数値を、lblNumberは文字を表示する場所なので
"0" という文字を表示させます。
calc_OnLoad
ページが読み込まれた時とは、すなわち電卓を使い始める時です。ここで行わなければならない処理は、OnClearと同じです。そこで、calc_OnLoadは単にOnClearを呼び出すだけです。
作成した電卓アプリケーションの内容を把握できたでしょうか?
何度か繰り返しましたが、電卓アプリケーションは比較的簡単なアプリケーションです。特に今回作成したものは、教材ということもあり、基本的な機能しか持っていません。
例えば、メモリ機能、パーセント計算など、市販の電卓の機能を追加すると役に立つアプリケーションになるかもしれません。ぜひ挑戦してみてください。
次回は最終回です。今回までで作成したアプリケーションはLayoutコントロールを使っているために、マシンの性能によってはかなり動作が遅く感じられると思います。次回はこの電卓アプリケーションをチューンアップして、講座を閉じることにします。
瀬尾佳隆 (webmaster@seosoft.net) |