Sección de tutoriales y manuales vb

Tips de ayuda sobre la creación de controles ocx

1 - 2



 

 

Página 2 - Contenido

 

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

 

 

 

 


1 - Método AsyncRead

Este ejemplo utiliza el Método AsyncRead y algunos eventos relacionados a este, como AsyncReadProgress y AsyncReadComplete para descargar un archivo gráfico desde una Url remota y luego visualizarlo en un Picturebox.

La descripción del Método AsyncRead: Este método lee datos de forma asíncrona desde una ruta o una dirección URL y recibe un evento AsyncReadComplete una ves finalizada la descarga.

En el ejemplo, hay un método llamado Descargar, que recibe como parámetro la Url del archivo gráfico Remoto. Cuando finaliza la descarga, se produce el evento AsyncReadComplete, en cambio mientras se está descargando el archivo, se produce el evento AsyncReadProgress. Este último contiene como parámetro un objeto AsyncProp, este objeto, entre sus propiedades, posee una llamada BytesMax con la cantidad de Bytes del Archivo, y otra propiedad llamada BytesRead con la cantidad de Bytes leídos actualmente. Mediante estas dos se puede visualizar un progreso, por ejemplo en un ProgressBar

 

vista del ejemplo previo para utilizar el método AsynRead de los  UserControl

 

Al finalizar la descarga, dentro del userControl, se ejecuta el evento AsyncReadComplete. Justo aquí se asigna el valor Asynrad.Value, que contiene el archivo gráfico descargado, a una propiedad de tipo Picture, en el ejemplo la propiedad se llama PictureRemoto.

En el método AsyncRead, en el cuarto parámetro que es de tipo opcional ( AsyncreadOptions ), se pueden pasar los siguientes valores:

vbAsyncReadForceUpdate: AsyncRead forzará una descarga del recurso desde el servidor, ignorando cualquier copia almacenada localmente.

vbAsyncReadGetFromCacheIfNetFail: AsyncRead utilizará la copia almacenada localmente si no se puede conectar con el servidor.

vbAsyncReadOfflineOperation: AsyncRead sólo utilizará el recurso almacenado localmente.

vbAsyncReadResynchronize: AsyncRead sólo actualizará la copia almacenada localmente si la versión del servidor es más reciente.

vbAsyncReadSynchronousDownload: AsyncRead no devolverá valores hasta que se haya desencadenado el evento AsyncReadComplete.

 

En este ejemplo, solo se utiliza la opción vbAsyncReadForceUpdate, para forzar la descarga e ignorar la copia local del archivo. Es decir si no fuerza la descarga con esta opción, si por ejemplo descargamos un archivo, una ves finalizado volvemos a descargar el mismo, se utilizará la copia local en ves de volver a descargarlo, utilizando la caché.

Aclarar, que para utilizar este método para descargar otro tipo de archivos, o mejor dicho la forma en que se descarga un dato x, se puede especificar en el segundo parámetro de AsyncRead, ( parámetro AsyncType ) los siguientes tipos:

vbAsyncTypeByteArray: Se proporcionan los datos como una matriz de bytes que contiene los datos obtenidos. Se supone que el autor del control sabe cómo tratar los datos.

vbAsyncTypeFile: Se proporcionan los datos en un archivo creado por Visual Basic.

vbAsyncTypePicture: Se proporcionan los datos en un objeto Picture.

 

Aquí en este ejemplo, se utiliza la tercer opción, vbAsyncTypePicture.

 

Nota: para probar el ejemplo, y poder ver el progreso asincrono, descargar algún archivo gráfico que pese lo suficiente como para poder visualizar el mismo, por ejemplo de 300 a 500 Kb por decir un valor, obviamnete esto depende de la velocidad de la conexión que tengamos, ya que si descargamos un archivo gráfico por ejemplo de 10 Kb, será tan rápido que no se verá el progreso

 

A continuación sigue el código para colocar en el ocx, y el código para colocar en un formulario de prueba

 

Colocar en un UserControl el siguiente código fuente:

Option Explicit

Private m_PictureRemoto As Picture
Public UsarCache As Boolean
'Evento para mostrar el progreso de descarga del archivo gráfico remoto
Public Event Progreso(BytesMax As Long, BytesLeidos As Long)
' Evento para cuando finaliza la descarga
Public Event DownloadComplet()


'Sub que comienza la descarga asíncrona
Public Sub Descargar(ByVal Url As String)
    
    On Error GoTo PropErr
    
    'El tipo de descarga es vbAsyncTypePicture
    
    If UsarCache = False Then
        Call AsyncRead(Url, vbAsyncTypePicture, Url, vbAsyncReadForceUpdate)
    Else
        Call AsyncRead(Url, vbAsyncTypePicture, Url)
    End If
    Exit Sub

'Error
PropErr:
MsgBox Err.Number & vbNewLine & Err.Description, vbCritical
    Exit Sub

End Sub


Public Property Get PictureRemoto() As Picture
    Set PictureRemoto = m_PictureRemoto
End Property


Private Sub UserControl_AsyncReadProgress(AsyncProp As AsyncProperty)

'Le envía al evento Progreso, los bytes totales y bytes leídos
RaiseEvent Progreso(AsyncProp.BytesMax, AsyncProp.BytesRead)

End Sub

'Cuando finaliza la descarga se asigna a m_PictureRemoto el valor _
 de AsyncProp.Value, que contiene el archivo gráfico remoto

Private Sub UserControl_AsyncReadComplete(AsyncProp As AsyncProperty)
    On Error GoTo PropErr
      
    Set m_PictureRemoto = AsyncProp.Value
    
    ' Dispara el evento que notifica la finalización de la descarga
    RaiseEvent DownloadComplet
    
    Exit Sub

