前回、電卓アプリケーションの変数と定数を用意しました。今回は、プロシージャを作成します。
第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) |