Sección de tutoriales y manuales vb

Tips de ayuda sobre la creación de controles ocx

1 - 2



 

 

Página 1 - Contenido

En esta sección iré añadiendo algunos tips básicos que pueden servir de ayuda sobre la creación de controles de usuario, con algunos ejemplos en cada caso.

 

 


 

1 - Propiedad ContainedControls

Esta propiedad nos devuelve una colección con los controles que están contenidos en nuestro control de usuario si este actúa como un control contenedor, ojo, los controles colocados en la instancia del ocx, no los controles constituyentes.

Para poder utilizar esta colección para recuperar dichos controles, nuestro control ocx debe actuar como un contenedor mediante la propiedad ControlContainer. Por defecto esta se encuentra deshabilitada, es decir con el valor en False.

El siguiente ejemplo muestra como recorrer mediante un bucle For-Each dicha colección y poder ver el nombre del control mediante un mensaje.

PAra el ejemplo coloca un Botón Command1 dentro del usercontrol. ahora en el evento click de dicho Command1 pega el siguiente código:

Private Sub Command1_Click()
'Variable para el nombre del control al recorrer la colección
Dim Control As Object

For Each Control In ContainedControls
'Mostramos el nombre del control
MsgBox Control.Name
Next

End Sub

Desde la ventana de propiedades, como se mencionó, es importante que la propiedad ControlContainer esté en True. Por último en un formulario, agrega una instancia del ocx y colocale algunos controles dentro. Corre el programa y pulsa el botón command1 para visualizar los nombres de los controles.

 

2 - Propiedad Controls

Esta propiedad es similar a la anterior, con la diferencia de que nos devuelve una colección con los controles constituyentes del contol, es decir los que forman parte del mismo objeto UserControl

 

Para probar un ejemplo bien simple, coloca en la ventana de un UserControl algunos controles, y luego pega lo siguiente en la ventana de código del ocx.

Private Sub UserControl_Show()
'Variable para el nombre del control al recorrer la colección
Dim ElControl As Object

For Each ElControl In Controls

'Mostramos el nombre del control.
MsgBox ElControl.Name
Next

End Sub

Por último, agrega una instancia del usercontrol anterior en un formulario para mostrar un mensaje con los nombres de los controles.

 

3 - Propiedad UserMode - saber si estamos en tiempo de diseño o de ejecución

Si queremos averiguar o determinar si estamos corriendo en tiempo de diseño o de ejecución nuestro control Activex, podemos consultar la propiedad UserMode del objeto Ambient.

La propiedad UserMode es de solo lectura, es decir que solo la podemos consultar.

Si la misma devuelve el valor True es porque estamos en tiempo de ejecución, en cambio si nos devuelve False en tiempo de diseño.

Ejemplo: Pegar el siguiente código en el módulo de un usercontrol. Luego coloca una instancia del mismo en un formulario y verás el segundo mensaje ya que userMode devuelve False. Ahora ejecuta el formulario, y verás el primer mensaje ya que UserMode devuelve True, es decir que estamos en tiempo de ejecución.

 Private Sub UserControl_Show()

If Ambient.UserMode Then
   MsgBox "Nuestro ocx está en tiempo de ejecución"
Else
   MsgBox "Nuestro ocx está en tiempo de diseño"
End If

End Sub

 

4 - Evento Resize.

Este ejemplo es muy simple y muestra como redimensionar un control constituyente al objeto UserControl, al agregar una instancia del mismo por ejemplo en un formulario o contenedor, el control constituyente se redimensione al tamaño del mismo. En este caso el control para el ejemplo será un Textbox llamado Text1.

 

El siguiente código en el módulo de código del ocx

Private Sub UserControl_InitProperties()
Text1.Move 0, 0
End Sub

Private Sub UserControl_Resize()

Text1.Width = UserControl.Width
Text1.Height = UserControl.Height

End Sub

Coloca una instancia del ocx anterior en un formulario, y cambialo de tamaño para comprobar que el control textBox se redimensiona al tamaño del ocx.

 

5 - Evento AmbientChanged

Si necesitamos por ejemplo averiguar cuando una propiedad de entorno, por ejemplo, si se cambia la propiedad BackColor de un form, para que de esta manera establecer el mismo color de fondo al userControl, podemos chequear mediante el evento AmbientChanged, la propiedad BackColor

Este ejemplo, hace lo descrito antes, es decir, si el usuario ha modificado el color de fondo del formulario o del contendedor donde esté incrustado el ocx, el backcolor de este último se establecerá del mismo valor que el color del entorno.

Private Sub UserControl_AmbientChanged(PropertyName As String)
If PropertyName = "BackColor" Then
UserControl.BackColor = Ambient.BackColor
End If
End Sub

 

6 - Propiedad ContainerHwnd

Esta propiedad nos devuelve el hwnd del contenedor donde está ubicado y contenido la instancia del UserControl.

 

El siguiente ejemplo muestra un mensaje con el valor del handle.

Private Sub UserControl_Show()
MsgBox UserControl.ContainerHwnd
End Sub

 

7 - Propiedad Name del objeto Extender

La propiedad Name del objeto Extender es de solo lectura y nos permite recuperar el nombre del objeto UserControl.

Esto es ideal por ejemplo para que al colocar una instancia de un ocx por ejemplo en un form y necesitamos mostrar en el mismo el nombre. Por ejemplo como lo hacen muchos de los controles de vb, como el textbox, que si tenemos un text1 y colocamos otro textbox, este se llama text2 , si añadimos otro mas se llama Text3 etc...

Para hacer este ejemplo, colocar un control Label1 en un UserControl y renombrar el Usercontrol por ejemplo con el valor Micontrol en la propiedad Name del mismo.

Luego en el evento InitProperty, le asignamos al caption del label1, el Extender.Name que nos devuelve el nombre de la instancia

Private Sub UserControl_InitProperties()
Label1.Caption = Extender.Name
End Sub

Al colocar varias instancias en un formulario, cada ves que agregues una nueva, deberás visualizar, "MiControl1", "MiControl2", etc...

 

8 - Propiedad Picture en un UserControl

Este ejemplo muestra como implementar la propiedad Picture en un control de usuario, es decir como lo hace por ejemplo el control PictureBox, que desde la ventana de propiedades podemos acceder con un cuadro de diálogo para seleccionar el gráfico a cargar en el control de imagen, y además el uso de Property Let y Property Set para poder hacerlo también en tiempo de ejecución, por ejemplo :

MiControl.Picture = LoadPicture(ruta)

 

Colocar en un UserControl un PictureBox llamado Picture1. En la ventana de código del ocx colocar el siguiente código:

 Public Property Get Picture() As Picture
Set Picture = Picture1.Picture
End Property

Public Property Set Picture(ByVal vNewValue As Picture)
Set Picture1.Picture = vNewValue
PropertyChanged "Picture"

End Property

Public Property Let Picture(ByVal vNewValue As Picture)
Set Picture1.Picture = vNewValue
End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

Set Picture = PropBag.ReadProperty("Picture", Nothing)

End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

Call PropBag.WriteProperty("Picture", Picture, Nothing)

End Sub

Ahora agrega un instancia del ocx anterior en un formulario, desde la ventana de propiedades cargale alguna imagen.

Para cargar en tiempo de ejecución lo hacemos como se mencionó antes, es decir pasarle a la propiedad Picture del ocx la ruta al método LoadPicture.

 

Cuadro de diálogo de color en un UserControl

Para implementar este cuadro de diálogo, se deben declarar las propiedades como de tipo OLE_COLOR.

El siguiente ejemplo muy simple tiene un UserControl con 2 propiedades: MiBackColor y MiForeColor. A su ves el ocx tiene un control Label1.

Al cambiar la propiedad MiBackColor se establecerá el color de fondo del label1 y MiForeColor el color de la fuente del label

Colocar un Label1 en el ocx, y el código:

 'Valor por defecto de las propiedades:

Const m_def_MiBackColor = vbBlue
Const m_def_MiForeColor = vbRed



'Inicializar propiedades para control de usuario
Private Sub UserControl_InitProperties()

    Label1.BackColor = m_def_MiBackColor
    Label1.ForeColor = m_def_MiForeColor
End Sub

'Cargar valores de propiedad desde el almacén
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

    Label1.BackColor = PropBag.ReadProperty("MiBackColor", m_def_MiBackColor)
    Label1.ForeColor = PropBag.ReadProperty("MiForeColor", m_def_MiForeColor)

End Sub

