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 UpdateData
ve výchozím nastavení CDialog::OnInitDialog
se 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 (CDataExchange
objekt) 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_bSaveAndValidate
nastaví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.PrepareCtrl
aPrepareEditCtrl
: 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 aPrepareEditCtrl
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
neboPrepareEditCtrl
) 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
,CTime
atd.), 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í