Sdílet prostřednictvím


TN026: DDX a DDV rutiny

[!POZNÁMKA]

V následující technické poznámce nebyl aktualizován, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být zastaralé nebo nesprávné.Nejnovější informace je vhodné vyhledat téma zájem v dokumentaci online indexu.

Tato poznámka popisuje dialogové okno data ověření (DDV) architektura a výměnu dat dialogu (DDX).Také popisuje, jak vytvořit proceduru DDX_ nebo DDV_ a jak můžete rozšířit ClassWizard použít své rutiny.

Dialog Data Exchange-přehled

Všechny funkce dat dialogové okno dokončení kódu jazyka C++.Neexistují žádné zvláštní prostředky nebo magic makra.Srdce mechanismus je virtuální funkce, která je přepsána v každé třídy dialogové okno, že nemá výměnu dialogových dat a ověřování.Vždy nachází v tomto formuláři:

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
}

Speciální formát AFX komentáře umožňují ClassWizard vyhledat a upravit kód v rámci této funkce.Kód, který není kompatibilní s ClassWizard by měly být umístěny mimo zvláštní formátování komentářů.

Ve výše uvedeném příkladu <data_exchange_function_call> je ve formě:

    DDX_Custom(pDX, nIDC, field);

a <data_validation_function_call> je volitelný a je ve formě:

    DDV_Custom(pDX, field, ...);

Více než jeden pár DDX_/DDV_ mohou být zahrnuty v každé DoDataExchange funkce.

Seznam všech dialog data exchange rutin a dialogové okno data ověřovací rutiny dodávané s knihovnou MFC naleznete v tématu "afxdd_.h".

Dialogové okno dat je tímto způsobem: datový člen v CMyDialog třídy.Není uložena v struct nebo něco podobného.

Poznámky

Přestože nazýváme soubor "data dialogové okno", všechny funkce jsou k dispozici v libovolná třída odvozená z CWnd a nejsou omezeny pouze dialogová okna.

Počáteční hodnoty dat jsou nastaveny v konstruktoru standard C++ obvykle v bloku s //{{AFX_DATA_INIT a //}}AFX_DATA_INIT komentáře.

CWnd::UpdateDataje operace, která provede inicializaci a kolem volání pro zpracování chyb DoDataExchange.

Můžete zavolat CWnd::UpdateData kdykoli provést výměnu a ověření.Ve výchozím nastavení UpdateData(pravda), se nazývá ve výchozím CDialog::OnOK obslužné rutiny a UpdateData(FALSE), se nazývá ve výchozím CDialog::OnInitDialog.

Rutina DDV_ by měla následovat bezprostředně rutinní DDX_ u daného pole.

Jak funguje?

Není nutné pochopit následující, chcete-li použít data dialogové okno.Však vysvětlení, jak to funguje na pozadí můžete napsat svůj vlastní postup výměny nebo ověření.

DoDataExchange Členské funkce je podobně jako Serialize členské funkce - je zodpovědný za získání nebo nastavení dat do/z externí formuláře (v tomto případě řídí dialogové okno) z/do datových členů ve třídě.pDX Parametr kontextu při provádění výměny dat a je podobný CArchive parametr CObject::Serialize.pDX ( CDataExchange Objekt) má směr příznak mnoho podobných CArchive má příznak směr:

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

  • Pokud m_bSaveAndValidate, potom nastavte data stavu ovládacích prvků.

Ověření dochází pouze při m_bSaveAndValidate je nastavena.Hodnota m_bSaveAndValidate je určena parametrem BOOL CWnd::UpdateData.

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

  • m_pDlgWnd: Okno (obvykle dialogové okno), který obsahuje ovládací prvky.Toto je zabránit tomu, aby volající funkce globální DDX_ a DDV_ 'this' předávat všechny rutiny DDX/DDV.

  • PrepareCtrl, a PrepareEditCtrl: připraví pro výměnu dat prvku dialogu.Uloží popisovač tohoto ovládacího prvku nastavení fokusu, pokud ověřování nezdaří.PrepareCtrlslouží pro ovládací prvky nonedit a PrepareEditCtrl se používá pro ovládací prvky pro úpravy.

  • Selhání: jen po vyvolání okna se zprávou upozornění uživateli vstupní chyby.Tato rutina obnoví poslední ovládací prvek fokus (poslední volání PrepareCtrl/PrepareEditCtrl) a vyvolat výjimku.Tuto členskou funkci může být volána z rutiny DDX_ a DDV_.

Tato rozšíření

