Sdílet prostřednictvím


TN026: Rutiny DDX a DDV

Poznámka:

Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.

Tato poznámka popisuje architekturu výměny dat dialogového okna (DDX) a ověřování dat dialogových oken (Prohlížeč diagnostických dat). Popisuje také, jak psát DDX_ nebo Prohlížeč diagnostických dat_ procedura a jak můžete rozšířit TřídyWizard tak, aby používal vaše rutiny.

Přehled výměny dat dialogových oken

Všechny datové funkce dialogového okna se provádějí pomocí kódu jazyka C++. Neexistují žádné speciální prostředky ani magická makra. Jádrem mechanismu je virtuální funkce, která je přepsána v každé třídě dialogového okna, která provádí výměnu a ověřování dat dialogového okna. Vždy se nachází v tomto formátu:

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
}

Komentáře AFX ve speciálním formátu umožňují třídyWizard vyhledat a upravit kód v rámci této funkce. Kód, který není kompatibilní s ClassWizard by měl být umístěn mimo komentáře speciálního formátu.

Ve výše uvedeném příkladu <je data_exchange_function_call> ve formuláři:

DDX_Custom(pDX, nIDC, field);

a <data_validation_function_call> je nepovinný a je ve formuláři:

DDV_Custom(pDX, field, ...);

Do každé DoDataExchange funkce může být zahrnuto více DDX_/Prohlížeč diagnostických dat_ párů.

Seznam všech rutin výměny dat dialogového okna a rutin ověřování dialogových dat poskytovaných v prostředí MFC najdete v tématu afxdd_.h.

Data dialogového CMyDialog okna jsou jen ta: členová data ve třídě. Neukládá se ve struktuře ani nic podobného.

Notes

I když nazýváme tato "dialogová data", všechny funkce jsou k dispozici v jakékoli třídě odvozené a CWnd nejsou omezeny pouze na dialogy.

Počáteční hodnoty dat jsou nastaveny ve standardním konstruktoru jazyka C++, obvykle v bloku s //{{AFX_DATA_INIT komentáři a //}}AFX_DATA_INIT komentáři.

CWnd::UpdateData je operace, která provádí inicializaci a zpracování chyb kolem volání DoDataExchange.

Kdykoli můžete volat CWnd::UpdateData za účelem výměny a ověření dat. Ve výchozím nastavení UpdateData(PRAVDA) se volá ve výchozí CDialog::OnOK obslužné rutině a UpdateDatave výchozím nastavení CDialog::OnInitDialogse volá (FALSE).

Rutina Prohlížeč diagnostických dat_ by se měla okamžitě řídit rutinou DDX_ pro dané pole.

Jak to funguje

Abyste mohli používat dialogová data, nemusíte rozumět následujícím informacím. Když ale pochopíte, jak to funguje na pozadí, pomůže vám to napsat vlastní postup výměny nebo ověření.

Členová DoDataExchange funkce je podobně jako Serialize členová funkce – zodpovídá za získání nebo nastavení dat z externího formuláře (v tomto případě ovládacích prvků v dialogovém okně) z/do dat členů ve třídě. Parametr pDX je kontext pro výměnu dat a podobá se parametru CArchive CObject::Serialize. PDX (CDataExchangeobjekt) má příznak směru podobně jako CArchive příznak směru:

  • Pokud !m_bSaveAndValidate, pak načtěte stav dat do ovládacích prvků.

  • Pokud m_bSaveAndValidatenastavíte stav dat z ovládacích prvků.

K ověření dochází pouze v případě, že m_bSaveAndValidate je nastavena. Hodnota m_bSaveAndValidate je určena parametrem BOOL na CWnd::UpdateData.

Existují tři další zajímavé CDataExchange členy:

  • m_pDlgWnd: Okno (obvykle dialogové okno), které obsahuje ovládací prvky. To znamená, že volajícím globálních funkcí DDX_ a Prohlížeč diagnostických dat_ zabráníte v předávání "this" do každé rutiny DDX/Prohlížeč diagnostických dat.

  • PrepareCtrla PrepareEditCtrl: Připraví ovládací prvek dialogového okna pro výměnu dat. Uloží popisovač ovládacího prvku pro nastavení fokusu, pokud se ověření nezdaří. PrepareCtrl se používá pro ovládací prvky bez úprav a PrepareEditCtrl slouží k úpravám ovládacích prvků.

  • Fail: Volá se po vyvolání pole se zprávou upozorňující uživatele na vstupní chybu. Tato rutina obnoví fokus na poslední ovládací prvek (poslední volání PrepareCtrl nebo PrepareEditCtrl) a vyvolá výjimku. Tato členová funkce může být volána z rutin DDX_ i Prohlížeč diagnostických dat_.

Uživatelská rozšíření

