Partager via


TN026 : Routines DDX et de DDV

[!REMARQUE]

La note technique suivante n'a pas été mise à jour depuis que c'était première incluse dans la documentation en ligne.Par conséquent, certaines procédures et des rubriques obsolètes ou non valides.Pour obtenir les informations les plus récentes, il est recommandé que vous trouviez la rubrique présentant un intérêt dans l'index de la documentation en ligne.

Cette remarque décrit l'échange de données de boîtes de dialogue (DDX) et l'architecture de (DDV) de validation des données de dialogue.Elle décrit également comment vous écrivez une procédure de DDX_ ou de DDV_ et comment vous pouvez étendre assistant classe pour utiliser les routines.

Vue d'ensemble de l'échange de données de boîtes de dialogue

Toutes les fonctions de données de dialogue sont effectuées avec le code C++.Il n'existe aucune ressource particulière ou un magique.Le cœur du mécanisme est une fonction virtuelle qui est substituée dans chaque classe de boîte de dialogue qui fait l'échange de données de boîtes de dialogue et la validation.Il est toujours trouve sous cette forme :

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);    // call base class

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

Les commentaires spéciaux d'AFX de format permettent à ClassWizard pour rechercher et modifier le code de cette fonction.Le code qui n'est pas compatible avec assistant classe doit être défini en dehors de les commentaires spéciaux de format.

Dans l'exemple ci-dessus, <data_exchange_function_call> est sous la forme :

    DDX_Custom(pDX, nIDC, field);

et <data_validation_function_call> est facultatif et est sous la forme :

    DDV_Custom(pDX, field, ...);

Plusieurs paires de DDX_/DDV_ peuvent être inclus dans chaque fonction d' DoDataExchange .

Consultez « afxdd_.h » pour obtenir une liste de tous les routines d'échange de données de boîtes de dialogue et de routines de validation des données de dialogue avec MFC.

Les données de dialogue sont seulement celle : données membres dans la classe de CMyDialog .Il n'est pas inscrite dans un struct ou n'importe quoi similaire.

Remarques

Bien que nous appelions ces « données de dialogue, » toutes les fonctionnalités disponibles dans toute classe dérivée d' CWnd et ne sont pas limitées uniquement aux boîtes de dialogue.

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

CWnd::UpdateData est l'opération qui entraîne l'initialisation et la gestion des erreurs autour de l'appel à DoDataExchange.

Vous pouvez appeler CWnd::UpdateData à tout moment pour exécuter l'échange de données et la validation.Par défaut UpdateData (TRUE) est appelé dans le gestionnaire par défaut d' CDialog::OnOK et UpdateData (FALSE) est appelé dans CDialog::OnInitDialogpar défaut.

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

Comment fonctionne-t-cela ?

Vous n'avez pas besoin d'inclure les éléments suivants afin d'utiliser des données de dialogue.Toutefois, la comprendre comment il fonctionne en arrière-plan vous aidera à écrire votre propre procédure d'échange ou de validation.

La fonction membre d' DoDataExchange est très comparable à la fonction membre d' Serialize - il est chargé d'obtenir ou de définir des données à/d ' une forme externe (dans ce cas contrôles dans une boîte de dialogue) de/à des données membres dans la classe.Le paramètre d' pDX est le contexte pour effectuer l'échange de données et est similaire au paramètre d' CArchive à CObject::Serialize.pDX (un objet d' CDataExchange ) a une balise de direction comme CArchive a une balise de direction :

  • Si !m_bSaveAndValidate, chargent l'état de données dans les contrôles.

  • Si m_bSaveAndValidate, plaçait l'état de données des contrôles.

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

Il existe trois autres membres intéressants d' CDataExchange :

  • m_pDlgWnd: La fenêtre (généralement une boîte de dialogue) qui contient des contrôles.C'est d'empêcher les appelants les fonctions globales de DDX_ et de DDV_ de doit passer « this » à chaque sous-routine DDX/DDV.

  • PrepareCtrl, et PrepareEditCtrl: Prépare un contrôle de boîte de dialogue pour l'échange de données.Stocke la poignée de commande pour définir le focus si la validation échoue.PrepareCtrl est utilisé pour les contrôles de nonedit et PrepareEditCtrl est utilisé pour les contrôles d'édition.

  • Échec: Appelé après avoir apporté un message alertant l'utilisateur à l'erreur d'entrée.Cette routine restaurera le focus vers le dernier contrôle (le dernier appel à PrepareCtrl/PrepareEditCtrl) et lève une exception.Cette fonction membre peut être appelée des routines de DDX_ et de DDV_.

Extensions d'utilisateur

