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

編集の要約なし
編集の要約なし
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
<code>CWnd::UpdateData</code>メソッドは、DDX/DDVサポートで値を更新する場合に使用する。<br>
DDX (Dialog Data Exchange) は、MFCにおけるユーザインターフェースとソースコード間のデータ交換を自動化する機能である。<br>
<br>
<br>
コントロールに入力された値を変数に格納する場合、<code>UpdateData(TRUE)</code>または<code>UpdateData()</code>を使用する。<br>
DDXの基本的な仕組みとしては、ユーザインターフェースのコントロールとクラスのメンバ変数を紐づけ、その間でのデータ交換を自動的に行う。<br>
また、変数に格納された値をコントロールに反映する場合、<code>UpdateData(FALSE)</code>を使用する。<br>
この仕組みにより、開発者は手動でのデータ変換やフォーマット処理を記述する必要がなく、効率的な開発が可能になる。<br>
<br>
データ交換の方向性については、<code>CWnd::UpdateData</code>メソッドの引数で制御する。<br>
UpdateData(TRUE)を指定した場合はコントロールに入力された値からメンバ変数へ、UpdateData(FALSE)を指定した場合はメンバ変数に格納された値をコントロールへとデータが移動する。<br>
例えば、ユーザが入力したテキストを取得する場合は、UpdateData(TRUE)を実行して、計算結果をコントロールに表示する場合はUpdateData(FALSE)を使用する。<br>
<br>
DDXの具体的な実装方法としては、DoDataExchange関数内でDDX_TextやDDX_Int等のマクロを使用して、コントロールIDとメンバ変数の関連付けを行う。<br>
<syntaxhighlight lang="c++">
void CMyDialog::DoDataExchange(CDataExchange *pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_strName);    // 文字列用
    DDX_Int(pDX, IDC_EDIT2, m_nAge);        // 整数用
    DDX_Check(pDX, IDC_CHECK1, m_bActive);  // チェックボックス用
}
</syntaxhighlight>
<br>
DDXのメリットとして、データ型の自動変換や値の検証 (バリデーション) 機能が組み込まれていることが挙げられる。<br>
例えば、テキストボックスに入力された文字列を整数型のメンバ変数に変換する場合、自動的に型変換が行われて、無効な入力があった場合はエラーメッセージが表示される。<br>
<br>
また、DDXと組み合わせてDDV (Dialog Data Validation) を使用することにより、高度な入力値の検証が可能となる。<br>
例えば、数値の範囲チェックや必須入力チェック等を実装することができる。<br>
<br><br>
<br><br>


== サンプルコード ==
== サンプルコード ==
以下の例では、まず、ボタンを押下した時、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>
<br>
[[ファイル:UpdateData 01.png|フレームなし|中央]]
[[ファイル:UpdateData 01.png|フレームなし|中央]]
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // CMyDialog.h
  // CMyDialog.hファイル
  class CMyDialog : public CDialogEx
  class CMyDialog : public CDialogEx
  {
  {
26行目: 48行目:
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // CMyDialog.cpp
  // CMyDialog.cppファイル
   
   
  CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent), m_xvEdit1(_T("")), m_xvEdit2(_T(""))
  CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent), m_xvEdit1(_T("")), m_xvEdit2(_T(""))
33行目: 55行目:
  }
  }
   
   
  void CMyDialog::DoDataExchange(CDataExchange* pDX)
  void CMyDialog::DoDataExchange(CDataExchange *pDX)
  {
  {
     CDialog::DoDataExchange(pDX);
     CDialog::DoDataExchange(pDX);