BREWの画面部分のプログラムをExcelの仕様書から自動生成するという、シリーズ仕様書からプログラムソースを生成する方法の続きです。
前回、出力サンプルを出しました。
そこで、新規あるいは修正になるものは、
・画面ソースgamen1.c
・画面ヘッダgamen1.h
・画面用イベントソースgamen1event.c
・画面用イベントヘッダgamen1event.h
と書きましたので、今回は、これに対応する雛形、
・画面ソースの雛形:gamen_b_c.txt
・画面ヘッダの雛形:gamen_b_h.txt
・画面用イベントソースの雛形:gamen_event_c.txt
・画面用イベントヘッダの雛形:gamen_event_h.txt
について説明しますというか。。載せます。
制限字数の関係で、2回に分けます。
なお、これ以外に1箇所、アプリケーションの雛形app_h.txtに
#include "IEventList.h" // イベントリスト
の1行が追加になるのですが(#include "IKHMap.h"の下)
逆に言えば、これしか変わらないので、app_h.txtは、特にソースは
だしません。
■画面ソースの雛形:gamen_b_c.txt
以下のとおりです
/*============================================ FILE: $#$CELL D2$#$.c ==============================================*/ #define _$#$CELL K2$#$_C #define _$#$CELL K2$#$_C #include "$#$CELL D2$#$.h" $#$REP 5$#$ $#$IFCELL T3,イベント一覧$#$ #include "$#$KETA M$#$.h" $#$IFEND$#$ $#$REPEND M$#$ /*==================================*/ // 関数名:$#$CELL D2$#$_HandleEvent // // 内容 :イベント処理 // /*==================================*/ boolean $#$CELL D2$#$_HandleEvent($#$CELL B2$#$* poya, AEEEvent eCode, uint16 wParam, uint32 dwParam) { $#$CELL D2$#$ *pMe; // チェック if ( poya == NULL ) return FALSE; if ( ( poya->gno != 1 ) || (poya->garea == NULL )) { return FALSE; } pMe = ($#$CELL D2$#$ *)poya->garea; // 項目NULLチェック $#$REP 5$#$ if ( pMe->$#$KETA B$#$ == NULL ) return FALSE; $#$REPEND A$#$ $#$REP 5$#$ $#$IFKETA C,HTMLCTL$#$ // フォームのデータ取得 IHTMLCTL_HandleEvent(pMe->$#$KETA B$#$,eCode,wParam,dwParam); if ( pMe->$#$KETA B$#$->text_flg != 0 ) { return TRUE; } $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ // テキストエリア if ( ITEXTCTL_HandleEvent (pMe->$#$KETA B$#$,eCode,wParam,dwParam) == TRUE ) { return TRUE; } $#$IFEND$#$ $#$IFKETA C,MENUCTL$#$ // メニュー if ( IMENUCTL_HandleEvent (pMe->$#$KETA B$#$,eCode,wParam,dwParam) == TRUE ) { return TRUE; } $#$IFEND$#$ $#$REPEND A$#$ // 追加:イベント処理 return IEVENTLIST_HandleEvent(pMe->pElist,eCode,wParam,dwParam); } /*==================================*/ //関数名:$#$CELL D2$#$_InitAppData // //内容 :領域確保・描画 // /*==================================*/ boolean $#$CELL D2$#$_InitAppData($#$CELL B2$#$* poya) { char *fdata; $#$CELL D2$#$ *pMe; AEERect rect; AECHAR *menubuf; char *menuTitle; //==========================================// // 領域確保 // //==========================================// pMe = ($#$CELL D2$#$ *)MALLOC(sizeof($#$CELL D2$#$)); if (pMe == NULL ) { $#$CELL D2$#$_FreeAppData(poya); return FALSE; } // アプリ領域へ設定 poya->garea = (void *)pMe; poya->gno = $#$CELL H2$#$; // 初期設定 $#$REP 5$#$ pMe->$#$KETA B$#$ = NULL; $#$REPEND A$#$ pMe->pIDisplay = poya->pIDisplay; pMe->pIShell = poya->pIShell; //==========================================// // イベント処理 // //==========================================// // 親領域の設定(イベント先で使う) pMe->poya = poya; // イベント領域確保 if ( (pMe->pElist = IEVENTLIST_Create() ) == NULL ) { return FALSE; } // イベント設定 $#$IFCELL T3,イベント一覧$#$ IEVENTLIST_Add(pMe->pElist,pMe,$#$KETA Z$#$, ,$#$KETA U$#$,$#$KETA V$#$,$#$KETA W$#$,$#$KETA Y$#$); $#$IFEND$#$ $#$REPEND T$#$ $#$REP 5$#$ $#$IFKETA C,HTMLCTL$#$ //==========================================// // 表示するHTMLファイルの取得 // //==========================================// fdata = IHTMLCTL_GetDispFileData(pMe->pIShell,"$#$KETA H$#$"); if (fdata == NULL ) { $#$CELL D2$#$_FreeAppData(poya); return FALSE; } //==========================================// // HTMLViewer生成 // //==========================================// // 読み込んだfdataをHTMLViewerに設定する if ( (pMe->$#$KETA B$#$ = IHTMLCTL_Create(pMe->pIShell,pMe->pIDisplay)) == NULL ) { FREEIF(fdata); $#$CELL D2$#$_FreeAppData(poya); return FALSE; } //==========================================// // HTMLViewerデータ設定 // //==========================================// if ( IHTMLCTL_SetDispData(pMe->$#$KETA B$#$,fdata) != TRUE) { FREEIF(fdata); $#$CELL D2$#$_FreeAppData(poya); return FALSE; } //==========================================// // 追加:HTMLViewer大きさ設定 // //==========================================// rect.x = $#$KETA D$#$; rect.y = $#$KETA E$#$; rect.dx = $#$KETA F$#$; rect.dy = $#$KETA G$#$; IHTMLCTL_SetRect(pMe->$#$KETA B$#$,&rect); //==========================================// // HTMLViewer表示・メモリ解放 // //==========================================// FREEIF(fdata); $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ //==========================================// // テキストエリア設定 // //==========================================// if ( ISHELL_CreateInstance( pMe->pIShell, AEECLSID_TEXTCTL, (void**)&pMe->$#$KETA B$#$ ) != SUCCESS ) { $#$CELL D2$#$_FreeAppData(poya); return FALSE; } rect.x = $#$KETA D$#$; rect.y = $#$KETA E$#$; rect.dx = $#$KETA F$#$; rect.dy = $#$KETA G$#$; ITEXTCTL_SetRect(pMe->$#$KETA B$#$,&rect); ITEXTCTL_SetProperties(pMe->$#$KETA B$#$,TP_FRAME|TP_MULTILINE); $#$IFEND$#$ $#$IFKETA C,MENUCTL$#$ //==========================================// // メニュー設定 // //==========================================// if ( ISHELL_CreateInstance( pMe->pIShell, AEECLSID_MENUCTL, (void**)&pMe->$#$KETA B$#$ ) != SUCCESS ) { $#$CELL D2$#$_FreeAppData(poya); return FALSE; } rect.x = $#$KETA D$#$; rect.y = $#$KETA E$#$; rect.dx = $#$KETA F$#$; rect.dy = $#$KETA G$#$; IMENUCTL_SetRect(pMe->$#$KETA B$#$,&rect); $#$IFEND$#$ $#$REPEND A$#$ $#$IFCELL O3,メニュー一覧$#$ //==========================// // メニュー項目の表示 // //==========================// $#$IFEND$#$ $#$REP 5$#$ $#$IFCELL O3,メニュー一覧$#$ menuTitle = "$#$KETA R$#$"; menubuf = (AECHAR *)MALLOC((STRLEN(menuTitle)+1)*sizeof(AECHAR)); if ( menubuf == NULL ) { $#$CELL D2$#$_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->$#$KETA P$#$,NULL,NULL,$#$KETA Q$#$,menubuf,NULL); FREEIF(menubuf); $#$IFEND$#$ $#$REPEND O$#$ $#$CELL D2$#$_DispAppData(pMe); // 共通領域を設定 pMe->pMap = poya->pMap; return TRUE; } /*==================================*/ // 関数名:$#$CELL D2$#$_FreeAppData // // 内容 :領域のフリー // /*==================================*/ void $#$CELL D2$#$_FreeAppData($#$CELL B2$#$* poya) { $#$CELL D2$#$ *pMe; // 対象かどうかチェック if ( poya->gno != 1 ) return; if ( poya->garea == NULL ) return; pMe = ($#$CELL D2$#$ *)poya->garea; $#$REP 5$#$ $#$IFKETA C,HTMLCTL$#$ // フリー if ( pMe->$#$KETA B$#$ != NULL ) { IHTMLCTL_Release(pMe->$#$KETA B$#$); pMe->$#$KETA B$#$ = NULL; } $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ // テキストフリー if ( pMe->$#$KETA B$#$ != NULL ) { ITEXTCTL_Release(pMe->$#$KETA B$#$); pMe->$#$KETA B$#$ = NULL; } $#$IFEND$#$ $#$IFKETA C,MENUCTL$#$ // メニューフリー if ( pMe->$#$KETA B$#$ != NULL ) { IMENUCTL_Release(pMe->$#$KETA B$#$); pMe->$#$KETA B$#$ = NULL; } $#$IFEND$#$ $#$REPEND A$#$ // イベントフリー if ( pMe->pElist != NULL ) { IEVENTLIST_Release(pMe->pElist); } // 全体フリー FREEIF(pMe); // 親のエリアをクリア poya->garea = NULL; } /*==================================*/ // 関数名:$#$CELL D2$#$_DispAppData // // 内容 :画面の初期表示 // /*==================================*/ boolean $#$CELL D2$#$_DispAppData($#$CELL D2$#$* pMe) { int curpos,buhinpos; // 初期化 curpos = 0; buhinpos = 0; //==================================// // リドローする // //==================================// // ここに、 // 1.リドローと、 // 2.次のフォーカス指示を書く $#$REP 5$#$ $#$IFKETA C,HTMLCTL$#$ if ( pMe->$#$KETA B$#$ != NULL ) { // リドロー IHTMLCTL_Redraw(pMe->$#$KETA B$#$); // カーソル番号pMe->curnoを、htmlの項目順に数えた番号に変換する。 // その番号をcurposとすると IHTMLCTL_DispData(pMe->$#$KETA B$#$,curpos,pMe->$#$KETA B$#$->scr); // カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に // 変換する。その番号をbuhinposだとすると if(buhinpos == $#$KETA A$#$) IHTMLCTL_SetActive(pMe->$#$KETA B$#$,TRUE); else IHTMLCTL_SetActive(pMe->$#$KETA B$#$,FALSE); } $#$IFEND$#$ $#$IFKETA C,TEXTCTL$#$ // テキストエリアのRedrawやUpdateする if ( pMe->$#$KETA B$#$ != NULL ) { // リドロー ITEXTCTL_Redraw(pMe->$#$KETA B$#$); // カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に // 変換する。その番号をbuhinposだとすると if(buhinpos == $#$KETA A$#$) ITEXTCTL_SetActive(pMe->$#$KETA B$#$,TRUE); else ITEXTCTL_SetActive(pMe->$#$KETA B$#$,FALSE); } $#$IFEND$#$ $#$IFKETA C,MENUCTL$#$ // メニューのRedrawやUpdateする if ( pMe->$#$KETA B$#$ != NULL ) { // リドロー IMENUCTL_Redraw(pMe->$#$KETA B$#$); // カーソル番号pMe->curnoから、部品の番号(仕様書のA桁のNo)に // 変換する。その番号をbuhinposだとすると if(buhinpos == $#$KETA A$#$) IMENUCTL_SetActive(pMe->$#$KETA B$#$,TRUE); else IMENUCTL_SetActive(pMe->$#$KETA B$#$,FALSE); } $#$IFEND$#$ $#$REPEND A$#$ return TRUE; } //=================================*// //関数名:$#$CELL D2$#$_NextCurItem // //内容 :カーソル移動先を求める // //=================================*// int $#$CELL D2$#$_NextCurItem($#$CELL D2$#$* pMe,int flg) { //======================================// // 次のカーソル移動箇所に // // ついて、 // // プログラムを書いてください // //======================================// return 0; // 該当なし } |
(上記 ¥ < > は本当は半角です)
ここで切らないと、制限字数を超えてしまうので、
いったんここで切ります。