ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

BREWで複数画面を(分割して開発可能な)開発する場合の方法論(その2:全体部分の作成)。


 シリーズ「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

で、これをコンパイルして起動しても、動かないはずです。
画面を入れていないので。。。

このシリーズの次回で、第一画面をいれていきます。
そうすると、なんか表示されます。