シリーズ「BREWで複数画面を(分割して開発可能な)開発する場合の方法論」(以前のシリーズIHTMLVIEWERの具体的な使い方を改題)の2回目です。
今日は、前回で書いた仕様を作っていくわけですが、そのうち、アプリ全体で1つしか存在しない部分と、各画面のダミーモジュール部分を作成します。
というわけで、今回の部分を作っても画面は表示されませんが(なにもおこらない)その代わり、IHTMLVIEWERを使う場合でも、ふつうの画面用の部品を使う場合でも、共通な部分です(事実、今回は、画面用の関数をインクルードしません)
それでは、作っていきましょう
■全体部分の作成
今回、このアプリは、fukusu1というアプリ名&プロジェクト名で作ることとして、
以下説明します。
(1)ファイルの新規作成で、プロジェクトのBREW Application Wizardを選択して
(プロジェクト名は適当にいれて)プロジェクトを作成します。
→今回はプロジェクト名を、fukusu1にします。
(2)BREW MIFエディタを立ち上げ、アプレットを新規作成して、
bidファイルを保存し、
テキトーに、特権とかを設定して、MIFファイルを保存します。
場所は、bidファイルは、上記プロジェクトの中、
MIFファイルは、上記プロジェクトの「フォルダと」同じところ
それぞれプロジェクト名.拡張子(bidまたはmif)で保存
→fukusu1/fukusu1.bidとfukusu1.mifができます。
(3)プロジェクト名.cのファイルを、INCLUDES AND VARIABLE DEFINITIONSから
FUNCTION DEFINITIONSのところの上(Function Prototypesの最後まで)を
fukusu1.hとして分割します。
そして、fukusu1.cは、fukusu1.hをインクルードする形になります。
つまり、この時点では、INCLUDES AND VARIABLE DEFINITIONSのあとは、
#include "fukusu1.h"
そのあと、FUNCTION DEFINITIONSになります。
(4)fukusu1.hに対して、
・構造体の要素に
int gno;
void *garea;を足します
・共通領域を確保します
今回は
char sei_ritu[20]; // 正解率
char byo[20]; // 秒数
を追加します。
・そのほか、defineで囲ったり、exten宣言をします。
ここで書いている作業です。
(5)fukusu1.cに対して、
・#include "fukusu1.h"の上に、#define _FUKUSU1_Cを書きます。
ここで、コンパイルすると、正常にコンパイルできるはずです。
・fukusu1_InitAppDataで、
pMe->gno = 0;
pMe->garea = NULL;
共通領域の初期化(今回はpMe->sei_rituと、byoをクリア)
しておきます。
(クリアするときなどで、"AEEStdLib.h"をインクルードする必要があれば、
fukusu1.hにインクルードします)
・共通領域が、メモリをとるものである場合、
fukusu1_FreeAppDataで、取得した領域を解放します
→今回はありません。
(6)ダミーの第一画面を作成します。
・gamen1.cとgamen1.hを作成します。
gamen1.cは、ここ
gamen1.hは、ここ
に示すように、つくります。
つまり、InitAppData,HandleEvent,FreeAppDataの3つの関数をつくり、
HandleEventの中身は、fukusu1.cのHandleEventと同じにして(コピーして、
引数のpMeをpoyaにしている)
InitAppDataで、poya->gno=-1;(これで、すぐに終了)にします。
gamen1.hに、fukusu1.hをインクルードします。
(7)fukusu1.cのHandleEventの中身を書き換えます。
以下のとおり、
・EVT_APP_STARTで、はじめの画面のInitAppDataを呼びます
・それ以外は、pMe->gnoにしたがい、HandleEventを呼びます。
・それを抜けたあとで、pMe->gnoが-1なら終了します。
static boolean testhtml1_HandleEvent
(testhtml1* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
boolean ret;
ret = FALSE; // 処理していない
// スタート時に、はじめの画面を呼ぶ
if ( eCode == EVT_APP_START)
{
return gamen1_InitAppData(pMe);
}
else if ( pMe == NULL )
{
return FALSE;
}
// それ以外は、画面に応じたHandleEventをよぶ
else
{
switch(pMe->gno)
{
case 1:
ret = gamen1_HandleEvent(pMe,eCode,wParam,dwParam);
break;
// いまは1画面なので、これだけ
// 複数になると、ここにつづく
}
}
// 処理した結果、gnoが-1になったら終了
if ( pMe->gno == -1 )
{
ISHELL_CloseApplet(pMe->pIShell,FALSE);
return TRUE;
}
return ret;
}
|
(上記< > ¥は、本当は半角です)
(8)fukusu1.cに、gamen1.hのインクルードを追加します
・ここで、コンパイルしてOKかどうか、確認します。
(9)2つめ以降の画面を作ります。
gamen1.cと、gamen2.hをコピーし、gamen1をgamen2に置換します。
fukusu1.cにgamen2.hのインクルードを追加します
fukusu1.cのHandleEventにgamen2のHandleEventを追加します。
これを、画面のあるだけやってください。
ここまでで、全体は終了です。
結果として、以下のとおりになります。
全体 fukusu1.c fukusu1.h
第一画面 gamen1.c gamen1.h
第二画面 gamen2.c gamen2.h
で、これをコンパイルして起動しても、動かないはずです。
画面を入れていないので。。。
このシリーズの次回で、第一画面をいれていきます。
そうすると、なんか表示されます。
