Sección de tutoriales y manuales vb
1 - 2
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.
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.
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.
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
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.
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
El siguiente ejemplo muestra un mensaje con el valor del handle.
Private Sub UserControl_Show()
MsgBox UserControl.ContainerHwnd
End Sub
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...
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.
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
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
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:
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
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 :
Una ves asignado el valor predeterminado, en el combo " Id del procedimiento ", la misma ya queda como propiedad por default
Buscar en Recursos vb
Recursos visual basic - Buscar - Privacidad - Copyright © 2005 - 2009 - www.recursosvisualbasic.com.ar