「CEditを継承したクラスを作成する」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== エディットコントロールで入力制限を行う == CEditを継承したクラスを作成し、OnChar関数をオーバーライドする。 <source lang="…」
 
文字列「</source>」を「</syntaxhighlight>」に置換
 
(2人の利用者による、間の5版が非表示)
2行目: 2行目:
CEditを継承したクラスを作成し、OnChar関数をオーバーライドする。
CEditを継承したクラスを作成し、OnChar関数をオーバーライドする。


  <source lang="c++">
  <syntaxhighlight lang="c++">
  CNumericEdit.h
  CNumericEdit.h
   
   
33行目: 33行目:
     DECLARE_MESSAGE_MAP()
     DECLARE_MESSAGE_MAP()
  };
  };
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  #include "stdafx.h"
  #include "stdafx.h"
  #include "CNumericEdit.h"
  #include "CNumericEdit.h"
112行目: 112行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== ダイアログから値を取得する ==
== ダイアログから値を取得する ==
下記のように、ダイアログを起動して入力された値を取得するときは注意が必要である。
下記のように、ダイアログを起動して入力された値を取得するときは注意が必要である。<br>
DoModal()関数がIDOKを返した時点で、ダイアログ内のコントロールが破棄されてしまうため、値を取得する事ができない。
DoModal()関数がIDOKを返した時点で、ダイアログ内のコントロールが破棄されてしまうため、値を取得する事ができない。<br>
この場合、メンバにCString型の変数を定義し、DDX_Textで値を更新する。
この場合、メンバにCString型の変数を定義し、DDX_Textで値を更新する。<br>
<br>
  <syntaxhighlight lang="c++">
  <source lang="c++">
  CMyDialog dlg;
  CMyDialog dlg;
   
   
129行目: 128行目:
     dlg.m_editValue.GetWindowText(strText); // アサーションエラー
     dlg.m_editValue.GetWindowText(strText); // アサーションエラー
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 入力値の制限と値取得を同時に行う ==
== 入力値の制限と値取得を同時に行う ==
CEdit型とCString型の変数を定義し、DoDataExchange内に、DDXControlとDDXTEXTを追加する。
CEdit型とCString型の変数を定義し、DoDataExchange内に、DDXControlとDDXTEXTを追加する。
  <source lang="c++">
  <syntaxhighlight lang="c++">
  void CMyDialog::DoDataExchange(CDataExchange* pDX)
  void CMyDialog::DoDataExchange(CDataExchange* pDX)
  {
  {
     CDialog::DoDataExchange(pDX);
     CDialog::DoDataExchange(pDX);
   
   
     // 入力値の制限,OnChar をオーバーライドしたクラス
     // 入力値の制限,OnChar()をオーバーライドしたクラス
  DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
    DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
 
  // ダイアログ消滅後の値取得用
    // ダイアログ消滅後の値取得用
  DDX_Text(pDX, IDC_EDIT_VALUE, m_strValue);
    DDX_Text(pDX, IDC_EDIT_VALUE, m_strValue);
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== 入力値の範囲をチェックする ==
== 入力値の範囲をチェックする ==
ダイアログデータバリデーションを使用します.DoDataExchange 内に下記のように関数を追加します.
ダイアログデータバリデーション(DDV)を使用する。<br>
DoDataExchange()内に下記のように関数を追加する。<br>
<syntaxhighlight lang="c++">
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    // 入力値の制限,OnChar をオーバーライドしたクラス
    DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
    // ダイアログ消滅後の値取得用
    DDX_Text(pDX, IDC_EDIT_VALUE, m_strValue);
    // 入力値の範囲確認
    // 他の型用の DDV も標準であります
    DDV_MinMaxDouble(pDX, atof(m_strValue), 0.0, 1.0);
}
</syntaxhighlight>
<br><br>


void CMyDialog::DoDataExchange(CDataExchange* pDX)
== 複数のエディットコントロール間で有効性を確認する ==
{
2つのエディットコントロール間の関係性から、データの有効性を決めたいことがある。<br>
  CDialog::DoDataExchange(pDX);
例えば、ユーザに上限値と下限値を入力してもらう場合、上限値は下限値より大きくなければいけない。<br>
 
そこで、データが有効か確認するための独自関数を作成する。<br>
  // 入力値の制限,OnChar をオーバーライドしたクラス
<br>
  DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
<syntaxhighlight lang="c++">
 
void DDV_CheckLowerUpper(CDataExchange* pDX, double lower, double upper)
  // ダイアログ消滅後の値取得用
{
  DDX_Text(pDX, IDC_EDIT_VALUE, m_strValue);
    if(lower > upper)
 
    {
  // 入力値の範囲確認
      AfxMessageBox(_T("下限値には上限値より小さい数値を入力してください."), MB_ICONWARNING);
  // 他の型用の DDV も標準であります
      pDX->Fail();
  DDV_MinMaxDouble(pDX, atof(m_strValue), 0.0, 1.0);
    }
}
}
</syntaxhighlight>
上記の関数を、DoDataExchange()内に追記する。<br>
<syntaxhighlight lang="c++">
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    // 入力値の制限,OnChar をオーバーライドしたクラス
    DDX_Control(pDX, IDC_EDIT_LOWER_VALUE, m_editLower);
    DDX_Control(pDX, IDC_EDIT_UPPER_VALUE, m_editUpper);
    // ダイアログ消滅後の値取得用
    DDX_Text(pDX, IDC_EDIT_LOWER_VALUE, m_strLower);
    DDX_Text(pDX, IDC_EDIT_UPPER_VALUE, m_strUpper);
    // 入力値の範囲確認
    // 他の型用のDDVも標準で存在する
    DDV_MinMaxDouble(pDX, atof(m_strLower), 0.0, 1.0);
    DDV_MinMaxDouble(pDX, atof(m_strUpper), 0.0, 1.0);
    // 下限値と上限値が入力されている場合は 下限値 < 上限値 であるかチェックする
    if(!m_strLower.IsEmpty() && !m_strUpper.IsEmpty())
    {
      DDV_CheckLowerUpper(pDX, atof(m_strLower), atof(m_strUpper));
    }
}
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:MFC]]
[[カテゴリ:MFC]]