このノートには、ダイアログ データ エクス (チェンジ DDX) およびダイアログ データ バリデーション (DDV) アーキテクチャについて説明します。それはまた、DDX_ または DDV_ プロシージャの記述方法とあなたのルーチンを使用する ClassWizard を拡張する方法について説明します。
ダイアログ データ エクス チェンジの概要
ダイアログ データのすべての機能は、C++ コードで行われます。特別なリソースや魔法のマクロはありません。機構の中心部は、データの交換と検証ダイアログはすべてダイアログ クラスでオーバーライドする仮想関数です。それは、常にこのフォームで見つからない:
void CMyDialog::DoDataExchange (CDataExchange ※ pDX){特価;CDialog::DoDataExchange(pDX);//基本クラスを呼び出す//{{AFX_DATA_MAP(CMyDialog)<data_exchange_function_call>//}}AFX_DATA_MAP}
特殊な形式の AFX コメントを検索し、この関数内のコードを編集するには、ClassWizard を許可します。ClassWizard と互換性のないコードは特殊コメント外の配置。
上記の例では、lt; data_exchange_function_call > 形式です:
特価;DDX_Custom (pDX、nIDC、フィールド)(&N)
lt; data_validation_function_call > オプションで、フォームに:
特価;DDV_Custom (pDX、フィールド、...)(&N)
1 つ以上の DDX_ ・ DDV_ のペアは各DoDataExchange関数に含めることができます。
'Afxdd_.h' すべてのダイアログ データ エクス チェンジ ルーチンとダイアログ データ バリデーション ルーチンの MFC が提供のリストを参照してください。
ダイアログ データ-メンバー データCMyDialogクラスだけです。それは構造体または何か特別なような格納されていません。
メモ
私たちがこの「ダイアログ データ」を呼び出すすべての機能CWndから派生した任意のクラスで利用可能なとだけダイアログに限定されていません。
データの初期値が標準の C++ コンス トラクター ブロックを通常の設定 //{{AFX_DATA_INIT と //}}AFX_DATA_INIT のコメント。
:Updatedataは、初期化とエラー処理のDoDataExchangeへの呼び出しを回避する操作です。
:Updatedataは、データの交換と検証を実行するにはいつでも呼び出すことができます。既定ではUpdateData(TRUE)、既定のCDialog::OnOKハンドラーと呼ばれ、 UpdateData(FALSE)、既定でCDialog::OnInitDialogと呼ばれる。
DDX_ ルーチンがフィールドの直後に、DDV_ ルーチンにアクセスできるようにする必要があります。
どのように動作します。?
ダイアログ データを使用するために、以下を理解する必要はありません。ただし、この背後のしくみを理解する、独自の exchange または検証プロシージャを記述役立ちます。
DoDataExchangeメンバー関数Serializeメンバー関数は - 取得またはデータ設定する、外部のフォームからの責任です (この場合コントロールをダイアログに) から/クラスのメンバーを。PDXパラメーターは、データ交換を行うためで cobject::serializeをCArchiveパラメーターに似ています。多くのようにCArchive方向フラグpDX ( CDataExchangeオブジェクト)、方向フラグをが
検証は、 m_bSaveAndValidateが設定されている場合にのみ発生します。M_bSaveAndValidateの値:updatedata BOOL パラメーターによって決定されます。
ある 3 つの他の興味深いCDataExchangeメンバー:
ユーザーの拡張機能
既定の DDX/DDV 機構を拡張するには、数とおりの方法があります。できます:
CTime
void のパスカル DDX_Time(CDataExchange* pDX, int nIDC, CTimeamp; tm)(&A)
void パスカル DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);//時間は、将来または過去にしていることを確認します。
DDV_MinMax (pDX、年齢、0、m_maxAge)
注特価;このような任意の式 ClassWizard で編集することはできず、したがって、特別なコメントの外 (//{{AFX_DATA_MAP(CMyClass)) ください。(&N)。
条件またはその他の有効な C++ ステートメント混在 exchange と検証関数呼び出しを含む、 DoDialogExchangeメンバー関数があります。
//{{AFX_DATA_MAP(CMyClass)各 (pDX、IDC_SEX、m_bFemale);DDX_Text (pDX、IDC_EDIT1、m_age);//}}AFX_DATA_MAP場合 (m_bFemale)特価;DDV_MinMax (pDX、年齢、0、m_maxFemaleAge);他DDV_MinMax (pDX、年齢、0、m_maxMaleAge)(&N)
注特価;上記のように、このようなコードは ClassWizard で編集することはできず、特別なコメントの外を使用する必要があります。(&N)。
ClassWizard のサポート
ClassWizard は、あなた自身の DDX_ と DDV_ のルーチンは、ClassWizard のユーザー インターフェイスに統合することにより、DDX/DDV カスタマイズのサブセットをサポートします。これを行う唯一の費用を時間と時間をもう一度プロジェクトでも多くのプロジェクトで、特定 DDX ルーチンおよび DDV ルーチンを再利用する場合に有益です。
これを行うには、特別なエントリの DDX を作られています。CLW (以前のバージョンの Visual C 格納この情報 APSTUDIO で。INI) または、プロジェクトの。CLW ファイル。特殊なエントリをすることができます、[一般情報] セクションのプロジェクトのいずれかを入力します。CLW ファイルまたは、DDX の [ExtraDDX] セクションで。CLW ファイルを \program files \microsoft Visual Studio\Visual C + + \bin ディレクトリ。DDX を作成する必要があります。それが存在しない場合の CLW ファイル。のみ、特定のプロジェクトで、カスタムの DDX_ ・ DDV_ ルーチンを使用する場合は、プロジェクトの [一般情報] セクションにエントリを追加します。CLW ファイルの代わりに。多くのプロジェクトに、ルーチンを使用する場合は、DDX の [ExtraDDX] セクションにエントリを追加します。CLW。
これらの特別なエントリの一般的な形式です。:
ExtraDDXCount n =
;ここで n は ExtraDDX 数ですか?に従って行
ExtraDDX? lt; = キー >; < vb キー >;<prompt><type><initValue><DDX_Proc> [; <DDV_Proc> <prompt1> <arg1>[<prompt2> <fmt2>]
;ここでは?1-n を示す番号が定義されているリストに DDX 種類です。
各フィールドは、';' 文字によって区切られます。フィールドとその目的説明します。
lt; キー & gt;
ダイアログ コントロールのこの変数の型をできるかを示す単一の文字の一覧を =。
E = エディット
C = 2 ステート チェック ボックス
c = 3 ステート チェック ボックス
R = グループ内の最初のラジオ ボタン
L = 非順リスト ボックス
l = 並べ替えられたリスト ボックス
M = エディット項目を持つ) コンボ ボックス
N = 非並べ替えドロップダウン リスト
n = 並べ替えドロップダウン リスト
1 = DDX 挿入リストの先頭に追加する場合 (末尾には、既定で追加されます) 特価;通常、'コントロール' のプロパティを転送用の DDX ルーチンに使用します。(&N)。
lt; vb キー & gt;
このフィールドは 16 ビット製品でのみ (32 ビット製品では、VBX コントロールがサポートされていません) VBX コントロールの使用します。
lt; プロンプト > =
プロパティ コンボ ボックス (引用符なし) を配置する文字列
lt; タイプ > =
1 つの識別子のヘッダー ファイルを生成する型。上の例で DDX_Time で、これに CTime を設定すると。
lt; vb キー > =
このバージョンでは使用しないと、常に空にする必要があります
lt; initValue > =
初期値 - 0 または空白。空白の場合は、[初期化の行は、実装ファイルの//{{AFX_DATA_INIT セクションに書き込まれません。空白のエントリを適切な初期化を保証するコンス トラクターを持つ C++ オブジェクトを (CString、CTime など) 使用する必要があります。
lt; DDX_Proc > =
dDX_ プロシージャの識別子。C++ 関数名」と DDX_、「を起動する必要ありますが「DDX_」で lt; ない DDX_Proc > 識別子。上記の例では、<DDX_Proc> 識別子は時間になります。とき classwizard 実装ファイルで、関数呼び出しの追加 {{AFX_DATA_MAP セクション、しますこの名前 DDX_、したがって DDX_Time に到着するには。
lt; コメント > =
この DDX の変数] ダイアログ ボックスを表示するには次のようにコメントします。DDX/DDV ペアによって実行される操作について説明しますをようなここでは、通常何かを提供する任意のテキストを配置します。
lt; DDV_Proc & gt;
エントリの DDV 部分は省略可能です。すべての DDX ルーチンは、対応する DDV ルーチンがあります。多くの場合、転送の不可欠な一部として、検証フェーズを含める方が便利です。ClassWizard がパラメーターなしの DDV ルーチンをサポートしていないので、DDV ルーチン パラメーターを必要としないときこれ多くの場合は。
1 つの識別子の DDV_ プロシージャを = します。C++ 関数名を「DDV_」を開始する必要ありますが「DDX_」で lt; ない DDX_Proc > 識別子。
1 または 2 の DDV args で続く:
lt; promptX > =
編集項目 (アンプ付け) アクセラレータの上に配置する文字列(&A)
lt; fmtX > =
書式指定文字の 1 つを arg 型の
d = int
u = 符号なし
D 長い int = (つまり、長い)
U = 長符号なし (つまり、DWORD)
f = float
F = ダブル
s = 文字列
カスタムの DDX の例
カスタムの DDX 検証の例は、MFC サンプルで見つけることができます CHKBOOK。DOLLCENT で DDX_DollarsCents を参照してください。CPP をカスタムの DDX ルーチンと CHKBOOK サンプル実装は。CHKBOOK の [一般情報] セクション内の ExtraDDX1 のエントリと対応する例 ExtraDDXCount CLW。CLW ファイル。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)