'Error
PropErr:
    MsgBox Err.Number & vbNewLine & Err.Description, vbCritical
    Exit Sub
End Sub

 

Ahora colocar en un formulario para probar el ocx:

  1. Un control ProgressBar1
  2. un Command1 para comenzar la descarga
  3. un control Picture1
  4. un Text1 donde se ingresará la Url del gráfico a visualizar en el Picturebox
  5. un Check1
  6. un Label llamado lblTotal y un Label llamado lblLeido, para visualizar los bytes totales del archivo y los bytes leídos actualmente.

 

Colocar una instancia del Usercontrol en el formulario, y pegar esto en el Form1:

Option Explicit


'Evento que se produce mientras se está descargando el archivo

Private Sub UserControl11_Progreso(BytesMax As Long, BytesLeidos As Long)


If BytesMax <> 0 Then
   ProgressBar1.Max = BytesMax
End If

' Visualiza en el ProgressBar el progreso
ProgressBar1.Value = BytesLeidos

' Visualiza en los Label los datos
lblTotal = "Total: " & FormatNumber((BytesMax / 1024), 2) & " KB"
lblLeido = "Descargado: " & FormatNumber((BytesLeidos / 1024), 2) & " KB"

End Sub

'Evento que se produce al finalizar la descarga, y cargando en Picture1 el gráfico
Private Sub UserControl11_DownloadComplet()
Picture1.Picture = UserControl11.PictureRemoto

MsgBox " Fin de descarga del archivo", vbInformation

End Sub


Private Sub Check1_Click()
' si UsarCache está con el Valor True y se intenta descargar nuevamente _
 el mismo archivo, se utilizará la copia local, si no se forzará la descarga
If Check1.Value = 1 Then
   UserControl11.UsarCache = True
Else
   UserControl11.UsarCache = False
End If
End Sub

'Comienza la descarga
Private Sub Command1_Click()
UserControl11.Descargar Trim$(Text1)
End Sub

Private Sub Form_Load()

Command1.Caption = "Descargar"
Check1.Caption = " Usar Caché "
End Sub 

 

También, en el siguiente enlace, podés descargar un programa relacionado a este tema de descarga de archivos desde internet, utilizando los métodos y propiedades vistos.

Pero en este caso se ve como descargar múltiples archivos al mismo tiempo. Cada archivos que se va descargando, se visualiza en un control ListView, indicanco el porcentaje y progreso de la operación :

 

vista previa del proyecto para descargar

 

Autor del ejemplo : Filipe Lage

Descargar

 


2 - Delegar propiedades, métodos y eventos de un control constituyente de un Usercontrol rapidamente

Este es un muy buen método para poder delegar a un control constituyente de un UserControl, todas sus propiedades, métodos y eventos sin escribir practicamente código.

Por ejemplo, supongamos que hacemos un control que tiene un control Label. Para no tener que escribir todo el código del mismo para delegarle sus propiedades, métodos y eventos podemos hacer lo siguiente:

Declarar en el módulo del UserControl, una variable de tipo Label con WithEvents.

 

Public WithEvents UnLabel As Label

 

Luego en el Initialize del UserControl se asigna esa variable al control Label que está en el UserControl, en este caso al Label1

 

Private Sub UserControl_Initialize()
Set UnLabel = Label1
End Sub

 

De esta forma, desde el formulario una ves instanciado el ocx, se puede acceder a todas las propiedaes del control accediendo de esta forma:

 

UserControl11.UnLabel.Caption = "Hola"

 

Para poder hacer referencia a los eventos del Ocx, se puede declarar en el formulario, una variable local de tipo Label con WithEvents.

 

'variable de tipo Label con evento
Private WithEvents MiLabel As Label

 

Luego en el FormLoad:

 

'inicializa la variable
Set MiLabel = UserControl11.UnLabel

 

Ya de esta manera podemos acceder a los eventos.

 

'Evento delegado
Private Sub MiLabel_Click()
MsgBox "Se hizo Click", vbInformation
End Sub

 

En este enlace podés descargar este simple ejemplo: Descargar proyecto


3 - Establecer el evento predeterminado o default del control

Para poder indicarle a nuestro control cual es el evento que será el predeterminado al hacer doble clic sobre el mismo y que en la ventana de código de visual basic nos muestre dicho evento para el control, hay que indicarlo desde el menú Herramientas > Atributos del procedimiento.

En dicha ventana, hay un combo desplegable con la lista de eventos y propiedades. Se debe seleccionar el evento que deseamos que actúe como predeterminado, luego hacer clic en el botón " Avanzadas " marcando el checkbox " Valor predeterminado de interfaz de usuario "

 

vista de la ventana de atributos del procedimiento de los usarcontrol

 

 

4 - Crear propiedad con un Enum

Para poder crear una propiedad en el control , y que luego esa propiedad al accederla , nos permita desplegar una serie de valores, ya sea en tiempo de diseño desde la ventana de propiedades, como en la ventana de código de visual basic, se debe crear un Enum :

 

 

Código fuente del usercontrol

Option Explicit


' declaración del tipo enumerado para la propiedad "MiPropiedad"
Enum MiTipo
    Valor1 = 0
    Valor2 = 1
    Valor3 = 2
    Valor4 = 3
    Valor5 = 4
End Enum
'copia local de la propiedad
Private mMiPropiedad As MiTipo
'Valor por default de la misma
Private defMiPropiedad As MiTipo


Property Get MiPropiedad() As MiTipo
    MiPropiedad = mMiPropiedad
End Property

Property Let MiPropiedad(Nuevo_Valor As MiTipo)
    mMiPropiedad = Nuevo_Valor
    PropertyChanged "MiPropiedad"
End Property

 


< Ir a la página anterior

 

 


Buscar en Recursos vb