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

ページの作成:「== 概要 == DDV (Dialog Data Validation) は、MFCアプリケーションにおけるユーザ入力データの検証機能である。<br> MFCアプリケーションにおけるデータ検証の基盤として、ユーザインターフェースを支援する機能である。<br> <br> DDX (Dialog Data eXchange) と密接に連携して動作しており、データの整合性と有効性を確保する。<br> <br> DDVの仕組みでは、<code>UpdateData(TR…」
 
 
54行目: 54行目:
== カスタム検証 ==
== カスタム検証 ==
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
// カスタムバリデーション 1
  void AFXAPI DDV_EmailAddress(CDataExchange* pDX, const CString& value)
  void AFXAPI DDV_EmailAddress(CDataExchange* pDX, const CString& value)
  {
  {
70行目: 72行目:
     CDialog::DoDataExchange(pDX);
     CDialog::DoDataExchange(pDX);
   
   
    // カスタムバリデーション 1
     DDX_Text(pDX, IDC_EDIT_EMAIL, m_strEmail);
     DDX_Text(pDX, IDC_EDIT_EMAIL, m_strEmail);
     DDV_EmailAddress(pDX, m_strEmail);
     DDV_EmailAddress(pDX, m_strEmail);
80行目: 81行目:
       pDX->Fail();
       pDX->Fail();
     }
     }
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// カスタムバリデーション 2
bool CMyDialog::IsValidFormat(const CString &data)
{
    // 例: 文字列が入力されているかどうかの検証
    if (data.IsEmpty()) return false;
    // 例: 文字種の検証
    for (int i = 0; i < data.GetLength(); i++) {
      if (!_istalnum(data[i]) && data[i] != '-' && data[i] != '_') {
          return false;
      }
    }
    // 例: 文字列の長さの検証
    if (data.GetLength() > 50) return false;
    // 例: 予約語の検証
    if (data.CompareNoCase(_T("admin")) == 0 || data.CompareNoCase(_T("system")) == 0) {
      return false;
    }
    // 例: 郵便番号フォーマットの検証 (例: 123-4567)
    // 文字列の長さ
    if (data.GetLength() != 8) return false;
    // 形式 (数字3文字 - 数字4文字)
    for (int i = 0; i < 8; i++) {
      if (i == 3) {
          if (data[i] != '-') return false;
      }
      else {
          if (!_istdigit(data[i])) return false;
      }
    }
    // 例: 電話番号フォーマットの検証 (例: 03-1234-5678)
    // 正規表現の使用
    CRegExp regExp;
    regExp.Pattern = _T("^\\d{2,4}-\\d{2,4}-\\d{4}$");
    return regExp.Test(data);
    // 例: 日付フォーマットの検証 (例: 2024/01/13)
    if (data.GetLength() != 10) return false;
    // 年月日を分解
    int year  = _ttoi(data.Left(4));
    int month = _ttoi(data.Mid(5, 2));
    int day  = _ttoi(data.Mid(8, 2));
    // 区切り文字 (例: /) の検証
    if (data[4] != '/' || data[7] != '/') return false;
    // 値の範囲の検証
    if (year < 1900 || year > 2100) return false;
    if (month < 1 || month > 12)    return false;
    if (day < 1 || day > 31)        return false;
    return true;
}
void CMyDialog::DoDataExchange(CDataExchange *pDX)
{
    CDialog::DoDataExchange(pDX);
   
   
    // カスタムバリデーション 2
     DDX_Text(pDX, IDC_EDIT_DATA, m_strData);
     DDX_Text(pDX, IDC_EDIT_DATA, m_strData);
     if (pDX->m_bSaveAndValidate) {
     if (pDX->m_bSaveAndValidate) {