よくある質問
FAQ
すべての画面上でボタンクリック時に共通処理を実現する方法を教えてください。
スクリーンのコールバック関数PrePressとボタン検索関数を作成することで、すべての画面上のボタンクリック時に共通の処理を実現することができます。 実現手順とサンプルコードを下記に記載いたします。
コールバック関数PrePress内では、ボタンがクリックされたかどうかを判断し、クリックされている場合、共通処理を実施します。
■ 実現手順
- GENSKETCH3の[設定]-[スクリーンプロパティ]を選択します。
- スクリーンプロパティの「PrePress」を「あり」にします。
- ソースコード生成を行います。
- 生成したG「プロジェクト名」Screen.c/cxxのインクルード部分にサンプルコード1を記載してください。
- サンプルコード2をG「プロジェクト名」Screen.c/cxxのPrePressコールバック関数内に記載してください。
- サンプルコード3をG「プロジェクト名」Screen.c/cxxに記載してください。
【C言語用サンプルコード】
■ サンプルコード1(G「プロジェクト名」Screen.cのインクルード部分に記載します。)
#include "GSVFrame.h"
long CheckButtonPress( GPanel *pPanel, GPoint gptPoint, short nVFrame );
■ サンプルコード2(G「プロジェクト名」Screen.cのPrePressコールバック関数内に記載します。)
GPanel *pPanel;
long nRet;
/* パネルオブジェクトを取得 */
pPanel = (GPanel *)GWGetVmt(GScreen_VMT, GWGetScreen())->GetPanel(GWGetScreen());
/* ボタンがプレスされているかチェックする */
nRet = CheckButtonPress( pPanel, gptPoint, FALSE );
/* ボタンが押下されたか? */
if( nRet ){
/* ユーザーコード記載*/
/*ここに共通処理を記載する。*/
}
■ サンプルコード3(G「プロジェクト名」Screen.cの最後にパネル内ボタン検索関数を作成します。)
//===========================================================
/* パネル内ボタン検索関数
戻り値がTRUEならばプレス位置にボタンあり
戻り値がFALSEならばプレス位置にボタンなし
pPanel : 表示パネル
gptPoint : プレス座標
nVFrame : ビューフレーム確認フラグ
*/
//===========================================================
long CheckButtonPress( GPanel *pPanel, GPoint gptPoint, short nVFrame )
{
void *pvItem;
GScreen *pScreen = GWGetScreen();
GFrame *pFrame;
GBaseWindow *pChild;
GBaseWindowList *pWindowList;
GBaseWindow *pWindow;
GPanel *pPanelBuf = pPanel;
GPanel *pVFPanel;
GRect grChild;
GPoint gptVFPoint;
long lRet = FALSE;
/* ビューフレームかどうかチェックする */
if( nVFrame != TRUE ){
/*
* ウィンドウ内を検索する
*/
/* ウィンドウリストを取得 */
pFrame = GWGetVmt(GScreen_VMT, pScreen)->GetFrame(pScreen);
pWindowList = GWGetVmt(GFrame_VMT, pFrame)->GetChildList(pFrame);
/* ウィンドウリスト検索 */
pvItem = FindLastItemGBaseWindowList(pWindowList);
if(pvItem != NULL) {
while((pvItem = FindPrevItemGBaseWindowList(pWindowList, pvItem, &pWindow)) != NULL) {
/* ウィンドウ用に座標を再計算する*/
GPTOffsetPoint( &gptPoint, (short)-GWGetVmt( GBaseWindow_VMT, pWindow)->GetXPosition( pWindow ), (short)-GWGetVmt( GBaseWindow_VMT, pWindow)->GetYPosition( pWindow ) );
pWindow = (GBaseWindow *)GWGetVmt( GWindow_VMT, pWindow )->GetPanel( (GWindow *)pWindow );
/* 開いているウィンドウを取得 */
pPanelBuf = (GPanel *)pWindow;
break;
}
}
}
/*
* パネル内を検索する
*/
/* リストの検索位置を初期化 */
pvItem = FindLastItemGBaseWindowList( &(pPanelBuf->pChildList) );
if(pvItem != NULL) {
/* コントロールリストの検索を行い座標上にあるコントロールを特定する */
while( (pvItem = FindPrevItemGBaseWindowList( &(pPanelBuf->pChildList), pvItem, &pChild )) != NULL ){
GWGetVmt( GBaseWindow_VMT, pChild)->GetBounds( pChild, &grChild );
/* 座標がオブジェクトの外周矩形内か確認 */
if( GRPointInRect( &gptPoint, &grChild ) == FALSE ){
continue;
}
/* オブジェクトが有効か確認 */
if( GWGetVmt( GBaseWindow_VMT, pChild)->GetEnableStatus( pChild ) == TRUE ){
/* オブジェクトがボタンか? */
if( pChild->usType == GBUTTON ){
/* プレス範囲内に、入力可能ボタンオブジェクトが存在する */
lRet = TRUE;
/* オブジェクトがビューフレームか? */
}else if( 0x6000 <= pChild->usType && pChild->usType <= 0x7FFF ){
/* ビューフレームの場合は、ビューフレーム内のパネルも検索する */
pVFPanel = (GPanel *)GWGetVmt( GSVFrame_VMT, pChild)->GetActiveChild( pChild );
/* ビューフレーム用に座標を再計算する*/
gptVFPoint = gptPoint;
GPTOffsetPoint( &gptVFPoint, (short)-GWGetVmt( GBaseWindow_VMT, pChild)->GetXPosition( pChild ), (short)-GWGetVmt( GBaseWindow_VMT, pChild)->GetYPosition( pChild ) );
/* ボタンがプレスされているかチェックする */
lRet = CheckButtonPress( pVFPanel, gptVFPoint, TRUE );
}
}
if( lRet == TRUE ){
/* 検索終了 */
break;
}
}
}
return lRet;
}
【C++言語用サンプルコード】
■ サンプルコード1
#include "GCSVFrame.hpp"
long CheckButtonPress( GCPanel *pPanel, GPoint gptPoint, short nVFrame );
■ サンプルコード2
GCPanel *pPanel;
long nRet;
/* パネルオブジェクトを取得 */
pPanel = GCWGetScreen()->GetPanel();
/* ボタンがプレスされているかチェックする */
nRet = CheckButtonPress( pPanel, gptPoint, FALSE );
/* ボタンが押下されたか? */
if( nRet ){
/* ユーザーコード記載*/
/*ここに共通処理を記載する。*/
}
■ サンプルコード3
//===========================================================
/* パネル内ボタン検索関数
戻り値がTRUEならばプレス位置にボタンあり
戻り値がFALSEならばプレス位置にボタンなし
pPanel : 表示パネル
gptPoint : プレス座標
nVFrame : ビューフレーム確認フラグ
*/
//===========================================================
long CheckButtonPress( GCPanel *pPanel, GPoint gptPoint, short nVFrame )
{
GCScreen *pScreen = GCWGetScreen();
GCFrame *pFrame;
GCBaseWindow *pChild;
GCBaseWindowList *pWindowList;
GCBaseWindow *pWindow;
GCPanel *pPanelBuf = pPanel;
GCPanel *pVFPanel;
GRect grChild;
GPoint gptVFPoint;
long lRet = FALSE;
/* ビューフレームかどうかチェックする */
if( nVFrame != TRUE ){
/*
* ウィンドウ内を検索する
*/
/* ウィンドウリストを取得 */
pFrame=pScreen->GetFrame();
pWindowList=pFrame->GetChildList();
/* ウィンドウリスト検索 */
if(pWindowList->FindLastItem()) {
while(pWindowList->FindPrevItem(&pWindow)) {
/* ウィンドウ用に座標を再計算する*/
GPTOffsetPoint( &gptPoint, (short)-pWindow->GetXPosition(), (short)-pWindow->GetYPosition() );
pWindow = ((GCWindow *)pWindow)->GetPanel();
/* 開いているウィンドウを取得 */
pPanelBuf = (GCPanel *)pWindow;
break;
}
}
}
/*
* パネル内を検索する
*/
/* リストの検索位置を初期化 */
pWindowList = pPanelBuf->GetChildList();
if(pWindowList->FindLastItem()) {
/* コントロールリストの検索を行い座標上にあるコントロールを特定する */
while(pWindowList->FindPrevItem(&pChild)) {
pChild->GetBounds(&grChild);
/* 座標がオブジェクトの外周矩形内か確認 */
if( GRPointInRect( &gptPoint, &grChild ) == FALSE ){
continue;
}
/* オブジェクトが有効か確認 */
if( pChild->GetEnableStatus() == TRUE ){
/* オブジェクトがボタンか? */
if( pChild->GetType() == GBUTTON ){
/* プレス範囲内に、入力可能ボタンオブジェクトが存在する */
lRet = TRUE;
/* オブジェクトがビューフレームか? */
}else if( 0x6000 <= pChild->GetType() && pChild->GetType() <= 0x7FFF ){
/* ビューフレームの場合は、ビューフレーム内のパネルも検索する */
pVFPanel=(GCPanel *)((GCPanel *)pChild)->GetActiveChild();
/* ビューフレーム用に座標を再計算する*/
gptVFPoint = gptPoint;
GPTOffsetPoint( &gptVFPoint, (short)-pChild->GetXPosition(), (short)-pChild->GetYPosition());
/* ボタンがプレスされているかチェックする */
lRet = CheckButtonPress( pVFPanel, gptVFPoint, TRUE );
}
}
if( lRet == TRUE ){
/* 検索終了 */
break;
}
}
}
return lRet;
}
キーワードで検索する
カテゴリーから検索する
- よくある質問
- 導入フロー
- セミナー
- カタログダウンロード
- On YouTube