TN026 : DDX et DDV Routines

Cette note décrit l'échange de données de boîte de dialogue (DDX) et l'architecture de boîte de dialogue données validation (DDV). Il décrit également comment vous écrire une procédure DDX_ ou DDV_ et comment vous pouvez étendre ClassWizard pour utiliser vos routines.

Aperçu de la boîte de dialogue données Exchange

Toutes les fonctions de boîte de dialogue données sont faites avec du code C++. Il n'y a aucune ressources spéciales ou des macros magiques. Le cœur du mécanisme est une fonction virtuelle qui est substituée dans chaque classe de boîte de dialogue qui dialogue, échange de données et la validation. On le trouve toujours dans le présent formulaire:

vOID CMyDialog::DoDataExchange (pDX CDataExchange *)
{
 nbsp ;  CDialog::DoDataExchange(pDX) ;    / / appeler la classe de base

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

Les commentaires AFX format spécial permettent de ClassWizard localiser et modifier le code dans cette fonction. Code qui n'est pas compatible avec ClassWizard doit être placé à l'extérieur des commentaires format spécial.

Dans l'exemple ci-dessus, lt ; data_exchange_function_call > se présente sous la forme:

  ;   DDX_Custom (pDX, nIDC, champ)

et lt ; data_validation_function_call > est facultatif et est sous la forme:

  ;   DDV_Custom (pDX, terrain,...)

Plus d'une paire DDX_ et DDV_ peut-être être incluse dans chaque fonction DoDataExchange.

Voir « afxdd_.h » pour une liste de toutes les routines de boîte de dialogue données exchange et les routines de validation de données de boîte de dialogue fournies avec MFC.

Données de la boîte de dialogue sont juste que - données de membre dans la classe CMyDialog . N'est pas stockée dans un struct ou quelque chose comme ça.

Notes

Bien que nous appelons cette "données de la boîte de dialogue", toutes les fonctionnalités sont disponibles dans n'importe quelle classe dérivée de CWnd et ne sont pas limitées à quelques boîtes de dialogue.

Les valeurs initiales de données sont définies dans le constructeur de C++ standard, généralement dans un bloc avec //{{AFX_DATA_INIT et //}}AFX_DATA_INIT commentaires.

CWnd::UpdateData est l'opération qui fait l'initialisation et gestion des erreurs autour de l'appel de DoDataExchange.

Vous pouvez appeler CWnd::UpdateData à tout moment pour effectuer l'échange de données et de validation. Par défaut, UpdateData(vrai) est appelée dans le gestionnaire d'événements par défaut CDialog::OnOK et UpdateData(faux) est appelée par défaut CDialog::OnInitDialog.

La routine DDV_ doit suivre immédiatement la routine DDX_ pour ce champ.

Comment ça marche?

Vous n'avez pas besoin de comprendre ce qui suit afin d'utiliser les données de la boîte de dialogue. Cependant, comprendre comment cela fonctionne dans les coulisses est vous aider à écrire votre propre procédure d'échange ou de la validation.

La fonction de membre de DoDataExchange est assez semblable à la fonction de membre Serialize - il est responsable de l'obtention ou la définition des données et d'une forme externe (dans ce cas contrôles dans une boîte de dialogue) de/à des données des membres de la classe. Le paramètre pDX est dans ce contexte pour faire l'échange de données et est similaire au paramètre CArchive à CObject::Serialize. Le pDX (objet CDataExchange ) est un indicateur de direction comme CArchive a un indicateur de direction

Validation se produit uniquement lorsque m_bSaveAndValidate est défini. La valeur de m_bSaveAndValidate est déterminée par le paramètre BOOL CWnd::UpdateData.

Il y a trois autres membres de CDataExchange intéressants:

Extensions de l'utilisateur

Il y a plusieurs façons d'étendre le mécanisme DDX/DDV par défaut. Vous pouvez:

Ont la fonction de membre des DoDialogExchange conditionnels ou toute autres instructions C++ valides avec échange mélangé et les appels de fonction de validation.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale) ;
DDX_Text (pDX, IDC_EDIT1, m_age) ;
//}}AFX_DATA_MAP
Si (m_bFemale)
   ;  DDV_MinMax (pDX, âge, 0, m_maxFemaleAge) ;
autre
    DDV_MinMax (pDX, âge, 0, m_maxMaleAge)

&Notenbsp ;  Comme indiqué ci-dessus, ce code ne peut pas être édité par ClassWizard et devrait être utilisé uniquement à l'extérieur des commentaires format spécial.

ClassWizard soutien

ClassWizard prend en charge un sous-ensemble de personnalisations DDX/DDV en vous permettant d'intégrer vos propres routines DDX_ et DDV_ dans l'interface utilisateur de ClassWizard. Cela est bénéfique si vous prévoyez de réutiliser des routines particulières de DDX et DDV maintes et maintes fois dans un projet ou dans de nombreux projets seul coût.

