TN026: procedury DDX i DDV

[!UWAGA]

Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.

Uwaga ta opisuje okno danych sprawdzania poprawności (DDV) architektura i okno dialogowe wymiany danych (DDX).Opisano również jak napisać procedurę DDX_ lub DDV_ i jak można rozszerzyć ClassWizard do korzystania z procedury.

Omówienie okno Wymiana danych

Wszystkie funkcje danych okno dialogowe są wykonane z kodem w języku C++.Nie ma żadnych specjalnych zasobów lub magic makra.Serce mechanizmu jest wirtualny funkcja, która zostanie zastąpiona w każdej klasie okno, że ma okno dialogowe wymiany danych i sprawdzania poprawności.Znajduje się zawsze w tym formularzu:

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
}

Specjalny format AFX komentarze pozwalają ClassWizard do zlokalizowania i edytować kod w ramach tej funkcji.Kod, który nie jest zgodny z ClassWizard powinny być umieszczone poza komentarze specjalny format.

W powyższym przykładzie <data_exchange_function_call> jest w postaci:

    DDX_Custom(pDX, nIDC, field);

i <data_validation_function_call> jest opcjonalna i ma postać:

    DDV_Custom(pDX, field, ...);

W każdym może zawierać więcej niż jedną parę DDX_/DDV_ DoDataExchange funkcji.

Zobacz listę wszystkich procedur wymiany danych okno dialogowe i procedur sprawdzania poprawności danych okno dialogowe wyposażone MFC 'afxdd_.h'.

Okno danych jest tak, że: dane elementu członkowskiego w CMyDialog klasy.Nie jest przechowywana w struct lub coś podobnego.

Uwagi

Chociaż nazywamy to "dane okno", wszystkie funkcje są dostępne w dowolnej klasy pochodne CWnd i nie są ograniczone do tylko okien dialogowych.

Wartości początkowych danych są ustawione w Konstruktorze standard C++, zwykle w blok z //{{AFX_DATA_INIT i //}}AFX_DATA_INIT komentarze.

CWnd::UpdateDatajest operacją, która nie wymaga inicjalizacji i wokół wezwanie do obsługi błędów DoDataExchange.

Można wywołać CWnd::UpdateData w dowolnym momencie przeprowadzić wymianę danych i sprawdzania poprawności.Domyślnie UpdateData(PRAWDA), jest nazywany w domyślnym CDialog::OnOK obsługi i UpdateData(FAŁSZ) jest nazywany w domyślnym CDialog::OnInitDialog.

Rutynowe DDV_ należy natychmiast wykonaj rutynowe DDX_ do tego field.

Jak to działa?

Nie trzeba zrozumieć następujące, aby używać danych okno dialogowe.Jednakże zrozumienia, jak działa w tle pomoże Ci pisać własne procedury wymiany lub sprawdzania poprawności.

DoDataExchange Funkcji składowej jest bardzo podobny do Serialize funkcji składowej - jest on odpowiedzialny za ustawianie i pobieranie danych do/z zewnętrznych formularza (w tym przypadku formantów w oknie dialogowym) z/do danych elementu członkowskiego w klasie.pDX Parametr jest kontekstem, umożliwiające wymianę danych i jest podobny do CArchive parametru do CObject::Serialize.pDX ( CDataExchange Obiektu) ma kierunek, podobnie jak flaga CArchive ma flagę kierunku:

  • Jeśli ! m_bSaveAndValidate, następnie załadować dane Państwo do formantów.

  • Jeśli m_bSaveAndValidate, a następnie ustaw stan danych z formantów.

Sprawdzanie poprawności występuje tylko wtedy, gdy m_bSaveAndValidate jest ustawiona.Wartość m_bSaveAndValidate jest określana przez parametr BOOL, aby CWnd::UpdateData.

Istnieją trzy inne ciekawe CDataExchange członków:

  • m_pDlgWnd: Okna (zwykle dialog) zawiera formanty.Ma to zapobiec wywołaniach globalne funkcje DDX_ i DDV_ o przekazywanie "this" do każdej procedury DDX/DDV.

  • PrepareCtrl, i PrepareEditCtrl: przygotowuje formant okna dialogowego do wymiany danych.Przechowuje dojście tego formantu do ustawiania fokusu, jeśli sprawdzanie poprawności nie powiedzie się.PrepareCtrlSłuży do sterowania nonedit i PrepareEditCtrl jest używany dla formantów edycyjnych.

  • Niepowodzenie: wywoływana po wychowania okno komunikatu ostrzegania użytkownika o błąd danych wejściowych.Procedura ta spowoduje przywrócenie ostatniego formantu fokus (ostatnie wywołanie PrepareCtrl/PrepareEditCtrl) i zgłosić wyjątek.Ta funkcja członek może być wywoływana z procedur zarówno DDX_, jak i DDV_.

Rozszerzenia użytkownika

