TN026: DDX e DDV Routines

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ò:

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

Index