Pour ce faire, des entrées spéciales sont fabriquées en DDX.CLW (les versions précédentes de Visual C++ stockaient cette information dans APSTUDIO.INI) ou dans le cadre de votre projet.Fichier CLW. Les entrées spéciales peuvent être entrés dans la section [General Info] de votre projet.Fichier CLW ou dans la section [ExtraDDX] de la DDX.Fichier CLW dans le dossier \Program Files\Microsoft Visual Studio\Visual C ++ répertoire \bin. Vous devrez peut-être créer la DDX.Fichier CLW si il n'existe pas déjà. Si vous prévoyez d'utiliser les routines DDX_ et DDV_ personnalisées que dans un certain projet, ajoutez les entrées de la section [General Info] de votre projet.CLW fichier au lieu de cela. Si vous prévoyez d'utiliser les routines sur de nombreux projets, ajoutez les entrées de la section [ExtraDDX] de DDX.CLW.

Le format général de ces entrées spéciales est:

ExtraDDXCount = n

; où n est le nombre de ExtraDDX ? lignes à suivre

ExtraDDX? = lt ; touches > ; < vb-clés > ; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]

; Où ? est un numéro 1-n indiquant quel type DDX dans la liste qui est en cours de définition.

Chaque champ est délimité par un caractère «; ». Les champs et leur objet sont décrits ci-dessous.

lt ; touches & gt;

= Liste de caractères uniques indiquant pour les contrôles de boîte de dialogue variable de ce type est autorisé.

E = edit

C = la case à cocher deux États

c = la case à cocher tri-state

R = le premier bouton radio dans un groupe

L = zone de liste non triée

l = zone de liste triée

M = zone de liste modifiable (à modifier l'élément)

N = liste déroulante non triés

n = liste déroulante trié

1 = si l'i&nsert DDX doit être ajoutée à la tête de liste (par défaut est ajouté à la queue) nbsp ; Ceci est généralement utilisé pour les routines de DDX qui transfert la propriété de « Contrôle ».

lt ; vb-clés & gt;

ce champ est utilisé uniquement dans le produit de 16-bit pour les contrôles VBX (VBX contrôles ne sont pas supportées dans le produit de 32 bits)

lt ; prompt > =

chaîne à placer dans la zone de liste déroulante de propriété (sans guillemets)

lt ; type > =

identificateur unique pour le type d'émettre dans le fichier d'en-tête. Dans notre exemple ci-dessus avec DDX_Time, ce serait défini de CTime.

lt ; vb-clés > =

pas utilisé dans cette version et doit toujours être vide

lt ; initValue > =

valeur initiale - 0 ou vide. Si c'est vide, aucune ligne d'initialisation ne sera écrit dans la section //{{AFX_DATA_INIT du fichier de la mise en œuvre. Une entrée vide doit être utilisée pour les objets C++ (tels que CString, CTime et ainsi de suite) qui sont les constructeurs qui garantissent l'initialisation correcte.

lt ; DDX_Proc > =

identificateur unique de la procédure DDX_. Le nom de la fonction C++ doit commencer par "DDX_", mais ne comprend pas « DDX_ » de la lt ; DDX_Proc > identificateur. Dans l'exemple ci-dessus, l'identificateur de <DDX_Proc> serait temps. Quand ClassWizard écrit l'appel de fonction dans le fichier de mise en œuvre dans le {{article AFX_DATA_MAP, elle ajoute ce nom au DDX_, arrivant ainsi à DDX_Time.

lt ; commentaire > =

commentaire s'affiche dans la boîte de dialogue variable avec cette DDX. Placer n'importe quel texte vous serait comme ici, généralement fournir quelque chose qui décrit l'opération effectuée par la paire DDX/DDV.

lt ; DDV_Proc & gt;

La portion DDV de l'entrée est facultative. Pas toutes les routines DDX ont des routines de DDV correspondants. Souvent, il est plus commode pour y inclure la phase de validation comme partie intégrante du transfert. C'est souvent le cas lorsque votre routine DDV ne nécessite pas de paramètres, car ClassWizard ne supporte pas les routines DDV sans aucun paramètre.

= identificateur unique pour la procédure DDV_. Le nom de la fonction C++ doit commencer par « DDV_ », mais ne comprend pas « DDX_ » de la lt ; DDX_Proc > identificateur.

suivie de 1 ou 2 DDV args:

lt ; promptX > =

ch&aîne à placer au-dessus de l'élément edit (avec amp ; pour l'accélérateur)

lt ; fmtX > =

format caractères pour le type de l'arg, l'un des

d = int

u = non signés

D = long int (qui est, depuis longtemps)

U = long non signé (c'est-à-dire, DWORD)

f = fen?tre flottante

F = double

s = chaîne

Un exemple de coutume DDX

On trouvera un exemple de DDX personnalisée avec la validation dans l'exemple MFC Advanced Concepts CHKBOOK. Voir DDX_DollarsCents dans DOLLCENT.RPC pour un exemple d'implémentation d'une routine de DDX personnalisée et de CHKBOOK.CLW pour l'exemple correspondant ExtraDDXCount et la ExtraDDX1 entrées dans la section [General Info] de CHKBOOK.Fichier CLW.

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index