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

[ 目次へ | 第10回へ | 第12回へ ]

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

前回、電卓アプリケーションのプロシージャを作成しましたが、内容についてはふれませんでした。今回はプロシージャの処理を確認して、電卓アプリケーションの作成を完結します。

各プロシージャで処理するべき内容は、第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コントロールを使っているために、マシンの性能によってはかなり動作が遅く感じられると思います。次回はこの電卓アプリケーションをチューンアップして、講座を閉じることにします。

[ 目次へ | 第10回へ | 第12回へ ]


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