Esta nota describe el intercambio de datos de cuadro de diálogo (DDX) y arquitectura de validación (DDV) de datos de cuadro de diálogo. También describe cómo escribir un procedimiento DDX_ o DDV_ y cómo se puede ampliar ClassWizard utilizar sus rutinas.
Visión general de intercambio de datos de cuadro de diálogo
Todas las funciones de datos de cuadro de diálogo se realizan con código de C++. No hay recursos especiales o macros de magia. El corazón del mecanismo es una función virtual que se reemplaza en cada clase de diálogo diálogo de intercambio de datos y validación. Siempre se encuentra en este formulario:
void CMyDialog::DoDataExchange (CDataExchange * pDX)
{
nbsp; CDialog::DoDataExchange(pDX); / / llamada clase base
//{{AFX_DATA_MAP(CMyDialog)
<data_exchange_function_call>
//}}AFX_DATA_MAP
}
Los comentarios AFX formato especial permiten ClassWizard localizar y editar el código dentro de esta función. Código que no es compatible con ClassWizard debe colocarse fuera de las observaciones de formato especial.
En el ejemplo anterior, lt; data_exchange_function_call > en forma:
DDX_Custom (pDX, nIDC, campo)
y lt; data_validation_function_call > es opcional y está en el formulario:
DDV_Custom (pDX, campo,...)
Más de un par DDX_ y DDV_ puede incluirse en cada función DoDataExchange.
Ver 'afxdd_.h' para obtener una lista de todas las rutinas de intercambio de datos de diálogo y rutinas de validación de datos de diálogo proporcionadas de MFC.
Datos de diálogo están sólo ese - datos de miembros de la clase CMyDialog . No se almacena en una estructura o nada especial que.
Notas
Aunque pedimos esta "datos del diálogo", todas las características están disponibles en cualquier clase derivada de CWnd y no están limitadas a sólo cuadros de diálogo.
Los valores iniciales de datos se establecen en el constructor de C++ estándar, normalmente en un bloque con //{{AFX_DATA_INIT y //}}AFX_DATA_INIT comentarios.
CWnd::UpdateData es la operación que realiza la inicialización y manejo de error alrededor de la llamada a DoDataExchange.
Puede llamar a CWnd::UpdateData en cualquier momento para realizar el intercambio de datos y validación. Por defecto se llama UpdateData(TRUE) en el controlador de CDialog::OnOK de forma predeterminada y se llama UpdateData(FALSE) en el valor predeterminado CDialog::OnInitDialog.
La rutina DDV_ debe seguir inmediatamente a la rutina DDX_ para ese campo.
¿Cómo funciona?
No es necesario comprender lo siguiente para poder utilizar datos de diálogo. Sin embargo, entender cómo funciona detrás de las escenas lo ayudará a escribir su propio procedimiento de intercambio o validación.
La función de miembro de DoDataExchange es muy parecida a la función de miembro Serialize - es responsable de obtener o establecer datos a/desde una forma externa (en este caso se controla en un cuadro de diálogo) a datos de los miembros de la clase. El parámetro pDX es el contexto para realizar el intercambio de datos y es similar al parámetro CArchive a CObject::Serialize. El pDX (un objeto CDataExchange ) tiene un indicador de dirección igual CArchive tiene un indicador de dirección
Validación sólo se produce cuando se establece m_bSaveAndValidate . El valor de m_bSaveAndValidate es determinado por el parámetro BOOL CWnd::UpdateData.
Hay tres otros miembros de CDataExchange interesantes:
Extensiones de usuario
Hay varias maneras de ampliar el mecanismo predeterminado de DDX/DDV. Puedes:
CTime
void DDX_Time(CDataExchange* pDX, int nIDC, CTimeamp; tm) P&ASCAL
anular PASCAL DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
/ / Asegúrese de que el tiempo es en el futuro o pasado
DDV_MinMax (pDX, edad, 0, m_maxAge)
&Notanbsp; Tales expresiones arbitrarias no pueden ser editados por ClassWizard y por lo tanto, deben ser trasladados fuera de los comentarios de formato especial (//{{AFX_DATA_MAP(CMyClass)).
Tienen la función de miembro de DoDialogExchange incluyen condicionales o cualquier otras declaraciones de C++ válidos con exchange mezclado y llamadas de función de validación.
//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
Si (m_bFemale)
DDV_MinMax (pDX, edad, 0, m_maxFemaleAge);
otra cosa
DDV_MinMax (pDX, edad, 0, m_maxMaleAge)
&Notanbsp; Como se indica anteriormente, dicho código no puede ser editado por ClassWizard y debe utilizarse sólo fuera de los comentarios de formato especial.
ClassWizard apoyo
ClassWizard admite un subconjunto de las personalizaciones de DDX/DDV por lo que le permite integrar sus propias rutinas de DDX_ y DDV_ en la interfaz de usuario de ClassWizard. Esto es beneficioso si desea reutilizar rutinas DDX y DDV particulares y otra vez en un proyecto o en muchos proyectos sólo costo.
Para ello, las entradas especiales se realizan en DDX.CLW (las versiones anteriores de Visual C++ almacenan esta información en APSTUDIO.INI) o en su proyecto.Archivo CLW. Las entradas especiales pueden ser introducido en la sección [Información General] de su proyecto.Archivo CLW o en la sección [ExtraDDX] de la DDX.Archivo CLW en el \Archivos de programa\Microsoft Visual Studio\Visual C ++ directorio \bin. Puede que necesite crear el DDX.Archivo CLW si ya no existe. Si planea utilizar las rutinas DDX_/DDV_ personalizadas sólo en un determinado proyecto, agregar las entradas a la sección [Información General] de su proyecto.CLW el archivo en su lugar. Si planea utilizar las rutinas en muchos proyectos, agregar las entradas a la sección [ExtraDDX] de DDX.CLW.
Es el formato general de estas entradas especiales:
ExtraDDXCount = n
; ¿donde n es el número de ExtraDDX? líneas a seguir
ExtraDDX? = lt; claves >; < claves de vb >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]
; ¿Donde? es un número 1-n que indica qué tipo DDX en la lista que está siendo definida.
Cada campo está delimitado por un carácter ';'. A continuación se describen los campos y su propósito.
lt; claves & gt;
= lista de caracteres simples que indica para qué controles de cuadro de diálogo se permite este tipo de variable.
E = editar
C = casilla de verificación de dos Estados
c = casilla de tri-state
R = el primer botón de opción en un grupo
L = cuadro de lista no ordenada
l = cuadro de lista ordenada
M = cuadro combinado (con tema de edición)
N = lista desplegable no ordenados
n = lista desplegable ordenar
1 = si la i&nserción DDX debe agregarse a la cabeza de lista (por defecto es añadir a cola) nbsp; Generalmente se utiliza para las rutinas DDX que transferir la propiedad de 'Control'.
lt; vb-claves & gt;
este campo sólo se utiliza en el producto de 16 bits para los controles VBX (VBX controles no son compatibles en el producto de 32-bit)
lt; pronta > =
cadena para colocar en el cuadro combinado de propiedad (sin comillas)
lt; tipo > =
identificador único de tipo emitir en el archivo de encabezado. En nuestro ejemplo anterior con DDX_Time, esto se establecería en CTime.
lt; vb-teclas > =
no se utiliza en esta versión y siempre debe estar vacío
lt; initValue > =
valor inicial - 0 o en blanco. Si está en blanco, línea de inicialización no se escribirá en la sección //{{AFX_DATA_INIT del archivo de aplicación. Debe utilizarse una entrada en blanco para los objetos de C++ (como CString, CTime etc.) que tienen constructores que garantizan la inicialización correcta.
lt; DDX_Proc > =
identificador único para el procedimiento DDX_. El nombre de la función de C++ debe comenzar con "DDX_", pero no incluyen "DDX_" en el lt; DDX_Proc > identificador. En el ejemplo anterior, el identificador de <DDX_Proc> sería el tiempo. Cuando ClassWizard escribe la llamada de función en el archivo de aplicación en el {{sección AFX_DATA_MAP, añade este nombre a DDX_, llegando así a DDX_Time.
lt; comentario > =
comentario para mostrar en el cuadro de diálogo variable con este DDX. Colocar cualquier texto que sería como aquí, suelen proporcionar algo que describe la operación llevada a cabo por el par DDX/DDV.
lt; DDV_Proc & gt;
La porción DDV de la entrada es opcional. No todas las rutinas DDX tienen rutinas de DDV correspondientes. A menudo, es más conveniente para la fase de validación se incluyen como parte integrante de la transferencia. Esto suele ocurrir cuando su rutina DDV no requiere parámetros, ya ClassWizard no admite rutinas DDV sin ningún parámetro.
= identificador único para el procedimiento DDV_. El nombre de la función de C++ debe comenzar con "DDV_" pero no incluyen "DDX_" en el lt; DDX_Proc > identificador.
seguido de 1 o 2 args DDV:
lt; promptX > =
c&adena para colocar encima del elemento de edición (con amp; accelerator)
lt; fmtX > =
caracteres de formato para el tipo de arg, uno de
d = int
u = sin firmar
D = int largo (es decir, largo)
U = largo sin signo (es decir, DWORD)
f = flotar
F = doble
s = string
Un ejemplo de costumbre DDX
Un ejemplo de DDX personalizado con validación puede encontrarse en la muestra de conceptos avanzados de MFC CHKBOOK. Ver DDX_DollarsCents en DOLLCENT.CPP para una implementación de ejemplo de una rutina DDX y CHKBOOK personalizadas.CLW para el correspondiente ejemplo ExtraDDXCount y ExtraDDX1 las entradas en la sección [Información General] de CHKBOOK.Archivo CLW.
&Notas técnicas por número |nbsp; Notas técnicas por categoría