XファンクションGUIでコントロールを構築する
内容 |
サマリー
このサンプルはXファンクションのGetN ダイアログをツリーノード変数で構築する方法を示します。この仕組みは複数の変数によるコントロールを避けるために使用します。これはXファンクションダイアログの例です。
学習する項目
- make_treeによって異なるコントロールを作成する方法
- GUIを特定のコントロールのイベントで更新する方法
- 正しい入力を確認して尋ねる方法
ステップ
- ツール:Xファンクション・ビルダを選択してXファンクション・ビルダダイアログを開きます。それからファイル:新しいXファンクションウィザードを選択して入力変数名を GUI とするTreeNode型のXファンクションを作成して「gui_controls.oxf」として保存します。
- Xファンクションをコードビルダで開き、gui_controls_make_tree 関数に以下のコードを追加します。
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) //サブブランチ終了 }
- 「//put your own support static functions here」という行の後に、以下のイベント操作関数を入力します。
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; }
- gui_controls_event1関数に、以下のエラーチェックコードを入力します。
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; } }
- 返してくる値を「return false 」(デフォルト)から「 return true 」に変更してGUIを強制的に変更します。
- Xファンクションのボディではユーザ設定をツリー上に表示します。
ボタンをクリックしてコンパイルし、変更を保存します。
out_tree(GUI);
Xファンクションを実行する
- スクリプトウィンドウで「gui_controls -d」を実行します。
- ダイアログの「Have Email」チェックボックスを付けると、メール編集ボックスが表示されます。
- 無効なメールアドレスをメール編集ボックスに入力(例えば「abc」)すると、ダイアログボックスの下部にエラーメッセージが表示され、OKボタンが無効になります。
- OKをクリックします。設定ツリーはスクリプトウィンドウに出力されます。
