Validar datos de control limitando el enfoque
El evento Validate y la propiedad CausesValidation se utilizan en conjunto para confirmar la entrada a un control antes de permitir al usuario alejar el foco del control. Por ejemplo: considere una aplicación con varios cuadros de texto y un botón de Ayuda. Cuando cada cuadro de texto recibe el foco, desea evitar que el usuario mueva el foco hasta que se cumplan los criterios de validación especiales del cuadro de texto; sin embargo, también desea permitirlo. El usuario puede mover el foco cuando el cuadro de texto recibe el foco. Se puede hacer clic en el botón Ayuda en cualquier momento. Para hacer esto, establezca los criterios de validación en el evento Validar y establezca la propiedad CausesValidation del botón Ayuda en Falso. Si la propiedad se establece en Verdadero (la configuración predeterminada), el evento Validar ocurrirá en el primer control. Si la propiedad se establece en False, el evento Validar en el primer control ocurrirá primero.
El evento Validate es más adecuado para validar entradas de datos que el evento LostFocus porque el evento LostFocus (por definición) ocurre después de que el foco se ha movido. En su lugar, al utilizar el evento Validar, puede evitar que el foco se mueva a otro control hasta que se cumplan las reglas de validación.
posibles usos
Las aplicaciones de entrada de datos necesitan realizar una validación de entrada de datos más compleja que la validación proporcionada por el control MaskedEdit o que ocurre en las reglas comerciales.
El formulario debe evitar que el usuario use la tecla TAB o las teclas de aceleración para mover los controles hasta que se hayan ingresado datos en el campo.
Los documentos ActiveX que se ejecutan en Internet Explorer necesitan una forma para que el usuario termine de trabajar en el formulario antes de que el script mueva el foco mediante programación.
Controlar el foco en el evento Validar
El evento Validar incluye un parámetro keepfocus. Cuando el parámetro se establece en Verdadero, el control conserva el foco. Esto evita efectivamente que el usuario haga clic en otros controles.
Usando una variedad de controles
Una matriz de controles es un grupo de controles con un nombre y tipo común. Su curso de acontecimientos también es el mismo. Una matriz de control debe tener al menos un elemento y la cantidad de elementos se puede aumentar dentro del alcance permitido por los recursos del sistema y la memoria. El tamaño de la matriz también depende de la memoria y los recursos de Windows requeridos por cada control. El valor de índice máximo disponible en la matriz de control es 32767. Los elementos de la misma matriz de control tienen sus propias configuraciones de propiedades. Los usos comunes de las matrices de control incluyen la implementación de controles de menú y agrupaciones de botones de opción.
Tenga en cuenta que Visual Basic incluye la capacidad de agregar dinámicamente controles sin referencia a la colección Controls en tiempo de ejecución. Este tema solo hace referencia a los controles de referencia que se agregan en tiempo de diseño cortando y pegando un control en un formulario. Para obtener más información sobre cómo agregar controles en tiempo de ejecución, consulte los temas de referencia "Agregar método (colección de controles)" y "Agregar método (colección de licencias)".
¿Por qué utilizar matrices de control?
En tiempo de diseño, agregar controles usando una matriz de controles consume menos recursos que agregar múltiples controles del mismo tipo directamente al formulario. Las matrices de controles también son útiles cuando desea que varios controles compartan código. Por ejemplo, si crea una matriz de control que contiene tres botones de opción, se ejecutará el mismo código independientemente del botón en el que se haga clic.
Para crear una nueva instancia de un control en tiempo de ejecución, el nuevo control debe ser miembro de la matriz de controles. Cuando se utiliza una matriz de controles, cada nuevo miembro hereda los procedimientos de eventos públicos de la matriz.
No es posible crear nuevos controles en tiempo de ejecución utilizando el mecanismo de matriz de controles, porque cada nuevo control hereda el procedimiento de evento escrito para la matriz. Por ejemplo, si tiene varios cuadros de texto en su formulario y cada cuadro de texto acepta un valor de fecha, puede crear una serie de controles para que todos los cuadros de texto compartan el mismo código de validación.
Aplicación de ejemplo: Calc.vbp
La aplicación de muestra Calculadora que se muestra en la Figura 7.2 (enumerada en el directorio Samples!Alink(vbsamples)) contiene dos matrices de control: botones numéricos y botones de acción.
Observe cómo el ejemplo utiliza la sintaxis de objeto (índice) para hacer referencia a cada control. Especifique el valor del índice al crear el control. De hecho, especificar un índice arbitrario para un control en tiempo de diseño hará que el control forme parte de una matriz.
La propiedad Índice distingue elementos en la matriz de control. Cuando un control de la matriz reconoce un evento, Visual Basic llama al procedimiento de evento público y pasa un parámetro (el valor de la propiedad Índice) para identificar qué control reconoció el evento.
Por ejemplo, la primera línea de código en el procedimiento del evento Number_Click tiene este aspecto:
PRivateSubNumber_Click(IndexAsInteger)
Si Número(0) identifica el evento, VisualBasic pasa 0 como parámetro de índice, y si Número(1) identifica el evento, VisualBasic pasa 1 como parámetro de índice. A diferencia del valor del índice, el resto del código Number_Click que se ha ejecutado es el mismo para Número(0) y Número(9).
Crear matriz de control en tiempo de diseño
Hay tres formas de crear matrices de control en tiempo de diseño:
1. Asigne el mismo nombre a varios controles.
2. Copie el control existente y péguelo en el formulario.
3. Establezca la propiedad Índice del control en un valor no nulo.
Tenga en cuenta que la matriz de controles de menú debe crearse en el Editor de menús. Para obtener más información sobre esta operación, consulte "Creación y modificación de menús en tiempo de ejecución" en el Capítulo 6, "Creación de la interfaz de usuario".
Para agregar un elemento de matriz de control cambiando el nombre del control:
1. Dibuje el control que se agregará en la matriz de controles (debe ser el mismo tipo de control) para determinar qué control será el primer elemento de la matriz.
2. Seleccione el control y cambie su valor de configuración de Nombre al valor de configuración de Nombre del primer elemento de la matriz.
3. Cuando ingresa un nombre existente para un control en la matriz, Visual Basic mostrará un cuadro de diálogo que le pedirá que confirme si desea crear la matriz de controles. En este punto seleccione "OK" para confirmar la operación.
Por ejemplo, si el primer elemento de la matriz de control se llama cmdCtlArr, seleccione un CommandButton, agréguelo a la matriz y establezca su nombre en cmdCtlArr. En este momento, se mostrará el siguiente mensaje: "Un control llamado 'cmdCtlArr'. ya existe. ¿Quieres crear una serie de controles? Seleccione Aceptar para confirmar la operación.
Los controles agregados de esta manera comparten solo la propiedad Nombre y el tipo de control otras propiedades tienen los mismos valores que cuando se dibujó originalmente el control.
Para agregar un elemento de matriz de control copiando un control existente:
1. Dibuje los controles en la matriz de controles.
2. Cuando el control esté enfocado, seleccione el comando "Copiar" en el menú "Editar".
3. En el menú "Editar", seleccione el comando "Pegar". Visual Basic mostrará un cuadro de diálogo que le preguntará si desea confirmar la creación de la matriz de control. Seleccione Aceptar para confirmar la operación. El valor de índice asignado al control es 1. El primer control dibujado tiene un valor de índice 0.
El valor del índice de cada nuevo elemento de la matriz es el mismo que el orden en que se agregó a la matriz de control. Cuando agrega un control como este, la mayoría de las propiedades visuales, como la altura, el ancho y el color, se copian del primer control de la matriz al nuevo control.
Agregar matriz de control en tiempo de ejecución
En tiempo de ejecución, puede utilizar las instrucciones Load y Unload para agregar y eliminar controles de la matriz de controles. Sin embargo, el control agregado debe ser un elemento de una matriz de controles existente. Debe crear un control con (en la mayoría de los casos) una propiedad Índice de 0 en tiempo de diseño y luego usar la siguiente sintaxis en tiempo de ejecución:
Al cargar un nuevo elemento de una matriz de control, la mayoría de las configuraciones de propiedades se copiarán del elemento existente en la matriz con el subíndice más pequeño; en este caso, el elemento con índice 0. Debido a que las configuraciones de las propiedades Visible, Índice y TabIndex no se copian automáticamente a nuevos elementos en la matriz de controles, para que el control recién agregado sea visible, su propiedad Visible debe establecerse en Verdadero.
Tenga en cuenta que Visual Basic generará un error al intentar utilizar la instrucción Load en un valor de índice que ya existe en la matriz.
El punto importante es que la instrucción Unload se puede utilizar para eliminar todos los controles creados por la instrucción Load. Sin embargo, Unload no puede eliminar los controles creados en tiempo de diseño, independientemente de si forman parte de la matriz de controles.
Esquema de control: agregar y eliminar controles en la matriz de controles
En el ejemplo de la matriz de controles se demuestra cómo agregar y eliminar controles en tiempo de ejecución, donde el control es un botón de opción. Según este ejemplo, el usuario puede agregar botones de opción para cambiar el color de fondo del cuadro de imagen.
Como se muestra en la Figura 7.3, inicie el formulario y luego dibuje un cuadro de imagen, una etiqueta, dos botones de opción y tres botones de comando.
Controlar eventos de aplicaciones de matriz
A continuación, debe agregar procedimientos de evento para el botón de opción y el botón de comando. Inicie la aplicación después de agregar la declaración del formulario:
DimMaxIdAsInteger
Todos los botones de opción comparten el procedimiento del evento Click:
PrivateSuboptButton_Click(IndexAsInteger)
picDisplay.BackColor=QBColor(Índice 1)
FinSub
Agregue un nuevo botón de opción a través del procedimiento de evento Click del botón de comando "Agregar". En este ejemplo, antes de ejecutar la instrucción Load, el código verifica que no estén cargados más de diez botones de opción. Una vez cargado el control, su propiedad Visible debe establecerse en Verdadero.
PrivadoSubcmdAdd_Click()
IfMaxId=0ThenMaxId=1 'Establecer todos los botones de opción.
IfMaxId>8ThenExitSub 'Sólo se permiten diez botones.
MaxId=MaxId 1 'Aumenta el número de botones.
LoadopButton(MaxId) 'Crea un nuevo botón.
optButton(0).SetFocus 'Opciones del botón Restablecer.
'Coloque el nuevo botón debajo del botón anterior.
optButton(MaxId).Top=optButton(MaxId-1)._
400 mejores
optButton(MaxId).Visible=True 'Mostrar nuevo botón.
optButton(MaxId).Caption=Opción&MaxId 1
FinSub
Elimine un botón de opción mediante el procedimiento de evento Click del botón de comando Eliminar:
PrivadoSubcmdDelete_Click()
IfMaxId<=1ThenExitSub 'Conserva los dos primeros botones.
UnloadoptButton(MaxId) 'Eliminar el último botón.
MaxId=MaxId-1 'El número de botones disminuye.
optButton(0).SetFocus 'Opciones del botón Restablecer.
FinSub
Finalice la aplicación mediante el procedimiento de evento Click del botón Cerrar:
PrivadoSubcmdClose_Click()
Descargarme
FinSub
->