Istnieje kilka sposobów, aby rozszerzyć domyślnego mechanizmu DDX/DDV.Możesz:

  • Dodaj nowe typy danych.

    CTime
    
  • Dodawanie nowych procedur wymiany (DDX_?).

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Dodawanie nowych procedur sprawdzania poprawności (DDV_?).

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • Przekazać dowolnego wyrażenia do procedury sprawdzania poprawności.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    [!UWAGA]

    Takie dowolnego wyrażenia nie mogą być edytowane przez ClassWizard i powinny być przeniesione poza komentarze specjalny format (/ / {{AFX_DATA_MAP(CMyClass)).

Mają DoDialogExchange funkcji składowej obejmują warunkowe lub wszelkich innych prawidłowych instrukcji języka C++ z mieszaniny wywołań funkcji programu exchange i sprawdzania poprawności.

//{{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);

[!UWAGA]

Jak wykazano powyżej, taki kod nie może być edytowany przez ClassWizard i powinna być używana tylko poza komentarze specjalny format.

Obsługa ClassWizard

ClassWizard obsługuje podzbiór dostosowań DDX/DDV, umożliwiając integracji własnych procedur DDX_ i DDV_ w interfejsie użytkownika ClassWizard.Jest to tylko koszt korzystne jeśli istniejące szczególne procedury DDX i DDV w projekcie lub w wielu projektach.

W tym celu specjalne tworzone są zapisy w DDX.CLW (poprzednie wersje Visual C++ przechowuje te informacje w APSTUDIO.INI) lub do projektu.Plik CLW.Specjalne wpisy mogą być wprowadzone w sekcji [General Info] projektu.Plik CLW lub w sekcji [ExtraDDX] DDX.Plik CLW w katalogu \Program Files\Microsoft Visual Studio\Visual C ++ \bin.Może być konieczne tworzenie DDX.Plik CLW, jeśli jeszcze nie istnieje.Jeśli zamierzasz używać niestandardowych procedur DDX_/DDV_ tylko w niektórych projektów, należy dodać wpisy do sekcji [General Info] projektu.CLW pliku zamiast.Jeśli zamierzasz używać procedur na wiele projektów, należy dodać wpisy do sekcji [ExtraDDX] DDX.CLW.

Jest ogólny format te specjalne wpisy:

ExtraDDXCount=n

gdzie n jest numerem ExtraDDX? wiersze do naśladowania

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

gdzie? numer 1-n jest wskazanie typu DDX na liście, który jest zdefiniowany.

Każde pole jest rozdzielany znakiem ";".Poniżej opisano pola i ich przeznaczenie.

  • <klucze>
    = Lista pojedyncze znaki wskazujące, dla których formanty okna dialogowego tego typu zmienna jest dozwolone.

    E = Edycja

    C = pole wyboru dwóch Państw

    c = pole wyboru tri-state

    R = pierwszy przycisk opcji w grupie

    L = pole listy nonsorted

    l = pole posortowanej listy

    M = pole kombi (Edytuj element)

    N = lista nonsorted upuszczania

    n = upuszczania posortowanej listy

    1 = if Wstaw DDX powinny zostać dodane do głowy listy (domyślny jest dodać ogon) to jest zazwyczaj używany dla procedur DDX, które przeniesienia własności "Kontrola".

  • <VB klucze>
    To pole jest używane tylko w 16-bitowy produkt dla formantów VBX (formantów VBX nie są obsługiwane w produkcie 32-bitowe)

  • <wiersz>
    Ciąg, który ma miejsce w polu kombi właściwość (bez cudzysłowów)

  • <typ>
    Pojedynczy identyfikator typu emitować w pliku nagłówka.W naszym przykładzie powyżej z DDX_Time to może być równa CTime.

  • <VB klucze>
    Nie używane w tej wersji i powinien zawsze być pusty

  • <initValue>
    Wartość początkowa — 0 lub pusty.Jeśli jest ono puste, żaden wiersz inicjowania zostaną zapisane w sekcji //{{AFX_DATA_INIT pliku implementacji.Pusty wpis należy stosować do obiektów języka C++ (takie jak CString, CTime, i tak dalej) które mają konstruktorów, które gwarantują poprawne inicjowania.

  • <DDX_Proc>
    Identyfikator pojedynczej procedury DDX_.Nazwa funkcji języka C++ musi rozpoczynać się od "DDX_", ale nie dołączaj "DDX_" w <DDX_Proc> identyfikator.W przykładzie powyżej <DDX_Proc> identyfikator będzie czas.Kiedy ClassWizard pisze wywołania funkcji w pliku implementacji w {{sekcja AFX_DATA_MAP, to dołącza tę nazwę do DDX_, w ten sposób dotarcia do DDX_Time.

  • <komentarz>
    Komentarz do pokazania w oknie dialogowym dla zmiennej z tym DDX.Umieść tekst ma się tutaj i zwykle oferują coś opisującą działanie wykonywane przez parę DDX/DDV.

  • <DDV_Proc>
    DDV część zapis jest opcjonalne.Nie wszystkie procedury DDX mają odpowiednie procedury DDV.Często jest to bardziej wygodne, uwzględniać fazy sprawdzania poprawności jako integralną część transferu.Tak jest często podczas rutynowych DDV nie wymaga żadnych parametrów, ponieważ ClassWizard nie obsługuje procedury DDV bez żadnych parametrów.

  • <ARG>
    Identyfikator pojedynczej procedury DDV_.Nazwa funkcji języka C++ musi rozpoczynać się od "DDV_", ale nie zawierają "DDX_" w <DDX_Proc> identyfikator.

następnie args DDV 1 lub 2:

  • <promptX>
    ciąg, aby umieścić powyżej edytowanie pozycji (z & dla accelerator)

  • <fmtX>
    Format znak dla typu arg, jeden z

    d = int

    u = bez znaku

    D = int długie (to znaczy, długi)

    U = długa bez znaku (czyli DWORD)

    f = float

    F = podwójne

    s = ciąg

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii