「MFCコントロール - コントロールの更新」の版間の差分

編集の要約なし
編集の要約なし
 
9行目: 9行目:
例えば、ユーザが入力したテキストを取得する場合は、UpdateData(TRUE)を実行して、計算結果をコントロールに表示する場合はUpdateData(FALSE)を使用する。<br>
例えば、ユーザが入力したテキストを取得する場合は、UpdateData(TRUE)を実行して、計算結果をコントロールに表示する場合はUpdateData(FALSE)を使用する。<br>
<br>
<br>
DDXの具体的な実装方法としては、DoDataExchange関数内でDDX_TextやDDX_Int等のマクロを使用して、コントロールIDとメンバ変数の関連付けを行う。<br>
<u>※注意</u><br>
<u><code>UpdateData</code>メソッドのデフォルト引数は<code>TRUE</code>であることに注意する。</u><br>
<br>
DDXのメリットとして、データ型の自動変換や値の検証 (バリデーション) 機能が組み込まれていることが挙げられる。<br>
例えば、テキストボックスに入力された文字列を整数型のメンバ変数に変換する場合、自動的に型変換が行われて、無効な入力があった場合はエラーメッセージが表示される。<br>
<br>
また、DDXと組み合わせてDDV (Dialog Data Validation) を使用することにより、高度な入力値の検証が可能となる。<br>
例えば、数値の範囲チェックや必須入力チェック等を実装することができる。<br>
<br><br>
 
== DDX (Dialog Data Exchange) ==
DDXの実装において、DoDataExchange関数内でDDX_TextやDDX_Int等のマクロを使用して、コントロールIDとメンバ変数の関連付けを行う。<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
// 一般的なコントロール向け
  void CMyDialog::DoDataExchange(CDataExchange *pDX)
  void CMyDialog::DoDataExchange(CDataExchange *pDX)
  {
  {
     CDialog::DoDataExchange(pDX);
     CDialog::DoDataExchange(pDX);
     DDX_Text(pDX, IDC_EDIT1, m_strName);   // 文字列用
     DDX_Int(pDX, IDC_EDIT2, m_nAge);       // 整数用
    DDX_Control(pDX, IDC_CONTROL, m_control);  // 一般的なコントロールの紐付け
     DDX_Check(pDX, IDC_CHECK1, m_bActive);  // チェックボックス用
     DDX_Text(pDX, IDC_EDIT1, m_strName);       // 文字列向け
     DDX_Int(pDX, IDC_EDIT2, m_nAge);           // 整数向け
     DDX_Check(pDX, IDC_CHECK1, m_bActive);      // チェックボックス向け
    DDX_Radio(pDX, IDC_RADIO1, m_nRadio);      // ラジオボタングループ向け
    DDX_Scroll(pDX, IDC_SCROLLBAR, m_nScroll);  // スクロールバー向け
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
DDXのメリットとして、データ型の自動変換や値の検証 (バリデーション) 機能が組み込まれていることが挙げられる。<br>
<syntaxhighlight lang="c++">
例えば、テキストボックスに入力された文字列を整数型のメンバ変数に変換する場合、自動的に型変換が行われて、無効な入力があった場合はエラーメッセージが表示される。<br>
// リストコントロール向け
<br>
また、DDXと組み合わせてDDV (Dialog Data Validation) を使用することにより、高度な入力値の検証が可能となる。<br>
void CMyDialog::DoDataExchange(CDataExchange *pDX)
例えば、数値の範囲チェックや必須入力チェック等を実装することができる。<br>
{
    CDialog::DoDataExchange(pDX);
    DDX_LBString(pDX, IDC_LISTBOX, m_strList);  // リストボックスの文字列
    DDX_CBString(pDX, IDC_COMBO, m_strCombo);  // コンボボックスの文字列向け
    DDX_LBIndex(pDX, IDC_LISTBOX, m_nIndex)     // リストボックスの選択インデックス
    DDX_CBIndex(pDX, IDC_COMBO, m_nIndex)      // コンボボックスの選択インデックス
    DDX_LBStringExact(pDX, IDC_LISTBOX, m_str)  // リストボックス (完全一致)
    DDX_CBStringExact(pDX, IDC_COMBO, m_str)   // コンボボックス (完全一致)
}
</syntaxhighlight>
<br><br>
<br><br>


== サンプルコード ==
== DDX (Dialog Data Exchange) の使用例 ==
以下の例では、ボタンを押下した時、UpdateData()でIDC_EDIT1に入力された文字列を変数m_xvEdit1に格納している。<br>
以下の例では、ボタンを押下した時、UpdateData()でIDC_EDIT1に入力された文字列を変数m_xvEdit1に格納している。<br>
次に、変数m_xvEdit1の文字列を変数m_xvEdit2にコピーして、UpdateData(FALSE)で変数m_xvEdit2の文字列をIDC_EDIT2に反映させている。<br>
次に、変数m_xvEdit1の文字列を変数m_xvEdit2にコピーして、UpdateData(FALSE)で変数m_xvEdit2の文字列をIDC_EDIT2に反映させている。<br>