第9回 - コーディング(プロシージャ)

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

今回の目標
前回に続いてコーディングをします。
今回は、プロシージャを定義し、電卓を完成させます。

前回、電卓アプリケーションの変数と定数を用意しました。今回は、プロシージャを作成します。

第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でのプログラミングの理解を深めることにします。

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


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