Sección de tutoriales y manuales vb
1 - 2
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.
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
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:
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 :
Autor del ejemplo : Filipe Lage
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
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 "
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
Buscar en Recursos vb
Recursos visual basic - Buscar - Privacidad - Copyright © 2005 - 2009 - www.recursosvisualbasic.com.ar