ダイアログ データ エクスチェンジ
更新 : 2007 年 11 月
ダイアログ データ エクスチェンジ (DDX: Dialog Data Exchange) 機構を使用する場合は、ダイアログ オブジェクトのメンバ変数の初期値を設定します。通常、OnInitDialog ハンドラまたはダイアログ コンストラクタで行います。ダイアログ ボックスが表示される直前に、フレームワークの DDX 機構によって、メンバ変数の値がダイアログ ボックスのコントロールに転送されます。転送された値は、DoModal または Create に応答してダイアログ ボックスが表示されたときに、それらのコントロールで表示されます。CDialog の OnInitDialog の既定の実装は、CWnd クラスの UpdateData メンバ関数を呼び出して、ダイアログ ボックスのコントロールを初期化します。
この機構では、[OK] ボタンがクリックされたとき、または引数を TRUE にして UpdateData メンバ関数が呼び出されたときに、コントロールからメンバ変数に値が転送されます。ダイアログ データ バリデーション (DDV: Dialog Data Validation) 機構では、入力規則が指定されているデータ項目の妥当性がチェックされます。
ダイアログ データ エクスチェンジの機能を次の図に示します。
ダイアログ データ エクスチェンジ
UpdateData は、渡された BOOL パラメータによって指定されたとおりに双方向で機能します。データ交換を実行するために、UpdateData では CDataExchange オブジェクトをセットアップし、ダイアログ クラスでオーバーライドされた CDialog の DoDataExchange メンバ関数を呼び出します。DoDataExchange は、CDataExchange 型の引数を使用します。UpdateData に渡される CDataExchange オブジェクトは、交換の方向などの情報を定義して交換のコンテキストを表します。
DoDataExchange をオーバーライドすると、データ メンバ (コントロール) ごとに 1 つの DDX 関数の呼び出しを指定できます。各 DDX 関数では、UpdateData によって DoDataExchange に渡された CDataExchange 引数のコンテキストに基づいて、双方向でデータを交換する方法があります。
MFC では、種類の異なるデータ交換のために、多くの DDX 関数が用意されています。2 つの DDX 関数と 1 つの DDV 関数が呼び出される DoDataExchange のオーバーライドの例は、次のとおりです。
void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVal);
DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName);
DDV_MaxChars(pDX, m_strName, 20);
}
DDX_ 行と DDV_ 行はデータ マップです。例で示されているサンプルの DDX 関数と DDV 関数は、チェック ボックス コントロールとエディット ボックス コントロールを対象としています。
ユーザーがモーダル ダイアログ ボックスをキャンセルする場合、OnCancel メンバ関数はダイアログ ボックスを終了し、DoModal は IDCANCEL 値を返します。その場合、ダイアログ ボックスとダイアログ オブジェクトの間でデータは交換されません。