TN026: DDX und DDV-Routinen

Diese Applikationsschrift beschreibt den Dialogdatenaustausch (DDX) und Dialogfeld Daten Validierung (DDV) Architektur. Es beschreibt auch, wie Sie eine DDX_ oder DDV-Prozedur schreiben und wie Sie Klassen-Assistent Ihre Routinen verwenden erweitern können.

Übersicht der Dialogdatenaustausch

Alle Daten-Dialogfunktionen erfolgen mit C++-Code. Es gibt keine speziellen Ressourcen oder magische Makros. Das Herz des Mechanismus ist eine virtuelle Funktion, die in jeder Dialogfeldklasse, die den Datenaustausch und-Validierung Dialogfeld überschrieben wird. Es ist immer in dieser Form gefunden.:

privatevoid CMyDialog::DoDataExchange (CDataExchange pDX)
{
 Nbsp;  CDialog::DoDataExchange(pDX);    / / Aufruf der Basisklasse

//{{AFX_DATA_MAP(CMyDialog)
        <data_exchange_function_call>
        
    //}}AFX_DATA_MAP
}

Die speziellen Format AFX Kommentare ermöglichen Klassen-Assistent zum Suchen und bearbeiten Sie den Code innerhalb dieser Funktion. Code, die nicht kompatibel mit ClassWizard ist sollte außerhalb der speziellen Format Kommentare eingefügt werden.

Im obigen Beispiel, Lt; Data_exchange_function_call > ist in Form:

&Nbsp;   DDX_Custom (pDX, nIDC, Feld)

und lt; data_validation_function_call > ist optional und wird in form:

&Nbsp;   DDV_Custom (pDX, Feld,...)

Mehr als ein paar DDX_/DDV kann in jede DoDataExchange -Funktion aufgenommen werden.

Finden Sie eine Liste aller Dialogfeld Daten Austausch Routinen und Dialogfeld Daten Überprüfungsroutinen mit MFC bereitgestellten 'afxdd_.h'.

Dialogfelddaten sind nur die - Mitglied in der CMyDialog -Klasse. Es ist nicht in ein Struct oder etwas Besonderes wie die gespeichert.

Hinweise

Obwohl wir diese "Dialogfelddaten" aufrufen, alle Funktionen stehen in eine von CWnd abgeleitete Klasse und beschränken sich nicht auf nur Dialoge.

Anfangswerte der Daten sind festgelegt im standard C++ Konstruktor, in der Regel in einem Block mit //{{AFX_DATA_INIT und //}}AFX_DATA_INIT Kommentare.

CWnd::UpdateData ist die Operation, die die Initialisierung Fehlerbehandlung um den Aufruf von DoDataExchange und.

Sie können jederzeit den Datenaustausch und Validierung durchführen CWnd::UpdateData aufrufen. UpdateData(TRUE) wird standardmäßig in der Standard- CDialog::OnOK -Handler aufgerufen und UpdateData(falsche) heißt in der Standard- CDialog::OnInitDialog.

Die DDV-Routine sollten die DDX_-Routine für das Feld unmittelbar folgen.

Wie funktioniert es?

Sie müssen nicht das folgende zu verstehen, um Dialogfelddaten verwenden. Jedoch helfen verstehen, wie es hinter den Kulissen funktioniert schreiben Ihre eigenen Exchange oder Validierung Verfahren Ihnen.

Die Memberfunktion DoDataExchange ist ähnlich wie die Memberfunktion Serialize - es ist verantwortlich für das Abrufen oder Festlegen von Daten zu/von einer äußeren Form (in diesem Fall steuert ein Dialogfeld) von/nach Daten in der Klasse. Der pDX -Parameter ist der Kontext für den Datenaustausch zu tun und ist ähnlich wie die CArchive -Parameter für CObject::Serialize. Die pDX (ein CDataExchange Objekt) hat eine Richtung Flagge ähnlich wie CArchive eine Richtung Fahne hat

Validierung erfolgt nur, wenn M_bSaveAndValidate festgelegt ist. Der Wert des M_bSaveAndValidate wird durch den BOOL-Parameter CWnd::UpdateData bestimmt.

Es gibt drei andere interessante CDataExchange -Member:

Benutzer Erweiterungen

Es gibt mehrere Möglichkeiten, den DDX/DDV-Standardmechanismus zu erweitern. Sie können:

Haben Sie die DoDialogExchange -Memberfunktion Bedingungen oder alle anderen gültigen C++-Anweisungen mit gemischt Exchange und Validierung Funktionsaufrufe enthalten.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, M_bFemale);
DDX_Text (pDX, IDC_EDIT1, num);
//}}AFX_DATA_MAP
Wenn (M_bFemale)
 &Nbsp;  DDV_MinMax (pDX, Alter, 0, M_maxFemaleAge);
anderes
    DDV_MinMax (pDX, Alter, 0, M_maxMaleAge)

Hinweis&Nbsp;  Wie oben gezeigt, wie Code kann nicht von Klassen-Assistenten bearbeitet werden und sollte nur außerhalb der speziellen Format Kommentare verwendet werden.

ClassWizard Unterstützung

Klassen-Assistent unterstützt eine Teilmenge der DDX/DDV-Anpassungen, Ihnen erlaubend, Ihre eigenen Routinen DDX_ und DDV in der Klassen-Assistent-Benutzeroberfläche integrieren. Dies ist vorteilhaft, wenn Sie bestimmte DDX und DDV Routinen immer wieder in einem Projekt oder in vielen Projekten wiederverwenden möchten nur Kosten.