'Escribir valores de propiedad en el almacén
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

    Call PropBag.WriteProperty("MiBackColor", Label1.BackColor, m_def_MiBackColor)
    Call PropBag.WriteProperty("MiForeColor", Label1.ForeColor, m_def_MiForeColor)
End Sub

'Propiedad para el color de fondo
Public Property Get MiBackColor() As OLE_COLOR
    MiBackColor = Label1.BackColor
End Property

Public Property Let MiBackColor(ByVal New_MiBackColor As OLE_COLOR)
    Label1.BackColor = New_MiBackColor
    PropertyChanged "MiBackColor"
End Property


'Propiedad para el color de la fuente
Public Property Get MiForeColor() As OLE_COLOR
    MiForeColor = Label1.ForeColor
End Property

Public Property Let MiForeColor(ByVal New_MiForeColor As OLE_COLOR)
    Label1.ForeColor = New_MiForeColor
    PropertyChanged "MiForeColor"
End Property

          

 

10 - Ocultar una propiedad y establecerle una descripción

 

Cuando creamos una propiedad en nuestro control, por defecto estas están visibles desde la ventana de propiedades cuando instanciamos el ocx en un formulario. Hay ciertas propiedades que no deseamos que se puedan acceder desde dicha ventana, como por ejemplo la propiedad ListCount de un ComboBox es un ejemplo, esta está accesible desde la ventana de código pero oculta a la ventana de propiedades.

Para realizar esto se debe acceder al menú Herramientas > Atributos del Procedimiento y en esta ventana seleccionar desde la lista la propiedad a ocultar y marcar el checkbox con la opción " No mostrar en el examinador de propiedades ". También desde aquí se puede asignarle una descripción a dicha propiedad para que se visualice al seleccionar la misma

 

vista de la Ventana de Atributos de procedimiento de los controles ocx

 

 

11 - Propiedad Parent del UserControl

Si queremos averiguar el Formulario que contiene a nuestro control Ocx, podemos utilizar la propiedad Parent del Usercontrol. el siguiente ejemplo lo que hace es, centrar el Control Ocx en el Formulario, haciendo uso también del método Move del objeto Extender.

 

La salida del ejemplo debe ser algo por el estilo:

vista del ejemplo para centrar el ocx en el formulario que lo contiene

 

Colocar en la ventana de código del Usercontrol lo siguiente:

Option Explicit
'Variable de tipo form con Evento
Private WithEvents ElForm As Form


'Cada ves que cambie el tamaño del Formulario se dispara este evento
Private Sub ElForm_Resize()
    'Centramos el usercontrol utilizando el objeto extender con el método Move
    Extender.Move (ElForm.ScaleWidth - Width) / 2, (ElForm.ScaleHeight - Height) / 2, 5000, 2000
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    'Si estamos en tiempo de ejecución
    If Ambient.UserMode Then
        
        'La variable ElForm pasa a ser el formulario que contiene _
        al USercontrol. También disparará el evento Resize ya que está _
        declarada WithEvents para que pueda desencadenar eventos
        Set ElForm = UserControl.Parent
        
    End If
End Sub


'Esto solo imprime un texto en el control
Private Sub UserControl_Show()
ElForm_Resize

With UserControl
    .BackColor = vbBlue
    .BorderStyle = 1
    .FontSize = 10
    .ForeColor = vbWhite
End With

UserControl.Print " Usercontrol centrado. Redimensiona el formulario "

End Sub

Private Sub UserControl_Terminate()
'Elimina la referencia del formulario de la memoria

If Not ElForm Is Nothing Then
    Set ElForm = Nothing
End If
End Sub 

 

12 - Propiedad por defecto

Ejemplo que muestra como establecerle a una propiedad del Usercontrol para que la misma sea la predeterminada ( propiedad por Default )

Suponiendo que nuestro control tiene una propiedad llamada caption, y queremos que sea la predeterinada, es decir poder asignarla sin escribirla:

es decir en ves de hacer esto:

Usercontrol.caption = " Hola "

poder llamarla:

UserControl1 = " Hola "

 

.. debemos especificar, en la ventana Atributos del procedimiento, del menú Herramientas, en la ficha Avanzadas, la opción " Predeterminada ", como muestra el siguiente gráfico :

vista de la ventana de atributos de procedimiento

 

Una ves asignado el valor predeterminado, en el combo " Id del procedimiento ", la misma ya queda como propiedad por default

 


Ir a la siguiente página >

 

 


Buscar en Recursos vb