いままで、「BREWで複数画面を効率的に開発するフレームワーク」を書いて、5回目まできて、その5回目で「画面の切り替え方法などについて説明するのと、複数画面を行うときの修正箇所のポイント」と書いたことについて。
ここで1回、全体方針と、5回までのまとめと、6回以降の予告です。
●ウィザードでつくってくれるソースと、複数画面の場合の問題点
BREWの場合、ウィザードでソースをあらかじめ作ってくれるが、これは、1画面用のソースになっている(ように見える)。つまり、こんなかんじ
アプリ
|
各コントロール
でも、実際には、複数画面になる。なので、こんな感じ
アプリ
|
画面
|
コントロール
そこで、問題になるのは、以下の3点
(1)複数画面を、どう表現し、どう切りかえるか
(2)画面内の項目(コントロール)を、どう制御するのか
(3)画面間(ひいては項目間)に関連するデータをどうするか
(1)が、いままで説明してきた1~5回目まで、(2)がこれ移行に説明する、コントロールの操作方法、(3)が、BREW版カオル姫方式になる。
で、今回のまとめは、いままでやってきたところということで、(1)の方法についてだ。
●複数画面を、どう表現するか
複数画面あるばあい、これを1画面1クラスとして、表現した。
CというかBREWにおけるクラス表現は、
1クラスにつき、1つのクラス用構造体を持ち、
そのクラスのメソッドを
クラス名_メソッド名(クラス用構造体 *引数1,その他引数。。)
で表現することによってあらわす。
で、その際必要なメソッドは、クラスの生成と、消滅にあたるものと、イベント処理。
そこで、クラスをgamen1とすると、
typedef struct _Gamen1
{
いろいろな要素(6回以降で説明)
} Gamen1;
gamen1_InitAppData 生成
gamen1_FreeAppData 消滅
gamen1_HandleEvent イベント処理
と表現した。ただし、名前はおかしいので、この機能をするものであったら、名前は変えるべきである(こぴぺが楽なので、こうしただけ)
で、その中身については、第4回で、それにともなう、元のアプリの書き換えは、第3回に書いたので、くわしくは、そちらへ
●複数画面を、どう切り替えるか
そして、画面切り替えに関しては、3つの状態が問題になる
(1)一番初めに表示する画面
(2)2番目以降、最後の画面のひとつ前まで
(3)最後の画面
画面が1つの場合は、つまり、ウィザードで生成されるものの場合は、
・initAppDataで、画面部品のインスタンスを生成し
・HandleEventのStartで、Redrawし、
・FreeAppDataで画面インスタンスを開放する。
しかし、別に、画面部品を生成するのは、initAppData内でなくても、そのあとでも、生成してRedrawすれば、表示される。その性質を利用し、ここでは、生成とRedrawをまとめて、こんなふうにした。
(1)一番初めに表示する画面
アプリのinitAppDataで、画面番号(という領域をアプリの構造体の中に作っている)を0にしている。そこで、アプリのHandleEventで一番初め(Startが一番初めになる)に来るときは、画面番号0である。そこで
画面番号0のとき、一番初めの画面のinitAppDataを呼び出す。 ここで、初めの画面のインスタンスは生成し、Redrawされて、初期画面が表示される |
(2)2番目以降、最後の画面のひとつ前まで
2番目以降は、前に画面が出ている。そこで、その画面をクローズし、次の画面を生成する。
そこで
・現在表紙している画面のFreeAppDataを呼び出す。 →ここで、表示画面のインスタンスは消滅する ・その直後に次に表示したい画面のinitAppDataを呼ぶ →ここで、画面のインスタンスは生成し、Redrawされて、画面が表示される →必要なら、画面クリアをしておくこと |
(3)最後の画面
消滅した後、アプリを終了する必要があるので
・現在表紙している画面のFreeAppDataを呼び出す。 →ここで、表示画面のインスタンスは消滅する ・その後ISHELL_CloseAppletを呼ぶ(FALSEで) |
ということで、画面切り替え法(前の画面Free、後の画面init)を説明したところで、第6回からは、個々の画面について、どのように、インスタンスをおいて、どのようにフォーカス制御するかについて書く予定ですが、第6回をいつやるかは未定です。