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 |
(上記 < > ¥は、本当は半角です)
ということで、今回はここまでです。