まだかきかけよん。
palmwareにおいても、GUIをつかさどるフォ−ムやラベルなどは、実行コードとは別にリソースとして用意する。また、フォームをタップしたり、ジョグダイアルを廻したり、電源ボタンを押したりするのは、すべてイベントとしてイベントキューに入れられる。これらを適切に処理してやることで、GUIを用いたアプリケーションを実装していく。
このページでは、リソースを prcファイルに組みこむ方法、ロジックからリソースを利用する方法、イベント処理の基本パターンについて説明する。
具体的な作業内容は、以下のようになる:
アプリケーションを起動すると、画面全体をフォームで覆い、中央に "Hello World!" という文字列を表示し、画面中央のボタンを押すと電源を切り、アプリケーションアイコンをタップすると終る。そんなアプリを作成してみよう。
リソースの定義の仕方は、開発環境によって異なる。このページではgcc系を使った PRC-Tools の環境なので、リソースは rcpという拡張子を持つテキストファイルで定義する*。
rcpのファイルフォーマットについては、 pilrc_src.tgz を展開したディレクトリの doc/manual.htmlファイルに書いてある。ここではサンプルとして、画面全体を覆うFormと、その中央に配置したボタンを定義しよう:
これを、例えば MyFirstApp.rcp というファイル名で保存する。
こんな感じ。
最初のpilrcで、リソース定義ファイルをリソースバイナリにする。
この時点で、 tFRM03e8.bin というファイルが出来る。
その次に、Cソースファイルをコンパイルし、mc68k COFF object という型式の a.out というファイルを作成している。
最後で、a.outからコードリソースを取りだし、さっき作った tFRM03e8.binと一緒に束ねて、a.prc という名前の PalmOS application ファイルにしている。*
なお、この段階では、リソースを利用するコードを書いていないので、動かしてみても変化はない。
*ここでは手順を省略しているが、よりこまかくステップを踏むなら、以下のようになる:
フォームリソースを表示してみよう。
とすると、フォームリソースがロードされオープンされる。それぞれのあと、
frmLoadEvent, frmOpenEventが発生するので、frmOpenEventを受けたら FrmDrawForm(event.data.formID);を実行してやると、OS側で適切に描画してくれる。
以下のようなコードを、MyFirstApp.cのようなファイル名で保存しておく:
でき上がったら、動かしてみよう。 定義したフォームが画面に表示され、ホームアプリをタップすれば終了する。
アプリを起動すると、三つめのPilotMain関数が呼び出される。ここで、まず ID=1000 なフォームへの移動を指示する。
その次の do ... while がイベントループである。まず、イベントキューからイベントをひとつ取りだす。そして、SysHandleEvent でイベント処理を試みる。ホームシルクをタップしたり、予定表ボタンを押したりといったイベントであれば、SysHandleEventはなんらかの処理を行なった上で、 true をかえす。そうでなければ false をかえす。
falseがかえった場合、AppHandleEvent でイベント処理を試みる。AppHandleEventはこのファイルで定義している二つめの関数であるが、これもSysHandleEventと同様、なんらかの処理を試み、処理を行なったら true をかえす。そうでなければ false をかえす。
ここでいったん、二つめの関数に目を移そう。AppHandleEventは、frmLoadEventだけを処理する。frmLoadEventを受け取ったら、指定されたフォームを初期化し、それをアクティブに指定し、そのフォームに対するイベントハンドラを指定する。ここでは、イベントハンドラとして、一つめのmainFormHandleEvent関数を指定した。これらの処理を行なった上で、true をかえす。そうでなければ(なにも処理を行なわなければ) falseをかえす。
さて、またPilotMainに目を戻そう。SysHandleEvent, AppHandleEventのどちらも処理を行なわず、それぞれ false がかえってきた場合、FrmDispatchEvent をとおして、一つめの mainFormHandleEvent を呼び出す。
ここで一つめの mainFormHandleEventを見てみよう。この関数はmainFormに関するイベントハンドラであり、frmOpenEventを受け取ったらフォームを描画し、またctlSelectEventを受け取ったら、SysSleep関数を呼び出す、という処理を行なった上で true をかえす。
上記のようなしくみで、描画された"POWEROFF"ボタンがタップされたら、SysSleep すなわち電源を切る、という動作をすることとなる。