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

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

仕様書からプログラムソースを生成する方法(Excelの仕様書編 その21:イベント追加 ソース)

2006-12-25 14:34:27 | ケータイ

BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。

 いま、、仕様書にイベントを追加しています。
 前回、その仕様書の様子を示しました。
 今回は、出力サンプルを示します。



■必要なファイル

 その前に、必要なファイルについてです。
今までどおり、
・アプリソースfukusu2.c
・アプリヘッダfukusu2.h
●画面ソースgamen1.c
●画面ヘッダgamen1.h
・共通領域ソースIKHMap.c
・共通領域ヘッダIKHMap.h
・バージョンヘッダversion.h
は、必要です。
そのうち、●をつけたものは、今回修正が入って変更があります。

さらに、イベントということで、
・イベント処理ソースIEventList.c
・イベント処理ヘッダIEventList.c
●画面用イベントソースgamen1event.c
●画面用イベントヘッダgamen1event.h
が必要です。

 ただし、イベント処理のIEventList.c、IEventList.hは、すでに、ここ
でソースを書いているので、今回、あたらに紹介するのは
(1)画面ソースgamen1.c(修正)
(2)画面ヘッダgamen1.h(修正)
(3)画面用イベントソースgamen1event.c(新規)
(4)画面用イベントヘッダgamen1event.h(新規)
となります。

 以下、順に示していきます。


■(1)画面ソースgamen1.c(修正)
イベント関係のところが追加となります。
イベント処理は、gamen1_HandleEventでいろいろかいてましたけど、
それをばっさり、IEVENTLIST_HandleEvenで処理することになります。

で、そのため、イベントをIEVENTLIST_Addを使って、initAppDataでセットします
また、領域をFreeAppDataで解放します。

その結果、ソースは、以下のとおりです(赤字は、修正箇所)
/*================================
FILE: gamen1.c
=================================*/
#define _GAMEN1_C

#include	"gamen1.h"
#include	"gamen1event.h"	//	追加:イベント処理

/*==================================*/
// 関数名:gamen1_HandleEvent	    //
// 内容 :イベント処理		    //
/*==================================*/
boolean gamen1_HandleEvent(fukusu2* poya, AEEEvent eCode,
                              uint16 wParam, uint32 dwParam)
{  
	gamen1	*pMe;

	//	チェック
	if ( poya	==	NULL )
		return FALSE;
	if ( 	( poya->gno	!=	1 ) ||
		 (poya->garea	==	NULL ))
		return FALSE;
	pMe	=	(gamen1 *)poya->garea;

	//	メニューイベント
	if ( pMe->pMenu1	!=	NULL )
	{
		if ( IMENUCTL_HandleEvent(pMe->pMenu1,eCode,
                              wParam,dwParam) == TRUE )
		{
			return	TRUE;
		}
	}

	//	追加:イベント処理
	return	IEVENTLIST_HandleEvent(pMe->pElist,eCode,wParam,dwParam);

}

