前回、電卓アプリケーションの変数と定数を用意しました。今回は、プロシージャを作成します。
第5回で見たように、電卓には5種類の処理があります。
今回は演算子のキーが押された時の処理と、=が押された時の処理を一つにまとめて、4つの大きなプロシージャを作成します。
機能 | 種類 | 名前 | 引数 |
数字が押された時の処理 | Subプロシージャ | OnNumber(intKey) | 押された数字キー(ごとに割り当てられた値) |
演算子が押された時の処理 | Subプロシージャ | OnOperation(intOp) | 押された演算子キー(ごとに割り当てられた値) |
Cが押された時の処理 | Subプロシージャ | OnClear() | なし |
CEキーが押された時の処理 | Subプロシージャ | OnClearEntry() | なし |
以上のプロシージャを作成します。OnNumberを例に説明します。まずは前回と同じようにScriptWizardを開きます。つまり、
とします。これで準備ができました。早速、OnNumberを作成しましょう。次の手順です。
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に読み込んで、動作させてみてください。
次回は、各プロシージャの内容を説明します。
瀬尾佳隆 (webmaster@seosoft.net) |