📢 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); | ||
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); | |||
DDX_Text(pDX, IDC_EDIT_DATA, m_strData); | DDX_Text(pDX, IDC_EDIT_DATA, m_strData); | ||
if (pDX->m_bSaveAndValidate) { | if (pDX->m_bSaveAndValidate) { | ||