/*==================================*/
//関数名:gamen1_InitAppData	    //
//内容 :領域確保・描画	    //
/*==================================*/
boolean gamen1_InitAppData(fukusu2* poya)
{
	char		*fdata;
	gamen1		*pMe;
	AEERect		rect;
	AECHAR	*menubuf;
	char	*menuTitle;

	//==========================================//
	//	領域確保		            //
	//==========================================//
	pMe	=	(gamen1 *)MALLOC(sizeof(gamen1));
	if (pMe	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return	FALSE;
	}
	//	アプリ領域へ設定
	poya->garea	=	(void *)pMe;
	poya->gno	=	1;

	pMe->pMenu1	=	NULL;
	pMe->pIDisplay	= poya->pIDisplay;
	pMe->pIShell	= poya->pIShell;

	//==========================================//
	//	追加:イベント処理		    //
	//==========================================//
	//	親領域の設定(イベント先で使う)
	pMe->poya	=	poya;

	//	イベント領域確保
	if ( (pMe->pElist = IEVENTLIST_Create() )	==	NULL )
	{
		return FALSE;
	}

	//	イベント設定
	IEVENTLIST_Add(pMe->Elist,pMe,IEVENTLIST_KIND_ECODE,
			EVT_APP_START,0,0,gamen1_STARTEvent);
	IEVENTLIST_Add(pMe->Elist,pMe,IEVENTLIST_KIND_WPARAM,
			EVT_COMMAND,2000,0,gamen1_EndEvent);

	//==========================//
	//	メニューの作成	    //
	//==========================//
	if	( ISHELL_CreateInstance( pMe->pIShell, 
		AEECLSID_MENUCTL, (void**)&pMe->pMenu1 ) != SUCCESS )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	rect.x	=	1;
	rect.y	=	1;
	rect.dx	=	200;
	rect.dy	=	150;
	IMENUCTL_SetRect(pMe->pMenu1,&rect);

	//==========================//
	//	メニュー項目の表示  //
	//==========================//
	
	menuTitle = "開始";
	menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR));
	if ( menubuf	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	MEMSET(menubuf,0,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	STREXPAND(menuTitle,STRLEN(menuTitle),menubuf,
			(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	IMENUCTL_AddItem(pMe->pMenu1,NULL,NULL,1000,menubuf,NULL);
	FREEIF(menubuf);

	menuTitle = "終了";
	menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR));
	if ( menubuf	==	NULL )
	{
		gamen1_FreeAppData(poya);
		return FALSE;
	}
	MEMSET(menubuf,0,(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	STREXPAND(menuTitle,STRLEN(menuTitle),menubuf,
			(STRLEN(menuTitle)+1)*sizeof(AECHAR));
	IMENUCTL_AddItem(pMe->pMenu1,NULL,NULL,2000,menubuf,NULL);
	FREEIF(menubuf);

	gamen1_DispAppData(pMe);

	//	共通領域を設定
//	pMe->pMap	=	poya->pMap;

    return TRUE;
}

/*==================================*/
//関数名:gamen1_FreeAppData	    //
//内容 :領域のフリー		    //
/*==================================*/
void gamen1_FreeAppData(fukusu2* poya)
{
	gamen1	*pMe;
 
	// 対象かどうかチェック
	if ( poya->gno	!=	1 )
		return;
	if ( poya->garea	==	NULL )
		return;
	pMe	=	(gamen1 *)poya->garea;

	//	メニューフリー
	if ( pMe->pMenu1	!=	NULL )
	{
		IMENUCTL_Release(pMe->pMenu1);
		pMe->pMenu1	=	NULL;
	}

	//	追加:イベントフリー
	IEVENTLIST_Release(pMe->pElist);

	//	全体フリー
	FREEIF(pMe);

	//	親のエリアをクリア
	poya->garea	=	NULL;
}

/*==================================*/
//	関数名:gamen1_DispAppData  //
//	内容 :画面の初期表示	    //
/*==================================*/
boolean gamen1_DispAppData(gamen1* pMe)
{
	int	curpos,buhinpos;

	//	初期化
	curpos		=	0;
	buhinpos	=	0;

	//==================================//
	//	リドローする		    //
	//==================================//
	//	ここに、
	//	1.リドローと、
	//	2.次のフォーカス指示を書く
	//	テキストエリアのRedrawやUpdateする
	if ( pMe->pMenu1	!=	NULL )
	{
		//	リドロー
		IMENUCTL_Redraw(pMe->pMenu1);
//		カーソル番号pMe->curnoから、部品の番号(仕様書のA桁の
//	         No)に変換する。その番号をbuhinposだとすると
		if(buhinpos	==	0)
			IMENUCTL_SetActive(pMe->pMenu1,TRUE);
		else
			IMENUCTL_SetActive(pMe->pMenu1,FALSE);
	}

	return	TRUE;
}

(上記 < > ¥は、本当は半角です)



■(2)画面ヘッダgamen1.h(修正)

イベントを入れる領域と、親(アプリのポインタ)を入れておく
領域を新たに取ります。

ソースは、以下のとおりです(赤字は、修正箇所)
/*=====================================
FILE: gamen1.h
======================================*/
#ifndef _GAMEN1_H
#define	_GAMEN1_H
/*======================================
INCLUDES AND VARIABLE DEFINITIONS
==================================== */
#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEShell.h" 

#include "AEEMenu.h"

#include "fukusu2.h"	//	アプリ画面

//==================================//
//	定数定義		  //
//==================================//
/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/
// create an applet structure that's passed around. All variables in
// here will be able to be referenced as static.
typedef struct _gamen1 {
	IDisplay      *pIDisplay;
	IShell        *pIShell;
	IMenuCtl	  *pMenu1;

	//	追加:イベント領域
	IEventList		*pElist;
	//	追加:親領域
	fukusu2			*poya;

} gamen1;

/*-----------------------------------------------------------
Function Prototypes
------------------------------------------------------------*/
#ifdef _GAMEN1_C
boolean gamen1_HandleEvent(fukusu2* poya,AEEEvent eCode, 
				uint16 wParam,uint32 dwParam);
boolean gamen1_InitAppData(fukusu2* poya);
void    gamen1_FreeAppData(fukusu2* poya);

//	画面表示
boolean gamen1_DispAppData(gamen1* pMe);

#else

extern boolean gamen1_HandleEvent(fukusu2* pMe,AEEEvent eCode,
				 uint16 wParam,uint32 dwParam);
extern boolean gamen1_InitAppData(fukusu2* pMe);
extern void    gamen1_FreeAppData(fukusu2* pMe);

//	画面表示
extern boolean gamen1_DispAppData(gamen1* pMe);

#endif
#endif

(上記 < > ¥は、本当は半角です)



■(3)画面用イベントソースgamen1event.c(新規)
イベントをやるプログラムです。今回は、終了のときプログラムを
終了するようにしてあります。
ソースは、以下のとおりです(全部新規追加です)
/*=====================================
FILE: event1Ctl.c
=====================================*/
#define	_EVENT1CTL_C

/*===================================
INCLUDES AND VARIABLE DEFINITIONS
=================================== */
#include "AEEModGen.h" 
#include "AEEAppGen.h"
#include "AEEShell.h" 
#include "gamen1.h"
#include "gamen1event.h"

//==========================================//
//	関数名:gamen1_EndEvent		  //
//	内容 :終了			  //
//==========================================//
boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam)
{
	gamen1 *pMe;
	if ( (pMe = (gamen1 *)pArg)	== NULL )
		return	FALSE;

	if ( pMe->poya	!=	NULL )
	{
		gamen1_FreeAppData(pMe->poya);
		pMe->poya->gno	=	-1;
	}
	return	TRUE;
}

//==========================================//
//	関数名:gamen1_STARTEvent	  //
//	内容 :開始			    //
//==========================================//
boolean gamen1_STARTEvent(void* pArg, AEEEvent eCode,
				 uint16 wParam, uint32 dwParam)
{
	return	TRUE;
}

(上記 < > ¥は、本当は半角です)



■(4)画面用イベントヘッダgamen1event.h(新規)
呼び出した関数の宣言をします。
ソースは、以下のとおりです(全部新規追加です)
/*==================================
INCLUDES AND VARIABLE DEFINITIONS
================================== */
#ifndef _GAMEN1EVENT_H
#define	_GAMEN1EVENT_H
#include "AEE.h"
#include "AEEShell.h"
#include "AEEStdLib.h" 

#ifdef _GAMEN1EVENT_C
boolean gamen1_STARTEvent(void* pMe, AEEEvent eCode, 
				uint16 wParam, uint32 dwParam);
boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
#else
extern boolean gamen1_STARTEvent(void* pMe, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
extern boolean gamen1_EndEvent(void* pArg, AEEEvent eCode,
				uint16 wParam, uint32 dwParam);
#endif
#endif

(上記 < > ¥は、本当は半角です)




 ということで、今回はここまでです。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 海外郵便は、住所をQRコード... | トップ | PLCのレビューが載ってるんで... »
最新の画像もっと見る

ケータイ」カテゴリの最新記事