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

[ 目次へ | 第9回へ | 第11回へ ]

今回の目標
前回に続いてコーディングをします。
今回は、プロシージャの定義と、CPadでの入力方法です。

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

第5回で見たように、電卓には5種類の処理があります。

今回は演算子のキーが押された時の処理と、=が押された時の処理を一つにまとめて、4つの大きなプロシージャを作成します。

機能 種類 名前 引数
数字が押された時の処理 Subプロシージャ OnNumber(intKey) 押された数字キー(ごとに割り当てられた値)
演算子が押された時の処理 Subプロシージャ OnOperation(intOp) 押された演算子キー(ごとに割り当てられた値)
Cが押された時の処理 Subプロシージャ OnClear() なし
CEキーが押された時の処理 Subプロシージャ OnClearEntry() なし

以上のプロシージャを作成します。OnNumberを例に説明します。まずは前回と同じようにScriptWizardを開きます。つまり、

  1. HTMLファイルの「<OBJECT CLASSID=」の左側にあるアイコンをクリック
  2. calc.alx(電卓の画面デザインウィンドウ)を表示される
  3. メニューで「Tools/Script Wizard」を選ぶ

とします。これで準備ができました。早速、OnNumberを作成しましょう。次の手順です。

  1. 右上の「Insert Actions」ペイン内で右クリック
  2. メニューの「New Procedure」を選択
  3. 下の「Code View」ペインに「Sub Procedure1()」という行が表示される(もしList Viewが選択されていれば、Code Viewに切り替えます)
  4. 「Procedure1()」の部分を「OnNumber(intKey)」と書き換える

OnNumberの中身は、以下の通りです。

    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

これを、CodeViewペインで「Sub OnNumber(intKey)」の下に記述します。行の先頭にスペースが入っているものがありますが(インデントと言います)、これは処理上は全く意味がありません。人間がソースを読む時に見やすくするためのものです

同じ手順で、他のプロシージャも作成してください。それぞれのプロシージャの中身は以下の通りです。

Sub OnOperation(intOp)
    if intPrevOperation = OP_ERROR then exit sub

    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_DEVIDE
            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_DEVIDE
        intPrevOperation = OP_DEVIDE
        dblCurrentNumber = CDbl(lblNumber.Caption)
    end select

    if intOp = OP_EQUAL then
        intLastKey = KEY_EQUAL
    else
        intLastKey = KEY_OTHER
    end if
end sub

Sub OnClear()
    ' 全てクリア
    dblPrevNumber = 0
    intPrevOperation = OP_NO
    intLastKey = KEY_OTHER
    call OnClearEntry()
end sub

Sub OnClearEntry()
    if intPrevOperation = OP_ERROR then exit sub

    dblCurrentNumber = 0
    lblNumber.Caption = "0"
end sub

それぞれのプロシージャの最後にある「end sub」は入力する必要はありません。ScriptWizardを終了すると自動的に追加されています。


以上のプロシージャを作成しても、まだ電卓アプリケーションは動作しません。いつこれらのプロシージャを実行したらいいのかわからないからです。そこで、これらのプロシージャを実行するきっかけとなるハンドラを作成しましょう。
「ユーザーがキーを押した」、「HTMLファイルがブラウザに読み込まれた」などの動作(イベントと言います)に対応するプロシージャのことを、ハンドラと呼びます。

電卓アプリケーションでは、ボタンが押された時のハンドラとHTMLファイルがブラウザに読み込まれた時のハンドラ(アプリケーションの初期化)を作成します。

先ほど作成したOnNumberなどのプロシージャ(ハンドラでないプロシージャ)は、自由に名前を決めて作ることができますが、ハンドラは決められた名前があります。ハンドラはInternet Explorerが呼び出すものなので(ボタンが押されたことは、IEが電卓アプリケーションに教えてくれます)、好き勝手な名前を付けるとIEにはハンドラであることが分からなくなるからです。

とはいえ、CPadを使っている限りは、ハンドラの名前に苦労することはありません。自動的に適切な名前を付けてくれます。ですから必要な操作は、どのイベントに対するハンドラを用意するかを指示することだけです。


まず、ボタンが押された時のハンドラを作成しましょう。ここでもまたScriptWizardを使います。ScriptWizardの開き方はここでは省略します。このページの、上の方を見てください。
ハンドラの作成は、今まで使ってこなかった、ScriptWizardの左上のペイン、「Select an Event」というペインを使います。この中には、電卓のデザインで配置したコントロールの名前が表示されているはずです。

例として、ここでは「0」のボタンが押された時のハンドラを作成します。このボタンには、第8回の説明通りに作成していれば、「cmd0」という名前を付けているはずです。左上のペインで「cmd0」というコントロールを探して、すぐ左にある「+」をクリックしてください。ここで表示されるリストは、このボタンで発生させることができるイベントです。今回は「0というボタンが押された」というイベントだけが必要なので、Clickイベントを選択します。
下のペインに、「Sub cmd0_Click()」と表示されます。これで、「0」ボタンのClickイベントが作成されました。このイベントでは、上で作成したOnNumberプロシージャを呼び出します。下の行に「call OnNumber(0)」と書いてください。「call OnNumber」とは、「OnNumberプロシージャを呼び出します」という意味です。また、「(0)」は「0が押されたことをOnNumberに教える」ためです。

同じ要領で、1〜9のボタン(cmd1〜cmd9)のハンドラも作成してください。それぞれ、ハンドラの中身はOnNumber(1)〜OnNumber(9)としてください。
「.」(小数点)ボタンも、この電卓アプリケーションでは数字として扱います。「cmdPeriod」のハンドラは「call OnNumber(-1)」としてください。OnNumberプロシージャでは、-1を受け取ると小数点として処理するように記述しています。

演算子とC、CEのハンドラの中身は以下の通りです。

ボタン ハンドラ 中身
C Sub cmdClear_Click() call OnClear()
CE Sub cmdClearEntry_Click() call OnClearEntry()
= Sub cmdEqual_Click() call OnOperation(OP_EQUAL)
+ Sub cmdPlus_Click() call OnOperation(OP_PLUS)
- Sub cmdMinus_Click() call OnOperation(OP_MINUS)
* Sub cmdMultiple_Click() call OnOperation(OP_MULTIPLE)
/ Sub cmdDevide_Click() call OnOperation(OP_DEVIDE)

最後に「HTMLファイルがブラウザに読み込まれた」時のハンドラを作成します。この時は電卓を初期化しなければなりません。

HTMLファイルがブラウザに読み込まれた時のハンドラは、calcコントロール(電卓自身のこと)のOnLoadです。今までと同じように、左上のペインでcalcをさがし、そのOnLoadをクリックしてください。
電卓の初期化は、OnClearで行っていますから、OnLoadではこれを呼び出すことにします。つまり「Sub calc_OnLoad()」の下には、「call OnClear()」と入力します。


以上で、電卓アプリケーションは完成しました!
プロシージャの説明は今回は省略しましたが、ともかく完成しました。実際にIEに読み込んで、動作させてみてください。

次回は、各プロシージャの内容を説明します。

[ 目次へ | 第9回へ | 第11回へ ]


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