TN026: Rutiny DDX a DDV
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje výměnu dat dialogu (DDX) a architektura (DDV) ověření dat dialogové okno.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ého okna se provádí pomocí kódu jazyka C++.Neexistují žádné zvláštní prostředky nebo magic makra.Srdce mechanismu je virtuální funkce, která je přepsána do každé třídy dialogové okno, že provede 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
}
Komentáře AFX speciální formát umožňuje vyhledat a upravit kód v rámci této funkce ClassWizard.Kód, který není kompatibilní s ClassWizard by měl být umístěn mimo zvláštní formát komentáře.
V tomto příkladu <data_exchange_function_call> je ve formě:
DDX_Custom(pDX, nIDC, field);
a <data_validation_function_call> je nepovinný a je ve formě:
DDV_Custom(pDX, field, ...);
V každém lze zahrnout více než jeden pár DDX_/DDV_ DoDataExchange funkce.
Seznam rutin exchange dat dialogové okno a dialogové okno data ověřovací rutiny dodávané s knihovnou MFC naleznete v tématu "afxdd_.h".
Dialogové okno dat je právě: data členů v CMyDialog třídy.Neukládá se do struktury nebo cokoliv podobného.
Poznámky
Přestože jsme volat toto "dialog data", všechny funkce jsou k dispozici v libovolná třída odvozená z CWnd a nejsou omezeny pouze dialogy.
Počáteční hodnoty dat jsou nastavena v konstruktoru standard C++ obvykle v bloku s //{{AFX_DATA_INIT a //}}AFX_DATA_INIT komentáře.
CWnd::UpdateDataoperace, které provede inicializaci a kolem volání pro zpracování chyb je DoDataExchange.
Můžete volat CWnd::UpdateData kdykoli provádět výměny dat a ověřování.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_ okamžitě postupujte rutinní DDX_ tohoto pole.
Jak to funguje?
Není nutné znát následující pro použití dat 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 odpovědný za získání nebo nastavení dat do/z externí formuláře (v takovém případě ovládací prvky v dialogovém okně) z/do data č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 nastaven.Hodnota m_bSaveAndValidate je určen pomocí parametru 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 volání globální funkce DDX_ a DDV_ 'to předávat všechny rutiny DDX/DDV.
PrepareCtrl, a PrepareEditCtrl: připraven pro výměnu dat ovládací prvek dialogového okna.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í: volat po vyvolání zprávou upozornění Chyba vstupu uživatele.Tato rutina obnoví poslední ovládací prvek fokus (poslední volání PrepareCtrl/PrepareEditCtrl) a vyvoláním výjimky.Tuto členskou funkci může být volána z rutiny DDX_ a DDV_.
Rozšíření Uživatelé
Existuje několik způsobů, jak rozšířit DDX/DDV výchozím mechanismem.Můžete:
Přidáte nové datové typy.
CTime
Přidáte nové postupy výměny (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ýrazy 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)).
Jste DoDialogExchange členské funkce zahrnují podmínky nebo jakékoli jiné platné příkazy C++ s 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, takový kód nelze upravit pomocí ClassWizard a by měla sloužit pouze mimo zvláštní formát komentáře.
Podpora ClassWizard
ClassWizard podporuje pouze podmnožinu DDX/DDV vlastního nastavení umožňuje integrovat vlastní rutiny DDX_ a DDV_ do uživatelského rozhraní ClassWizard.Je to pouze náklady, výhodné Pokud chcete opakovaně používat určitý DDX DDV rutiny a v projektu nebo v mnoha projektech.
K tomu 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 soubor.Zvláštní údaje, které mohou být zadány v oddílu [Obecné Info] vašeho projektu.Soubor CLW nebo v sekci [ExtraDDX] DDX.CLW soubor v adresáři \bin C ++ Visual Studio\Visual \Program Files\Microsoft.Potřebujete vytvořit DDX.CLW soubor, pokud již neexistuje.Pokud chcete použít vlastní rutiny DDX_/DDV_ pouze do určitého projektu, přidejte do oddílu [Obecné Info] projektu položky.CLW namísto souboru.Pokud plánujete použití rutin na mnoha projektech, přidáte položky do oddílu [ExtraDDX] DDX.CLW.
Obecný formát těchto zvláštních položek je:
ExtraDDXCount=n
kde n je číslo ExtraDDX? postupujte podle čar.
ExtraDDX?=<keys>;<vb-keys>; <prompt>; <type>; <initValue>; <DDX_Proc>
[;<DDV_Proc>; <prompt1>; <arg1>; [<prompt2>; <fmt2>]]
kde? je číslo 1 – n označující typ DDX v seznamu, který je právě definováno.
Každé pole je vymezeno znak ';'.Níže jsou popsány pole a jejich účel.
<klíče>
= seznam jednotlivých znaků, které určující, pro které ovládací prvky dialogového okna je povolen tento typ proměnné.E = úpravy
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 = Pokud vložit DDX by měly být přidány do hlavy seznam (výchozí je přidat k 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)<výzva>
Řetězec, který chcete umístit do seznamu 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>
V této verzi nejsou používány a by měl být prázdný<Shodný>
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 C++ objekty (jako CString, CTimea tak dále) které mají konstruktory, které zaručují správné inicializace.<DDX_Proc>
Jeden identifikátor DDX_ postup.Název funkce C++ musí začínat "DDX_" bez zahrnutí "DDX_" <DDX_Proc> identifikátor.V příkladu výše <DDX_Proc> identifikátor, bude čas.Pokud ClassWizard zapíše do implementačního souboru ve volání funkce {{AFX_DATA_MAP část přidá tento název k DDX_, tedy příjezdem do DDX_Time.<komentář>
Poznámka Chcete-li zobrazit v dialogovém okně pro proměnné s tímto DDX.Umístěte text bych zde a obvykle poskytují něco, který popisuje operace prováděné DDX/DDV pár.<DDV_Proc>
DDV část položka je nepovinná.Ne všechny rutiny DDX mít odpovídající DDV rutiny.Často je vhodnější zahrnout jako součást převodu fázi ověřování.To je často případ, kdy vaše DDV rutiny nevyžaduje žádné parametry, protože ClassWizard nepodporuje DDV rutiny bez parametrů.<arg>
Jeden identifikátor procesu DDV_.Název funkce C++ musí začínat "DDV_", ale nezahrnujte "DDX_" <DDX_Proc> identifikátor.
Následuje args DDV 1 nebo 2:
<promptX>
Umístěte nad položku Upravit řetězec (s & pro akcelerátor)<fmtX>
Formát znaků typu arg, jeden zd = int
u = bez znaménka
D = long int (tj, dlouhé)
U = dlouho bez znaménka (DWORD)
f = float
F = dvojnásobek
s = řetězec