Hierzu sind spezielle Einträge in DDX vorgenommen.CLW (frühere Versionen von Visual C++ diese Informationen in APSTUDIO gespeichert.(INI) oder in Ihrem Projekts.CLW-Datei. Die speziellen Einträge werden können entweder im Abschnitt [General Info] Ihres Projekts eingegeben.CLW-Datei oder im Abschnitt [ExtraDDX] die DDX.CLW-Datei in \Programme\Microsoft Visual Studio\Visual C ++ im \bin-Verzeichnis. Sie müssen möglicherweise die DDX erstellen.CLW-Datei, wenn es nicht bereits vorhanden ist. Wenn Sie die benutzerdefinierten DDX_/DDV-Routinen nur in einem bestimmten Projekt verwenden möchten, fügen Sie die Einträge zum Abschnitt [Allgemeine Info] Ihres Projekts.CLW-Datei statt. Wenn Sie planen, die Routinen in mehreren Projekten verwenden, fügen Sie die Einträge zum Abschnitt [ExtraDDX] der DDX.CLW.

Das allgemeine Format dieser speziellen Einträge ist:

ExtraDDXCount = n

; wobei n die Anzahl der ExtraDDX ist? Linien folgen

ExtraDDX? = Lt; Schlüssel >, < Vb-Schlüssel >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]

; Wo? ist eine Nummer 1-n, der angibt, welche DDX-Typ in der Liste, die definiert wird.

Jedes Feld ist durch ein Zeichen ';' getrennt. Die Felder und deren Zweck werden nachfolgend beschrieben.

Lt; Schlüssel & gt;

= Liste der einzelnen Zeichen, die angibt, für welche Dialogfeldsteuerelemente diesen Variablentyp zulässig ist.

E = bearbeiten

C = zwei-Staaten-Kontrollkästchen

c = check das tri-state

R = erste Optionsfeld in einer Gruppe

L = nicht sortierten Listenfeld

l = sortierten listenfeld

M = Kombinationsfeld (mit Element bearbeiten)

N = nicht sortierten Drop-Liste

n = sortierte drop-liste

1 = Wenn die DDX-Insert Kopf der Liste hinzugefügt werden soll (Standard ist Schwanz hinzufügen) &Nbsp; Dies wird im Allgemeinen für DDX-Routinen verwendet, die die Eigenschaft "Control" übertragen.

Lt; Vb-Schlüssel & gt;

dieses Feld wird nur in der 16-Bit-Produkt für VBX-Steuerelemente verwendet (VBX-Steuerelemente werden in der 32-Bit-Produkt nicht unterstützt)

Lt; Eingabeaufforderung > =

zeichenfolge, die Eigenschaft Kombinationsfeld (ohne Anführungszeichen)

Lt; Typ > =

einzelnen Bezeichner für den Typ in der Header-Datei ausgeben. In unserem Beispiel oben mit DDX_Time würde dies zu CTime festgelegt werden.

Lt; Vb-Schlüssel > =

in dieser version nicht verwendet und sollte immer leer sein

Lt; InitValue > =

anfangswert - 0 oder leer. Wenn es leer ist, wird keine Initialisierung-Linie im Abschnitt //{{AFX_DATA_INIT der Implementierungsdatei geschrieben werden. Ein leerer Eintrag sollte für C++-Objekte (z. B. CString, CTime usw.) verwendet werden, die Konstruktoren verfügen, die korrekte Initialisierung garantieren.

Lt; DDX_Proc > =

einzelnen Bezeichner für die DDX_-Prozedur. Der C++-Funktionsnamen muss mit "DDX_" beginnen, aber nicht enthalten "DDX_" in der Lt; DDX_Proc > Bezeichner. Im obigen Beispiel wäre der Bezeichner <DDX_Proc> Zeit. Wenn Klassen-Assistent schreibt den Funktionsaufruf in der Implementierungsdatei der {{AFX_DATA_MAP Abschnitt, es fügt dieser Name an DDX_, so DDX_Time Ankunft.

Lt; Kommentar > =

kommentar anzeigen im Dialogfeld für Variable mit diesem DDX. Platzieren Sie den Text, den Sie wie hier, in der Regel etwas bieten würde, der die Operation durchgeführt durch die DDX/DDV-paar beschreibt.

Lt; DDV_Proc & gt;

Der DDV Teil des Eintrags ist optional. Nicht alle DDX-Routinen haben entsprechende DDV-Routinen. Oft ist es bequemer, die Validierungsphase als integraler Bestandteil des Transfers enthalten. Dies ist häufig der Fall, wenn eine DDV-Routine Parameter, nicht erforderlich, da ClassWizard DDV Routinen ohne Parameter nicht unterstützt.

= einzelnen Bezeichner für das DDV-Verfahren. Der C++-Funktionsnamen muss beginnen mit "DDV" aber nicht enthalten "DDX_" in der Lt; DDX_Proc > Bezeichner.

gefolgt von 1 oder 2 DDV args:

Lt; PromptX > =

zeichenfolge, die über d&as element bearbeiten (mit amp; für accelerator) stellen

Lt; FmtX > =

formatzeichen für den arg-typ, einer der

d = int

u = ohne vorzeichen

D = long Int (das heißt, lange)

U = lange nicht signierten (das heißt, DWORD)

f = float

F = Doppelzimmer

s = string

Ein Beispiel für benutzerdefinierte DDX

Ein Beispiel für benutzerdefinierte DDX mit Validation finden Sie in der MFC Advanced Concepts-Probe CHKBOOK. Finden Sie unter DDX_DollarsCents in DOLLCENT.CPP eine Beispielimplementierung eines benutzerdefinierten DDX Routine und CHKBOOK.CLW für das entsprechende Beispiel ExtraDDXCount und ExtraDDX1-Einträge im Abschnitt [General Info] die CHKBOOK.CLW-Datei.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index