Il existe plusieurs manières d'étendre le mécanisme de la valeur par défaut DDX/DDV.Vous pouvez effectuer l'une des actions suivantes :

  • Ajoutez de nouveaux types de données.

    CTime
    
  • Ajoutez les nouvelles procédures d'échange (DDX_ ? ? ?).

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Ajoutez les nouvelles procédures de validation (DDV_ ? ? ?).

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • Passez les expressions arbitraires aux procédures de validation.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    [!REMARQUE]

    De telles expressions arbitraires ne peuvent pas être modifiées par ClassWizard et ne doivent donc pas être déplacées en dehors de les commentaires spéciaux de format (// {{AFX_DATA_MAP (CMyClass)).

Pour comprendre la fonction membre de DoDialogExchange des éléments conditionnels ou toutes les autres instructions valides C++ avec les appels de fonction entremêlés d'échange et de validation.

//{{AFX_DATA_MAP(CMyClass)
DDX_Check(pDX, IDC_SEX, m_bFemale);
DDX_Text(pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
if (m_bFemale)
    DDV_MinMax(pDX, age, 0, m_maxFemaleAge);
else
    DDV_MinMax(pDX, age, 0, m_maxMaleAge);

[!REMARQUE]

Comme indiqué ci-dessus, ce code ne peut pas être modifié par ClassWizard et doit être utilisé uniquement en dehors de les commentaires spéciaux de format.

Prise en charge de ClassWizard

Assistant classe prend en charge un sous-ensemble de personnalisations DDX/DDV en vous permettant de pour intégrer vos propres routines de DDX_ et de DDV_ dans l'interface utilisateur d'assistant classe.Cela est prix unique salutaire si vous comptez réutiliser des routines particulières DDX et de DDV dans un projet ou dans de nombreux projets.

Pour cela, les entrées spéciales sont effectuées dans DDX.CLW (les versions antérieures de Visual C++ ont stocké ces informations dans APSTUDIO.INI) ou dans le fichier de .CLW de votre projet.Les entrées spéciales peuvent être écrites dans la section [informations générales] du fichier de .CLW de votre projet ou dans la section [ExtraDDX] du fichier de DDX.CLW dans \Program Files\Microsoft Visual Studio\Visual C++\bin.Vous devrez peut-être créer le fichier de DDX.CLW s'il n'existe pas.Si vous prévoyez d'utiliser les routines de le personnalisé DDX_/DDV_ uniquement dans un projet, ajoutez les entrées [à la section des informations générales] de votre fichier projet .CLW à la place.Si vous prévoyez d'utiliser les routines sur de nombreux projets, ajoutez les entrées [à la section d'ExtraDDX] de DDX.CLW.

Le format standard de ces entrées spéciales est :

ExtraDDXCount=n

où n est le nombre d'ExtraDDX ?lignes à suivre

ExtraDDX?=<keys>;<vb-keys>; <prompt>; <type>; <initValue>; <DDX_Proc>
[;<DDV_Proc>; <prompt1>; <arg1>; [<prompt2>; <fmt2>]]

où ?est un numéro 1 – indiquer de n que DDX dans la liste définie.

Chaque champ est délimité par « ;  ».Les champs et leur but sont décrits ci-dessous.

  • <keys>
    = liste de caractères uniques indiquant pour lesquels les contrôles de boîte de dialogue est autorisé ce type de variable.

    E = modification

    C = case à cocher à deux états

    c = case à cocher à trois états

    R = d'abord case d'option à un groupe

    L = zone de liste nonsorted

    l = a trié la zone de liste

    M = zone de liste déroulante (avec l'élément de modification)

    N = liste nonsorted de déplacement

    n = liste triée de déplacement

    1 = si l'insertion de DDX est ajoutée au début de la liste (valeur par défaut est ajoutez à la fin) que cela est généralement utilisé pour les routines DDX qui transfèrent la propriété « contrôle ».

  • <vb-keys>
    Ce champ est utilisé uniquement dans le produit 16 bits pour les contrôles de VBX (contrôles de VBX ne sont pas pris en charge dans le produit de 32 bits)

  • <prompt>
    Chaîne à définir dans la zone de liste déroulante de la propriété (aucun guillemet)

  • <type>
    Identificateur unique pour le type émette dans le fichier d'en-tête.Dans notre exemple ci-dessus avec DDX_Time, cela est défini sur CTime.

  • <vb-keys>
    Non utilisé dans cette version et doit toujours être vide

  • <initValue>
    Valeur initiale à 0 ou vide.Si elle est vide, aucune ligne d'initialisation n'est entrée dans //{{section d'AFX_DATA_INIT du fichier d'implémentation.Une entrée blanc doit être utilisée pour les objets C++ (par exemple CString, CTime, etc.) qui possèdent des constructeurs qui vérifient l'initialisation correcte.

  • <DDX_Proc>
    Identificateur unique pour la procédure de DDX_.Le nom de fonction C++ doit commencer par « DDX_ », mais pas « DDX_ » dans l'identificateur d' <DDX_Proc> .Dans l'exemple ci-dessus, l'identificateur d' <DDX_Proc> serait temps.Lorsque ClassWizard écrit l'appel de fonction dans le fichier d'implémentation dans {{section d'AFX_DATA_MAP, il ajoute ce nom à DDX_, de ce fait arrivant à DDX_Time.

  • <comment>
    Commentez pour afficher dans la boîte de dialogue pour la variable à ce DDX.Définissez un texte que vous souhaitez ici, et fournissez habituellement un nom qui décrit l'opération exécutée par les paires DDX/DDV.

  • <DDV_Proc>
    La partie de DDV de l'entrée est facultative.Tous les routines DDX ont correspondre des routines de DDV.Souvent, il est plus pratique de comprendre la phase de validation en tant que partie intégrante de la migration.Cela est souvent le cas où votre routine de DDV ne requiert aucun paramètre, car assistant classe ne prend en charge des routines de DDV sans paramètre.

  • <arg>
    Identificateur unique pour la procédure de DDV_.Le nom de fonction C++ doit commencer par « DDV_ », mais pas « DDX_ » dans l'identificateur d' <DDX_Proc> .

suivi de 1 ou 2 args de DDV :

  • <promptX>
    chaîne à définir au-dessus de l'élément de modification (avec et pour l'accélérateur)

  • <fmtX>
    caractère de format pour le type d'arg, un de

    d = int

    u = non signé

    D = long int (autrement dit, long)

    U = long non signé (autrement dit, DWORD)

    f = float

    F = double

    s = chaîne

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie