Documentos de Académico
Documentos de Profesional
Documentos de Cultura
19
A modo de comentario. Hemos llegado a un capítulo que todos los alumnos desean
conocer: el capítulo donde vamos a ver como se crea un control personalizado. A lo largo de
mis años de docencia he observado que los alumnos mas aventajados tienden a realizar
aplicaciones usando controles realizados por ellos mismos, en la creencia que eso protege
sus programas frente a posibles imitaciones, ya que parece que poseen la llave que da
acceso a sus secretos. Incluso hay quien piensa que el uso de este tipo de controles da
cierto prestigio como programador. Y hay también empresas especializadas en software que
comparten esas mismas ideas. En el ámbito empresarial hay quien realizó uno de estos
controles con fecha de caducidad, de forma que pasada una fecha, el control deja de
funcionar y con él la aplicación. Buena forma de asegurarse el contrato de mantenimiento, ya
que el control había que reemplazarlo antes de llegar a esa fecha, pero una hermosa forma a
la vez de perder al cliente y la credibilidad como empresario y como programador. Es una
cuestión de criterios personales o comerciales, pero la creación de controles personalizados
es una práctica que solamente debe llevarse a cabo cuando es estrictamente necesario por
no existir ningún recurso en VB que realice lo deseado. Y es decisión muy prudente no
aceptar ninguna aplicación que llevando un control personalizado, no se entregue con la
aplicación, toda la información relativa al mismo, incluyendo su código fuente.
Para crear un control, lo primero que hay que hacer es pensar, con papel y lápiz, las funciones
que debe realizar ese control, así como sus propiedades y métodos. Hay que pensar durante
este proceso, si el control se va a encapsular dentro de un OCX solo o con otros
controles, ya que un mismo OCX puede contener más de un control. Una vez
realizado este estudio previo, se procede a abrir un nuevo proyecto, eligiendo en
este caso la creación de un Control ActiveX, sobre el icono mostrado en la figura.
Aparecerá algo distinto a lo que nos encontramos cuando creamos un proyecto
EXE Standard.
Lo primero que observamos es que no aparece un formulario, sino algo, que si bien se le
parece, sabemos que no lo es. Esa especie de formulario es el objeto UserControl.
El UserControl es el objeto base del control que estamos creando. Un control ActiveX se
compone siempre de un UserControl y sobre él podremos colocar otros controles. A los
controles que colocamos sobre el UserControl se les denomina Controles Constituyentes.
Al compilar el proyecto, en vez de generar un fichero .EXE, generará un fichero .OCX Y este
OCX es idéntico a los que vemos en Proyecto | Componentes cada vez que queremos
introducir un componente que no está en la barra de herramientas. (Falta registrarlo, pero
veremos más adelante como se registra)
Se pueden introducir varios UserControl en un mismo proyecto. Esto generará igual número de
controles dentro del mismo paquete .OCX. esta práctica es bastante normal. Por ejemplo, el
MSCOMCTL.OCX (Microsoft Windows Common Controls 6.0) contiene 9 controles. Pero
tenga cuidado cuando meta controles dentro del mismo paquete. Piense que cada control va a
ocupar cierto sitio. Suponga que hace un OCX con 9 controles. Ocupará más espacio en disco
que si hubiese metido 1. Cuando meta en un proyecto uno solo de estos controles, deberá
meter en el proyecto la totalidad del espacio que ocupaban los 9 controles. El caso del control
Registrar un control. El registro de un control es una operación que Windows debe hacer
para meter los datos de ese control (nombre y ubicación dentro del disco) dentro del registro
de Windows. Esto le facilita la búsqueda del fichero.
Lo normal es colocar los controles OCX dentro de la carpeta C:\Windows\System. Puede
ponerlo en cualquier otra carpeta, pero esa es la usual. Eso sí, una vez puesto en la carpeta
deseada y registrado no lo puede mover, ya que Windows no lo encontraría.
Hay un método muy sencillo para registrar un control cuando tiene el Visual Basic instalado en
su PC. Guarde el fichero OCX en C:\Windows\System. Vaya a Proyecto | Componentes y le
aparecerá el cuadro para elegir un nuevo control. No aparecerá ese nuevo OCX dentro de la
lista de este cuadro, ya que todavía no está registrado.
Haga clic sobre el botón Examinar… Le aparecerá el cuadro para seleccionar un fichero.
Seleccione el fichero OCX que acaba de introducir y ese OCX ya está registrado.
Cuidado. Esta forma, sencilla y sin complicaciones, puede llevarle en más de una ocasión a
registrar controles que no desea.
Cuando no tenga VB instalado tendrá que recurrir a un programa que trae Windows: el
Regsvr32.Exe Para ello vaya a Inicio | Ejecutar y en el cuadro que le aparece introduzca el
nombre del programa seguido del nombre completo del OCX a registrar. (Fig. 19.2)
Cuando realizamos la instalación de un programa realizado en Visual Basic, ocurre con mayor
frecuencia de la deseada que uno de los controles no se registra. El registro lo hace
automáticamente la instalación, pero a veces, falla. En algunos casos el programa funciona
perfectamente, pero en otros no funciona. Y en estos casos es normal que el OCX no haya
llegado a guardarse en el disco. Solución: copiar ese OCX directamente sobre
C:\Windows\System y realizar el registro de la forma descrita.
El UserControl tiene sus Propiedades, Métodos y Eventos. También las tienen los controles
constituyentes. Pero las propiedades, métodos y eventos de ninguno de ellos pasa a formar
parte de las propiedades, métodos o eventos del control que estamos creando.
Vamos a ver como se introducen las propiedades del nuevo control. Para ello vamos a estudiar
dos instrucciones de Visual Basic: Property Get y Property Let
Estas instrucciones se introducen igual que cuando se introduce una función o procedimiento
en un formulario. Haciendo clic en Herramientas | Agregar Procedimiento. Nos aparece un
cuadro donde debemos elegir Propiedad Recuerde que el elemento del menú de VB Agregar
Procedimiento solamente está activado cuando está abierta una ventana de código. La
ventana de código abierta debe ser del proyecto del control ActiveX (Del UserControl o de
cualquiera de los controles constituyentes) Se le pone el nombre que desea que tenga la
propiedad. Por ejemplo, si queremos que esa propiedad sea el color de fondo del nuevo
control, pondremos ColorDeFondo (¿Porque habríamos de poner Backcolor si el control se ha
desarrollado en España?)
Basta con hacer clic en Aceptar y ya nos ha introducido dos nuevas cosas en la ventana de
código, en el desplegable de la derecha (Fig. 19.4)
End Property
End Property
Vea que empieza como todos los procedimientos, con Public (Podría ser Private) seguido de
Property Let (o Property Get) y termina con End Property
Como puede verse, el procedimiento Property Let necesita un valor, vNewValue que ha
declarado como Variant. A ese el procedimiento para poner el valor a la propiedad necesita
que le pasemos el valor de esa propiedad. Lo que no puede saber, es el tipo de dato que debe
usar para ColorDeFondo. Por eso pone As Variant y de esta forma podemos meter cualquier
valor. Sin embargo, sabemos desde el Capítulo 1 que las variables declaradas como Variant
ocupan mucho espacio en memoria, y debemos optimizar el programa ajustando las variables.
Observe que lo hemos cambiado en los dos procedimientos. Si no se cambia en ambos dará
error.
En el caso del color también puede poner otro tipo de variable: OLE_COLOR, que es lo que
hace VB con el asistente.
Es muy útil, no necesario, comunicar al control que ha cambiado una de sus propiedades. Esto
sirve para que pueda guardar el nuevo valor en su página de propiedades. Ya lo veremos.
Para comunicarle que ha cambiado una propiedad se le añade una línea al código anterior
Este procedimiento es el que se ejecuta cuando ponemos un valor al color de fondo del nuevo
control cuando ponemos, por ejemplo
Vamos a ver el código del procedimiento que se ejecuta cuando queremos saber el valor que
tienen esa propiedad.
Sintaxis
Argumentos Argumentos que deben pasarse al llamar a ese procedimiento. El tipo de datos
de cada argumento será el mismo que en el procedimiento Property Get
Instrucciones Es el código que hay que escribir en el procedimiento para que realice lo que
desea el programador. Estas instrucciones pueden generar una condición en la que se debe
abandonar el procedimiento. En ese caso, puede salirse del procedimiento con Exit Prperty
Por Valor (ByVal) El valor de la variable fuera del procedimiento mantienen el valor, aunque
ese valor cambie dentro del procedimiento.
Por Referencia (ByRef) El valor de la variable fuera del procedimiento cambia si suse
modifica en el procedimiento.
Sintaxis
El ámbito y la forma de pasar los parámetros son idénticas a las de Property Let
Veamos que propiedades debe tener este control. Aparte de la ya citada, ColorDelFondo,
vamos a ponerle:
In_Cod_Barras. De tipo texto, para poder pasarle por programa el código de barras de un
producto.
In_Unidades. Numérica double para que permita decimales, y permitir así vender productos
“al peso”
Out_Precio_Total, numérico double con el precio total de las unidades vendidas de ese
producto
(Hemos tenido el detalle de que las variables que contienen datos que entran en el control
comienzan por In_ y las que salen del control comienzan por Out_ Esto no significa que sean
solo de escritura o de lectura)
Se introducen estas propiedades tal como se explicó más atrás. En la Fig 19.7 puede verse el
cuadro de propiedades del control, con todas estas propiedades ya metidas. Ese cuadro,
como sabemos, aparece pulsando F4 estando seleccionado el control. Ese control está sobre
un formulario de prueba que aun no sabemos como ponerlo, pero se explicará en breve. Este
cuadro es el típico de todos los controles, pero estamos acostumbrados a que, haciendo clic
con el botón derecho del ratón, aparezca un cuadro de diálogo donde podemos introducir las
propiedades. Y eso, no sabemos todavía como hacerlo.
Al elegir el asistente,
aparece un cuadro donde
nos muestra las
propiedades que hemos
metido en nuestro control.
En el caso del ejemplo,
esas propiedades son:
ColorDeFondo
In_Cod_Barras
In_Unidades
In_DeshabilitarIncr_Desc
Out_Descripcion
Out_Precio_Total
El asistente nos pide que elijamos las propiedades que queremos que aparezcan en el cuadro
de dialogo de propiedades. Se las ponemos todas. Vamos aceptando todos los pasos, hasta
que hacemos clic en el botón Finalizar. El cuadro de dialogo de propiedades ya está creado.
Vamos al formulario de prueba y hacemos clic con el botón derecho sobre el control. Aparece
por fin el cuadro de dialogo de propiedades.
Puede ahora incluir en ese cuadro cualquier control, como si se tratase de un formulario.
Queda a merced de su capacidad artística rematarlo de forma adecuada
Puede observar ahora que en la ventana de proyecto aparece ahora otro componente: la
página de propiedades.
La página de propiedades (Property Page) tiene las casi todas las propiedades, métodos y
eventos de un formulario. No vamos a extendernos en su estudio exhaustivo, ya que sería
salirse del objetivo del curso.
Solamente falta introducir el código adecuado en los procedimientos del UserControl. Por
ejemplo, para comprobar que el código de barras es correcto, creamos un procedimiento
Puede probar todas las características del nuevo control. De cualquier forma no se fíe, y
realice la comprobación final en un proyecto completamente independiente, una vez que ya
haya compilado el control.
Para ver como se hace esto vamos a hacer un ejemplo, siguiéndolo paso a paso.
Propiedad AccessKeys
Devuelve o establece una cadena que contiene las teclas que funcionarán como teclas de
acceso (o teclas aceleradoras) del control. La propiedad AccessKeys es una cadena que
contiene todas las teclas de acceso del control. Por ejemplo, para establecer las letras S e Y
como teclas de acceso, la propiedad AccessKeys se establecería a "sy". Cuando un usuario
presiona una de las teclas de acceso junto con la tecla ALT, el control recibirá el enfoque
(según el valor de la propiedad ForwardFocus). Las teclas de acceso de los controles
componentes se incluyen implícitamente como teclas de acceso, aunque no aparezcan en la
propiedad AccessKeys.
ActiveControl (Propiedad)
Devuelve el control que tiene el enfoque.
Propiedad AutoRedraw
El UserControl acepta métodos gráficos. La propiedad AutoRedraw (True/False) hace lo
mismo que en el Formulario.
Propiedad BackStyle
Establece el tipo de fondo del UserControl (Opaco / Invisible)
Propiedad ClipBehavior
Sirve para determinar la zona donde se verán los métodos gráficos, cuando está transparente.
Véase en la ayuda.
Propiedad ContainedControls
Devuelve la colección de controles constituyentes y los que se hayan podido añadir en tiempo
de ejecución. Funciona de forma similar a la propiedad Controls de un formulario.
Propiedad ContainerHWnd
Devuelve el controlador de la ventana (hWnd) del contenedor de un UserControl. Se usa para
programar con APIS.
Propiedad DataMembers
Devuelve una referencia a la colección DataMembers.
Un proveedor de datos puede proporcionar múltiples conjuntos de datos a los que un receptor
puede enlazar. Cada conjunto de datos se llama "miembro de datos" y está identificado
mediante una cadena única.
La colección DataMembers contiene los nombres de todos los miembros de datos disponibles
para el receptor de datos.
Propiedad EditAtDesignTime
Establece si un control puede activarse en el tiempo de diseño del programador. Si es True el
control puede activarse en tiempo de diseño y se comportará como lo haría en tiempo de
ejecución.
Extender (Propiedad)
Devuelve, para este control, el objeto Extender que almacena las propiedades del control
mantenidas por el contenedor. La propiedad Extender no está disponible en tiempo de diseño
del control y es de sólo lectura en tiempo de ejecución.
Propiedad MaskColor
Devuelve o establece el color que determina la región transparente del mapa de bits asignado
a la propiedad MaskPicture de un objeto UserControl cuya propiedad BackStyle está
establecida a 0 (Transparente).
Importante Esta característica sólo es soportada con mapas de bits de tipo imagen, como GIF,
JPEG y DIB. No es soportada con iconos, cursores o metaarchivos de Windows.
Propiedad ToolBoxBitMap