Questa nota descrive la dialog data exchange (DDX) e l'architettura di validazione (DDV) dati di dialogo. Descrive inoltre come si scrive una procedura DDX _ o ddv _ e come si può estendere ClassWizard utilizzare le routine.
Panoramica della finestra di dialogo di scambio di dati
Tutte le funzioni di finestra di dialogo dati vengono effettuate con codice C++. Ci sono risorse speciali o macro magiche. Il cuore del meccanismo è una funzione virtuale che viene sottoposto a override in ogni classe di finestra di dialogo finestra di dialogo di scambio di dati e la convalida. Si trova sempre in questa forma:
public static void CMyDialog::DoDataExchange (CDataExchange pDX)
{
nbsp; CDialog::DoDataExchange(pDX); / / call classe base
//{{AFX_DATA_MAP(CMyDialog)
<data_exchange_function_call>
//}}AFX_DATA_MAP
}
I commenti AFX formato speciale permettono ClassWizard individuare e modificare il codice all'interno della funzione. Codice che non è compatibile con ClassWizard deve essere posizionato di fuori dei commenti formato speciale.
Nell'esempio sopra, lt; data_exchange_function_call > è in forma:
DDX_Custom (pDX, campo, nIDC)
e lt; data_validation_function_call > è facoltativo ed è in forma:
DDV_Custom (pDX, campo,...)
Più di un paio di DDV DDX _ / _ possa essere inclusi in ogni funzione DoDataExchange.
Per un elenco di tutte le routine di scambio dati di dialogo e le routine di convalida dei dati di dialogo fornite con MFC, vedere 'afxdd_.h'.
Finestra di dialogo dati è appena che - dati dei membri della classe CMyDialog . Non viene memorizzato in una struct o nulla di speciale come quella.
Note
Anche se noi chiamiamo questo "dati della finestra di dialogo", tutte le funzionalità sono disponibili in qualsiasi classe derivata da CWnd e non sono limitate alle finestre di dialogo soli.
I valori iniziali dei dati vengono impostati nel costruttore C++ standard, di solito in un blocco con //{{AFX_DATA_INIT e //}}AFX_DATA_INIT commenti.
CWnd::UpdateData è l'operazione che fa l'inizializzazione e la gestione degli errori attorno alla chiamata alla DoDataExchange.
È possibile chiamare CWnd::UpdateData in qualsiasi momento per effettuare lo scambio di dati e la convalida. Per impostazione predefinita viene chiamato UpdateData(TRUE) nel gestore predefinito CDialog::OnOK e UpdateData(falsa) viene chiamato in default CDialog::OnInitDialog.
La routine ddv _ deve seguire immediatamente la routine DDX _ per quel campo.
Come funziona?
Non è necessario comprendere i seguenti al fine di utilizzare i dati della finestra di dialogo. Tuttavia, la comprensione di come funziona dietro le quinte vi aiuteranno a scrivere il proprio routine di convalida o di scambio.
La funzione membro DoDataExchange è molto simile la funzione membro Serialize - è responsabile dell'ottenimento o dell'impostazione dati per/da una forma esterna (in questo caso controlla in una finestra di dialogo) da/per i dati dei membri della classe. Il parametro pDX è in questo contesto per fare lo scambio di dati ed è simile al parametro CArchive per CObject::Serialize. PDX (un oggetto CDataExchange ) ha un flag di direzione molto simile CArchive ha un flag di direzione
La convalida viene eseguita solo quando è impostato m_bSaveAndValidate . Il valore di m_bSaveAndValidate viene determinato dal parametro BOOL a CWnd::UpdateData.
Ci sono altri tre interessanti CDataExchange membri:
Estensioni utente
Ci sono diversi modi per estendere il meccanismo DDX/DDV predefinito. Si può:
CTime
public static void P&ASCAL DDX_Time(CDataExchange* pDX, int nIDC, CTimeamp; tm)
public static void PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
/ / assicurarsi che tempo sia nel futuro o nel passato
DDV_MinMax (pDX, età, 0, m_maxAge)
&Notanbsp; Tali espressioni arbitrarie non possono essere modificati da ClassWizard e devono essere spostati di fuori dei commenti formato speciale (//{{AFX_DATA_MAP(CMyClass)).
Hanno la funzione di membro DoDialogExchange includere istruzioni condizionali o eventuali altre istruzioni C++ validi con exchange mescolati e chiamate di funzione di convalida.
//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
Se (m_bFemale)
DDV_MinMax (pDX, età, 0, m_maxFemaleAge);
altro
DDV_MinMax (pDX, età, 0, m_maxMaleAge)
&Notanbsp; Come mostrato sopra, tale codice non può essere modificato da ClassWizard e deve essere usato solo di fuori dei commenti formato speciale.
Supporto ClassWizard
ClassWizard supporta un sottoinsieme delle personalizzazioni DDX/DDV consente di integrare il proprio DDX _ e ddv _ routine dell'interfaccia utente ClassWizard. Fare questo è l'unico costo vantaggioso se si intende riutilizzare particolare routine DDX e DDV di volta in volta in un progetto o in molti progetti.
A tale scopo, le voci speciali sono realizzate in DDX.CLW (versioni precedenti di Visual C++ memorizzate queste informazioni in APSTUDIO.INI) o del progetto.File CLW. Le voci speciali possono essere inseriti sia nella sezione [Info generali] del progetto.File CLW o nella sezione [ExtraDDX] la DDX.File CLW in \Programmi\Microsoft Visual Studio\Visual C + + directory \bin. Potrebbe essere necessario creare la DDX.File CLW se non esiste già. Se si prevede di utilizzare le routine DDV DDX _ / _ personalizzate solo in un determinato progetto, aggiungere le voci nella sezione [Info generali] del vostro progetto.CLW file invece. Se si prevede di utilizzare le routine su molti progetti, aggiungere le voci nella sezione [ExtraDDX] del DDX.CLW.
Il formato generale di queste voci speciali è:
ExtraDDXCount = n
; dove n è il numero di ExtraDDX? linee da seguire
ExtraDDX? = lt; tasti >; < vb-tasti >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]
; Dove? è un 1-n numero che indica quale tipo DDX nell'elenco viene definito.
Ogni campo è delimitato da un carattere ';'. I campi e il loro scopo vengono descritte di seguito.
lt; tasti & gt;
= elenco dei singoli caratteri che indica quali controlli di dialogo è consentito un tipo di variabile.
E = modifica
C = due stati check box
c = casella di controllo tri-state
R = prima radio button in un gruppo
L = casella di riepilogo non ordinati
l = elenco ordinato box
M = casella combinata (con voce modifica)
N = elenco non ordinato goccia
n = elenco ordinato goccia
1 = se l'i&nserto DDX deve essere aggiunto al capo della lista (predefinito è aggiungere alla coda) nbsp; Questo è generalmente utilizzato per le routine DDX che trasferiscono la proprietà di 'Controllo'.
lt; vb-tasti & gt;
questo campo viene utilizzato solo nel prodotto 16-bit per i controlli VBX (controlli VBX non sono supportati nel prodotto a 32-bit)
lt; pronta > =
stringa da inserire nella casella combinata della proprietà (senza virgolette)
lt; tipo > =
identificatore unico tipo di emettere nel file di intestazione. Nel nostro esempio sopra con DDX_Time, questo verrebbe impostato su CTime.
lt; vb-tasti > =
non utilizzati in questa versione e dovrebbe essere sempre vuoto
lt; valoreiniz > =
valore iniziale - 0 o vuoto. Se è vuoto, nessuna linea di inizializzazione verrà scritto nella sezione //{{AFX_DATA_INIT del file di implementazione. Una voce vuota deve essere utilizzata per gli oggetti C++ (come CString, CTime e così via) che hanno i costruttori che garantiscono la corretta inizializzazione.
lt; DDX_Proc > =
la procedura DDX _ identificatore unico. Il nome della funzione C++ deve iniziare con "DDX _", ma non includono "DDX _" nel lt; DDX_Proc > identificatore. Nell'esempio precedente, l'identificatore <DDX_Proc> sarebbe il momento. Quando ClassWizard scrive la chiamata di funzione al file nell'implementazione il {{sezione AFX_DATA_MAP, aggiunge questo nome al DDX _, arrivando così a DDX_Time.
lt; commento > =
commento di mostrare nella finestra di dialogo per la variabile con questo DDX. Inserire qualsiasi testo piace qui, di solito fornirebbe qualcosa che descrive l'operazione eseguita dalla coppia DDX/DDV.
lt; DDV_Proc & gt;
La porzione DDV della voce è facoltativa. Non tutte le routine DDX hanno le routine DDV corrispondente. Spesso, è più conveniente includere la fase di convalida come parte integrante del trasferimento. Questo è spesso il caso quando la vostra routine DDV non richiede alcun parametro, dal momento che ClassWizard non supporta le routine DDV senza parametri.
= identificatore singolo per la procedura di ddv _. Il nome della funzione C++ deve iniziare con "Ddv _" ma non includono "DDX _" nel lt; DDX_Proc > identificatore.
seguita da 1 o 2 DDV args:
lt; promptX > =
string&a di mettere sopra la voce modifica (con amp; per acceleratore)
lt; fmtX > =
carattere di formato per il tipo di arg, uno dei
doppie = int
u = senza segno
Doppie = int lungo (vale a dire, a lungo)
U = lungo senza segno (cioè, DWORD)
f = galleggiante
F = doppia
s = stringa
Un esempio di Custom DDX
Un esempio di DDX personalizzate con la convalida può essere trovato nel campione MFC Advanced Concepts CHKBOOK. Vedi DDX_DollarsCents in DOLLCENT.CPP per un esempio di implementazione di una routine di DDX personalizzate e di CHKBOOK.CLW per le voci di ExtraDDX1 nella sezione [Info generali] di CHKBOOK ed ExtraDDXCount nell'esempio corrispondente.File CLW.
&Note tecniche per numero |nbsp; Note tecniche per la categoria