Rozšířit výchozím DDX/DDV mechanismem několika způsoby.Můžete provádět následující akce:

  • Přidáte nové datové typy.

    CTime
    
  • Přidáte nové postupy exchange (DDX_???).

    void PASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTime& tm);
    
  • Přidáte nové ověřovací postupy (DDV_???).

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

    DDV_MinMax(pDX, age, 0, m_maxAge);
    

    [!POZNÁMKA]

    Takové libovolného výrazy nelze upravit pomocí ClassWizard a proto by měl být přesunut mimo zvláštní formát komentáře (/ / {{AFX_DATA_MAP(CMyClass)).

Mít DoDialogExchange členské funkce zahrnují podmíněné příkazy nebo jakékoli jiné platné příkazy jazyka C++ pomocí míchán volání funkce výměny a ověřování.

//{{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 uvedeno výše, tento kód nelze upravit pomocí ClassWizard a by měla být použita pouze mimo zvláštní formátování komentářů.

Podpora ClassWizard

ClassWizard podporuje pouze dílčí úpravy DDX/DDV umožňuje integrovat vlastní rutiny DDX_ a DDV_ do uživatelského rozhraní ClassWizard.Je to pouze náklady, které jsou užitečné, pokud máte v úmyslu znovu použít konkrétní DDX DDV rutiny a v projektu nebo v mnoha projektech.

Chcete-li to provést, jsou vytvořeny zvláštní položky v DDX.CLW (uloženy předchozí verze aplikace Visual c++ tyto informace v APSTUDIO.INI) nebo ve vašem projektu.CLW souboru.Zvláštní položky mohou být zadány v oddílu [Obecné Info] vašeho projektu.Soubor CLW nebo v sekci [ExtraDDX] DDX.Soubor CLW v \Program Files\Microsoft Visual Studio\Visual C ++ adresáře \bin.Budete muset vytvořit DDX.CLW souboru, pokud již neexistuje.Pokud máte v úmyslu použít vlastní rutiny DDX_/DDV_ pouze do určitého projektu, přidejte položky do oddílu [Obecné Info] projektu.CLW souboru namísto.Pokud plánujete použití rutin na mnoha projektech, přidejte do oddílu [ExtraDDX] DDX položky.CLW.

Obecný formát těchto zvláštních položek je:

ExtraDDXCount=n

kde n je číslo ExtraDDX?řádky s firmou

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

kde?je číslo 1 – n označující DDX typ v seznamu, který definujete.

Každé pole je vymezeno tímto znak ';'.Pole a jejich účel jsou popsány níže.

  • <keys>
    = seznam jednotlivých znaků, které určující, pro které ovládací prvky dialogového okna je povolen tento typ proměnné.

    E = upravit

    C = stát dvě zaškrtávací políčko

    c = políčko tri stav

    R = první přepínač ve skupině

    L = nonsorted seznamu

    l = seřazený seznam

    M = pole se seznamem (s úpravy položky)

    N = nonsorted rozevírací seznam

    n = seřazené rozevírací seznam

    1 =, je-li vložit DDX by mělo být do hlavy seznamu (výchozí je přidat do ocasu) to je obvykle používán k DDX rutiny, které převést vlastnost "Kontrola".

  • < vb klíče >
    Toto pole se používá pouze v produktu 16 bitů pro ovládací prvky VBX (VBX ovládací prvky nejsou podporovány v produktu 32-bit)

  • <prompt>
    Řetězec, který se umístí v poli se seznamem vlastností (bez uvozovek)

  • <type>
    Jeden identifikátor typu k vyzařování v souboru hlaviček.V našem příkladu výše s DDX_Time tento příkaz nastaví na CTime.

  • < vb klíče >
    Nebyly použity v této verzi a by měl být prázdný.

  • <initValue>
    Počáteční hodnota – 0 nebo prázdný.Pokud je pole prázdné, bude v části //{{AFX_DATA_INIT implementačního souboru zapsán žádný řádek inicializace.Prázdná položka má být použita pro objektů jazyka C++ (například CString, CTimea tak dále) mají konstruktory, které zaručují správná inicializace.

  • <DDX_Proc>
    Jeden identifikátor DDX_ postup.Název funkce C++ musí začínat "DDX_", ale nezadávejte "DDX_" in <DDX_Proc> identifikátor.V příkladu výše, <DDX_Proc> identifikátor by čas.Pokud ClassWizard zapíše volání funkce do implementačního souboru v {{AFX_DATA_MAP část přidá tento název k DDX_ tedy přijely na DDX_Time.

  • <comment>
    Komentář, který chcete zobrazit v dialogovém okně pro proměnné s tímto DDX.Umístěte text rádi byste zde a obvykle poskytují něco, který popisuje operace prováděné pár DDX/DDV.

  • <DDV_Proc>
    Část DDV položka je nepovinná.Ne všechny rutiny DDX mají odpovídající DDV rutiny.Často je vhodnější zahrnout ověření fáze jako nedílná součást převodu.Totiž často případ při vašem DDV rutiny nevyžaduje žádné parametry ClassWizard nepodporuje DDV rutiny bez parametrů.

  • <arg>
    Jeden identifikátor pro proceduru DDV_.Název funkce C++ musí začínat "DDV_", ale neobsahují "DDX_" v <DDX_Proc> identifikátor.

Následuje args DDV 1 nebo 2:

  • <promptX>
    řetězec, který se umístí nad položku upravit (s & pro akcelerátor)

  • <fmtX>
    Formát znaků pro typ arg, jeden z

    d = int

    u = bez znaménka

    D = long int (to znamená, dlouhý)

    U = dlouho bez znaménka (DWORD)

    f = float

    F = dvojité

    s = řetězec

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie