前回、電卓アプリケーションの変数と定数を用意しました。今回は、プロシージャを作成します。
第6回で見たように、電卓には以下の処理があります。
今回は演算子のキーが押された時の処理と、=が押された時の処理を一つにまとめて、4つの大きなプロシージャを作成します。
| 機能 | 種類 | 名前 | 引数 |
| 数字が押された時の処理 | Subプロシージャ | OnNumber(intKey As Integer) | 押された数字キー(ごとに割り当てられた値) |
| 演算子が押された時の処理 | Subプロシージャ | OnOperation(intOp As Integer) | 押された演算子キー(ごとに割り当てられた値) |
| Cが押された時の処理 | Subプロシージャ | OnClear() | なし |
| CEキーが押された時の処理 | Subプロシージャ | OnClearEntry() | なし |
それでは、上記のプロシージャを作成していきましょう。
コードを記述するためには(第8回でも同じ操作しましたが)、プロジェクトエクスプローラでfrmMainを選択し、[コードの表示]ボタンをクリックします(図)。コードが表示されたら、メニューで[ツール]-[プロシージャの追加]を選択して、スケルトン(プロシージャの骨組み)を作成します。
まず、OnNumberプロシージャからはじめましょう。図のように入力して[OK]ボタンをクリックします。なお、適用範囲としてPrivateを選択してください。
コードのウィンドウに戻ると、図のようなコードの骨組みが追加されているはずです。上の表のように、OnNumberは引数を持っているはずですが、残念ながらプロシージャの追加ダイアログボックスでは引数を指定することはできません。コードウィンドウに戻ってから「OnNumber(intKey
As Integer)」となるように太字の部分を追加してください。
詳しくは説明しませんが、Publicはどこからでも呼び出せるプロシージャ、Privateは同じモジュール内(今回であればfrmMainの中)からのみ呼び出せるプロシージャということです。今回の電卓は、frmMainがただ一つのモジュールになる予定ですので、Privateで十分です。Publicにしても動作しますので、どちらにしたらいいかわからない場合はとりあえずPublicにしてもいいでしょう。ただしきちんとした開発をする場合は、呼び出し側がどこに存在するかを考えて決めなければなりません。
OnOperation、OnClear、OnClearEntryの各プロシージャも同様に操作してください。OnOperationは引数を後から追加することも忘れずに。
プロシージャの骨組みが作成されたので、今度はそれぞれの処理の中身を入力していきます。それぞれ次のように入力してください。
Private Sub OnNumber(intKey As Integer)
If intPrevOperation = OP_ERROR Then Exit Sub
If intLastKey <> KEY_NUMBER Then
lblNumber.Caption = "0"
End If
If intKey = -1 Then
lblNumber.Caption = lblNumber.Caption & "."
Else
If lblNumber.Caption = "0" Then
lblNumber.Caption = CStr(intKey)
Else
lblNumber.Caption = lblNumber.Caption & CStr(intKey)
End If
End If
dblCurrentNumber = CDbl(lblNumber.Caption)
intLastKey = KEY_NUMBER
End Sub
Private Sub OnOperation(intOp As Integer)
If intPrevOperation = OP_ERROR Then
Exit Sub
End If
If intLastKey = KEY_NUMBER Or intOp = OP_EQUAL Then
Select Case intPrevOperation
Case OP_PLUS
dblPrevNumber = dblPrevNumber + dblCurrentNumber
lblNumber.Caption = CStr(dblPrevNumber)
Case OP_MINUS
dblPrevNumber = dblPrevNumber - dblCurrentNumber
lblNumber.Caption = CStr(dblPrevNumber)
Case OP_MULTIPLE
dblPrevNumber = dblPrevNumber * dblCurrentNumber
lblNumber.Caption = CStr(dblPrevNumber)
Case OP_DIVIDE
If dblCurrentNumber = 0 Then
lblNumber.Caption = "E"
intPrevOperation = OP_ERROR
Exit Sub
Else
dblPrevNumber = dblPrevNumber / dblCurrentNumber
lblNumber.Caption = CStr(dblPrevNumber)
End If
End Select
End If
dblPrevNumber = CDbl(lblNumber.Caption)
Select Case intOp
Case OP_PLUS
intPrevOperation = OP_PLUS
dblCurrentNumber = CDbl(lblNumber.Caption)
Case OP_MINUS
intPrevOperation = OP_MINUS
dblCurrentNumber = CDbl(lblNumber.Caption)
Case OP_MULTIPLE
intPrevOperation = OP_MULTIPLE
dblCurrentNumber = CDbl(lblNumber.Caption)
Case OP_DIVIDE
intPrevOperation = OP_DIVIDE
dblCurrentNumber = CDbl(lblNumber.Caption)
End Select
If intOp = OP_EQUAL Then
intLastKey = KEY_EQUAL
Else
intLastKey = KEY_OTHER
End If
End Sub
Private Sub OnClear()
dblPrevNumber = 0
intPrevOperation = OP_NO
intLastKey = KEY_OTHER
Call OnClearEntry
End Sub
Private Sub OnClearEntry()
If intPrevOperation = OP_ERROR Then Exit Sub
dblCurrentNumber = 0
lblNumber.Caption = "0"
End Sub
これだけではまだ動きません。その理由は、電卓アプリケーションは、いつこれらのプロシージャを実行したらいいのかわからないからです。そこで、これらのプロシージャを実行するきっかけとなるハンドラを作成しましょう。
「ユーザーがキーを押した」、「HTMLファイルがブラウザに読み込まれた」などの動作(イベントと言います)に対応するプロシージャのことを、ハンドラと呼びます。
電卓アプリケーションでは、ボタンが押された時のハンドラと電卓アプリケーションのフォームが最初に読み込まれた時のハンドラ(アプリケーションの初期化)を作成します。
先ほど作成したOnNumberなどのプロシージャ(ハンドラでないプロシージャ)は、自由に名前を決めて作ることができますが、ハンドラは決められた名前があります。ハンドラはVBのランタイムライブラリが呼び出すものなので(ボタンが押されたことは、ランタイムライブラリが電卓アプリケーションに教えてくれます)、好き勝手な名前を付けるとランタイムライブラリにはハンドラであることが分からなくなるからです。
とはいえ、VBを使っている限りは、ハンドラの名前に苦労することはありません。自動的に適切な名前を付けてくれます。ですから必要な操作は、どのイベントに対するハンドラを用意するかを指示することだけです。しかも、その指示も簡単です。早速操作してみましょう。
最初にフォームが読み込まれるときのハンドラの骨組みを用意します。プロジェクトエクスプローラで、frmMainをダブルクリックしてfrmMainを表示させます。そうしたら、フォームの地の部分(ボタンやラベル以外の場所)をダブルクリックします。こうすると、自動的にフォームのコードが表示(すでに開かれている場合は一番上に表示)され、「Private Sub Form_Load()」とそれに対応する「End Sub」という行が追加されているはずです。
各ボタン(数字、演算子、C、CE)のハンドラも同様の操作をします。つまり、フォームで各ボタンをダブルクリックします。それぞれのハンドラの骨組みがコードに追加されるはずです。
このように、コントロール(やフォーム)をダブルクリックすることによってハンドラの骨組みが自動的に生成されたり、すでに生成されている場合はその位置にジャンプしたりしますが、これは各コントロールのデフォルトの動作のみできることです。各コントロールには普通複数の動作のハンドラが定義できます。このような場合には、コードウィンドウの上段にある2つのドロップダウンリストを使います。まず左側のオブジェクトリストでハンドラを作成したい(またはハンドラを表示させたい)コントロールを選択します。次に右側のプロシージャリストでハンドラの指定をします。
各ハンドラのコードは以下のように入力してください。
Private Sub cmd0_Click()
Call OnNumber(0)
End Sub
Private Sub cmd1_Click()
Call OnNumber(1)
End Sub
Private Sub cmd2_Click()
Call OnNumber(2)
End Sub
Private Sub cmd3_Click()
Call OnNumber(3)
End Sub
Private Sub cmd4_Click()
Call OnNumber(4)
End Sub
Private Sub cmd5_Click()
Call OnNumber(5)
End Sub
Private Sub cmd6_Click()
Call OnNumber(6)
End Sub
Private Sub cmd7_Click()
Call OnNumber(7)
End Sub
Private Sub cmd8_Click()
Call OnNumber(8)
End Sub
Private Sub cmd9_Click()
Call OnNumber(9)
End Sub
Private Sub cmdClear_Click()
Call OnClear
End Sub
Private Sub cmdClearEntry_Click()
Call OnClearEntry
End Sub
Private Sub cmdDivide_Click()
Call OnOperation(OP_DIVIDE)
End Sub
Private Sub cmdEqual_Click()
Call OnOperation(OP_EQUAL)
End Sub
Private Sub cmdMinus_Click()
Call OnOperation(OP_MINUS)
End Sub
Private Sub cmdMultiple_Click()
Call OnOperation(OP_MULTIPLE)
End Sub
Private Sub cmdPeriod_Click()
Call OnNumber(-1)
End Sub
Private Sub cmdPlus_Click()
Call OnOperation(OP_PLUS)
End Sub
Private Sub Form_Load()
Call OnClear
End Sub
以上で、電卓アプリケーションは完成しました!
プロシージャの説明は今回は省略しましたが、ともかく完成です。VBのメニューの[実行]-[開始]で実際に電卓アプリケーションを動作させてみてください。
また、製品版VB(Control Creation Edtion以外の版)をお持ちの方は、[ファイル]-[Calc.exeの作成]も選択して、実際にEXE形式の実行ファイルを作ってみてください。これで、VBの環境の外でも電卓アプリケーションは動作するようになります。
次回は、本講座の最終回です。締めくくりとして、各プロシージャの解説を通して、VBでのプログラミングの理解を深めることにします。
| 瀬尾佳隆 (webmaster@seosoft.net) |