Xファンクション, ダイアログでコントロールの構築
このサンプルはXファンクションのGetN ダイアログをツリーノード変数で構築する方法を示します。この仕組みは複数の変数によるコントロールを避けるために使用します。これはXファンクションダイアログの例です。
if ( strcmp("GUI", lpcszVarName) == 0 ) // 変数を名前でチェック { // ID は固有(ユニーク)である必要がある int nBranchID = 0x0001; int nUserID = GET_USER_DATAID(0); //NodeID を使用してテーマをサポート GETN_USE(tr) //このノードを現在のノードとして使用 //サブブランチ開始 GETN_BEGIN_BRANCH(UserInfo, "User Information") GETN_ID(nBranchID++) //文字列編集ボックス GETN_STR(UserName, "Name", "Unknown") GETN_ID(nUserID++) // パスワード編集ボックス GETN_PASSWORD(Password, "Password", "") GETN_ID(nUserID++) GETN_END_BRANCH(UserInfo) //サブブランチ終了 //サブブランチ開始 GETN_BEGIN_BRANCH(Detail, "Details") GETN_ID(nBranchID++) // 編集可能なドロップダウンリスト GETN_STRLIST(Language, "Language", "English", "|English|German") GETN_ID(nUserID++) // ラジオボタン GETN_BEGIN_BRANCH(lGender, "Gender") GETN_ID(nBranchID++) GETN_RADIO_INDEX(Gender, 0, "Male|Female") GETN_ID(nUserID++) // ラジオボタンの形式 GETN_OPTION_DISPLAY_FORMAT(DISPLAY_EDITOR_LEFT) GETN_END_BRANCH(lGender) //数値編集ボックス。age(年齢)は整数でないといけないのでデータ型として "%d”を使用 GETN_NUM(Age, "Age", 18) GETN_OPTION_NUM_FORMAT("%d") GETN_ID(nUserID++) //イベント操作と共にチェックボックス設置 GETN_CHECK(iEmail, "Have Email", 0) GETN_ID(nUserID++)//チェックボックス GETN_OPTION_EVENT(_show_email) //iEmailイベントのチェックボックス //文字列編集ボックス GETN_STR(Email, "Email", "") GETN_ID(nUserID++) GETN_END_BRANCH(Detail) //サブブランチ終了 }
static bool _show_email(TreeNode& tr, int nRow, int nType, Dialog& Dlg) { TreeNode trDetail = tr.GUI.Detail; if ( !trDetail ) return false; int nShow = trDetail.iEmail.nVal; //チェックがあれば表示、無いなら非表示 trDetail.Email.Show = (nShow == 1); return true; } static bool _check_email(LPCSTR lpcszEmail) { string strEmail(lpcszEmail); if ( strEmail.Count('@') != 1 ) return false; //1つだけ「@」記号を含む int nSep = strEmail.Find('@'); string strLeft = strEmail.Left(nSep); string strRight = strEmail.Right(strEmail.GetLength() - nSep - 1); if ( strLeft.GetLength() == 0 ) return false; if ( strRight.GetLength() == 0 ) return false; LPCSTR lpcszInvalid = "~!#$%^&*()+ -=|\\/><,`"; if ( strEmail.FindOneOf(lpcszInvalid) >= 0 ) return false; return true; }
if ( strcmp(lpcszNodeName, "Email") == 0 ) { string strVal = trGetN.GUI.Detail.Email.strVal; if ( !_check_email(strVal) ) { strErrMsg = "Invalid Email Address!Please correct it"; //OKボタン無効化、エラーがあるときは継続出来なくする bOKEnable = false; } }
out_tree(GUI);