Existuje několik způsobů, jak rozšířit výchozí mechanismus DDX/Prohlížeč diagnostických dat. Můžete provádět následující akce:

  • Přidejte nové datové typy.

    CTime
    
  • Přidejte nové postupy výměny (DDX_).

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Přidejte nové ověřovací procedury (Prohlížeč diagnostických dat_).

    void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
    // make sure time is in the future or past
    
  • Předejte do ověřovacích procedur libovolných výrazů.

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    Poznámka:

    Tyto libovolné výrazy nelze upravovat pomocí třídyWizard, a proto by se měly přesunout mimo komentáře speciálního formátu (//{{AFX_DATA_MAP(CMyClass)).

DoDataExchange Členské funkce obsahují podmíněné výrazy nebo jakékoli jiné platné příkazy jazyka C++ s intermixovanými voláními výměny a ověřovací funkce.

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

Poznámka:

Jak je znázorněno výše, nelze takový kód upravovat pomocí TřídyWizard a měl by být použit pouze mimo komentáře speciálního formátu.

Podpora třídyWizard

ClassWizard podporuje podmnožinu přizpůsobení DDX/Prohlížeč diagnostických dat tím, že umožňuje integrovat vlastní DDX_ a Prohlížeč diagnostických dat_ rutiny do uživatelského rozhraní ClassWizard. To je výhodné pouze v případě, že plánujete opakovaně používat konkrétní rutiny DDX a Prohlížeč diagnostických dat v projektu nebo v mnoha projektech.

Chcete-li to provést, speciální položky jsou provedeny v DDX.CLW (předchozí verze Visual C++ uložily tyto informace v APSTUDIO. INI) nebo v projektu . CLW soubor. Speciální položky lze zadat buď v části [Obecné informace] projektu . Soubor CLW nebo v části [ExtraDDX] souboru DDX.CLW v adresáři \Program Files\Microsoft Visual Studio\Visual C++\bin. Možná budete muset vytvořit soubor DDX.CLW, pokud ještě neexistuje. Pokud plánujete používat vlastní rutiny DDX_/Prohlížeč diagnostických dat_ pouze v určitém projektu, přidejte položky do oddílu [Obecné informace] projektu . Místo toho soubor CLW. Pokud plánujete používat rutiny v mnoha projektech, přidejte položky do oddílu [ExtraDDX] DDX.CLW.

Obecný formát těchto speciálních položek je:

ExtraDDXCount=n

kde n je počet řádků ExtraDDX?

ExtraDDX?=keys; vb-keys; výzva; typ; initValue; DDX_Proc [; Prohlížeč diagnostických dat_Proc; výzva1; arg1 [; výzva 2; fmt2]]

Kde? je číslo 1 – n určující typ DDX v seznamu, který je definován.

Každé pole je oddělené znakem ;. Pole a jejich účel jsou popsány níže.

  • keys

    Seznam jednoduchých znaků označující, pro který dialog je tento typ proměnné povolený.

    Znak Povolený ovládací prvek
    E Upravit…
    C Dvoustavové zaškrtávací políčko
    c Zaškrtávací políčko tri-state
    R první přepínač ve skupině
    L Neseřazený seznam
    l seřazený seznam
    M pole se seznamem (s upravit položkou)
    N neseřazený rozevírací seznam
    n seřazený rozevírací seznam
    0 Pokud by vložení DDX mělo být přidáno do záhlaví seznamu (výchozí hodnota je přidána do chvostu) Toto se obvykle používá pro rutiny DDX, které přenesou vlastnost Control.
  • vb-keys

    Toto pole se používá pouze v 16bitovém produktu pro ovládací prvky VBX (ovládací prvky VBX nejsou podporovány v 32bitovém produktu).

  • Výzva

    Řetězec, který má být vložen do pole se seznamem Vlastnosti (bez uvozovek)

  • type

    Jeden identifikátor pro typ, který se má vygenerovat v souboru hlavičky. V našem příkladu s DDX_Time by to bylo nastavené na CTime.

  • vb-keys

    V této verzi se nepoužívá a měl by být vždy prázdný.

  • initValue

    Počáteční hodnota – 0 nebo prázdná. Pokud je prázdný, nebude žádný inicializační řádek zapsán v oddílu //{AFX_DATA_INIT souboru implementace. Prázdná položka by se měla použít pro objekty jazyka C++ (například CString, CTimeatd.), které mají konstruktory, které zaručují správnou inicializaci.

  • DDX_Proc

    Jeden identifikátor DDX_ procedury. Název funkce C++ musí začínat "DDX_", ale do identifikátoru <DDX_Proc> nezahrnujte "DDX_". V předchozím příkladu <by identifikátor DDX_Proc> byl Time. Když TřídaWizard zapíše volání funkce do souboru implementace v oddílu {{AFX_DATA_MAP, připojí tento název k DDX_, a tak přichází na DDX_Time.

  • Komentář

    Komentář, který se má zobrazit v dialogovém okně pro proměnnou s tímto DDX Umístěte libovolný text, který byste chtěli, a obvykle zadejte něco, co popisuje operaci prováděnou dvojicí DDX/Prohlížeč diagnostických dat.

  • Prohlížeč diagnostických dat_Proc

    Prohlížeč diagnostických dat část položky je volitelná. Ne všechny rutiny DDX mají odpovídající Prohlížeč diagnostických dat rutiny. Často je vhodnější zahrnout fázi ověření jako nedílnou součást přenosu. To je často případ, kdy vaše rutina Prohlížeč diagnostických dat nevyžaduje žádné parametry, protože ClassWizard nepodporuje Prohlížeč diagnostických dat rutiny bez parametrů.

  • Arg

    Jeden identifikátor procedury Prohlížeč diagnostických dat_. Název funkce C++ musí začínat "Prohlížeč diagnostických dat_", ale do identifikátoru <DDX_Proc> nezahrnujte "DDX_".

    arg následuje 1 nebo 2 Prohlížeč diagnostických dat args:

    • promptN

      Řetězec, který se umístí nad položku pro úpravy (s akcelerátorem a akcelerátorem).

    • fmtN

      Formátovací znak pro typ arg, jeden z:

      Znak Typ
      d int
      u unsigned int
      D dlouhý int (to je dlouhý)
      U dlouhé bez znaménka (to znamená DWORD)
      f float (číslo s plovoucí řádovou čárkou)
      F double
      s string

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií