lunes, 17 de mayo de 2010

Timer - Temporizadores






















Esta sección describe con ejemplos básicos, el uso del control Timer de visual basic.

Contenido :
· Descripción del control y la propiedad Interval
· Ejemplo 1 - mostrar la hora en un control Label
· Ejemplo 2 - Propiedad Enabled del Timer
· Ejemplo 3 - Cambiar el Interval en tiempo de ejecución
· Ejemplo 4 - Crear una marquesina de texto
· Ejemplo 5 - Crear una marquesina de texto en forma vertical
· Ejemplo 6 - Animar una secuencia de archivos Gif en un Picturebox
· Nota sobre la propiedad interval

El control Timer es un temporizador que nos permite ejecutar instrucciones de código, rutinas, funciones etc..., cada cierto intervalo de tiempo.
Este control es invisible en tiempo de ejecución, esto quiere decir que no tiene interfaz gráfica, solo es visible cuando lo agregamos a un formulario y estamos en modo de diseño .
La propiedad mas importante de este control es la propiedad Interval

Definición del propiedad Interval:
Devuelve o establece el número de milisegundos entre dos llamadas al evento Timer de un control Timer.
en castellano, esto quiere decir que la propiedad es la que determina el intervalo en el que ejecutará las instrucciones que estén en el evento llamado Timer, que es el único evento que posee el control
Por ejemplo, si agregás un Timer al formulario y le haces DobleClick sobre el mismo, al abrirse la ventana de código Visual Basic creará una rutina de evento como la siguiente:


En ese procedimiento ( controlador de evento ) es donde debemos escribir las instrucciones que queremos que se ejecuten cada cierto intervalo de tiempo.
Antes de hacer un ejemplo, hay que aclarar que la propiedad Interval está expresada en milisegundos, esto quiere decir que por ejemplo si quisieramos ejecutar una instrucción cada 3 segundos por decir un ejemplo, la propiedad Interval debe estar en 3000, si quisiera ejecutarla cada 10 segundos en 10000 etc...
Otra cosa importante es que si la propiedad Interval se encuentra en 0, el procedimiento Timer no se producirá.

Ejemplo 1 - utilizando la propiedad Interval para mostrar la hora
Coloca un Timer llamado Timer1, seleccionalo, y desde la ventana de propiedades en la propiedad Interval coloca el valor 1000. O sea que el Timer1 se va a ejecutar cada 1 segundo.
Ahora coloca un control Label1 en el formulario y en la propiedad Autosize del control Label1 coloca True, esto hará que el control Label1 se ajuste al contenido del mismo. Lo que hará el ejemplo será mostrar la hora del sistema en el control de etiqueta
Entonces dale doble Click en el Timer1 para crear el procedimiento que se describió arriba que es el que ejecuta el Timer. y pega está instrucción

Label1.caption = Time

El código del procedimiento quedaría así:

Private Sub Timer1_Timer()Label1.Caption = TimeEnd Sub

Ahora ejecuta el programa y podés ver como se actualiza el Label1 de acuerdo a la hora del sistema, usando claro la función Time de visual basic que devuelve la hora del sistema operativo.
Otra propiedad importante y que se utiliza mucho en este control es la propiedad Enabled. La propiedad enabled lo que hace es habilitar o deshabilitar un control. Si está en True funciona, si está en False no funciona. Esta propiedad es común en la mayoría de los controles de visual basic.

Ejemplo 2 - para para ver el funcionamiento de la propiedad Enabled:
Coloca 2 controels CommandButton llamados cmdActivar y otro CmdDesactiva. También un control laabel llamado Label1 que mostrará igual que el ejemplo anterior la hora del pc usando la función Time de Visual basic, pero en este ejemplo lo que harán los botones es activar y desactivar el control Timer1, mediante la propiedad Enabled
Dale doble click en el CmdActivar, es decir en el CommandButtonm y coloca la siguiente instrucción para activar el Timer1
Timer1.Enabled = True

Ahora Doble click en el otro botón para escribir las instrucción para desactivar el Timer1 cuando hagamos click en el botón

Timer1.Enabled = False

Una cosa que es muy común es asignar la propiedad Interval en tiempo de ejecución, es decir, en ves de hacerlo desde el modo diseño desde la ventana de propiedades, se asignará el Interval en el evento Load del formulario. Esto quiere decir que, apenas cargue y arranque el formulario, el control Timer1 tendrá el Interval en 1000.
Ahora DobleClick en el Formulario para que se abra la ventana de código y Visual Basic te muestre el procedimiento del evento Load y coloca la siguiente línea:

Timer1.interval = 1000

De esta manera ya sabés que desde cualquier punto del programa, podés cambiar la propiedad interval para que el temporizador se ejecute de acuerdo a tus necesidades. Hay veces que esto no es necesario es decir se mantiene igual y constante y no es necesario cambiar el interval, pero otras (depende de lo que se quiera hacer) si lo es.

Ejemplo 3 - Cambiar el Interval en tiempo de ejecución
Este ejemplo no tiene ningún sentido práctico pero para practicar vale.
Coloca en el formulario una barra de Scroll horizontal llamada HScroll1. Seleccionala y en la ventana de propiedades busca la propiedad Max y Min. A Min dejale el valor por defecto que tiene, osea 0. A lapropiedad Max colocale 3000 . Luego coloca un control Label llamado Label1 y un Timer1. Al Label1 en la propiedad Caption agregale algún texto. El formulario tiene que ser algo por el estilo:


Lo que hace esto es, que al mover la barra de scroll, se le cambia el valor de la propiedad interval al Timer1. Osea cuando lo llevamos al mínimo está en 0 y cuando movemos el scroll hasta el máximo valor queda en 3000 (cada 3 segundos). El valor de la propiedad de la barra que es Value , se lo asignamos a la propiedad interval del timer. Dentro del Timer, hay una simple instrucción que lo que hace es lo siguiente: Si el control Label1 está visible, lo ponemos invisible, si está Invisible lo hacemos visible. Esto hace que el Label1 parpadee. Mientras menos sea el valor de la propiedad interval, mas rápido parpadeará el Label1, en cambio mientras mas alto sea el valor mas lento parpadeará el Label1.
Como dije esto no tiene ningún sentido, pero es para que veas como podés asignar a la propiedad interval, valores de otros controles, datos variables etc.... en tiempo de ejecución

Private Sub HScroll1_Change()'Mostramos en la barra de titulo del form el valor del SCrollBarMe.Caption = "Intervalo: " & HScroll1.Value & " milisegundos"'Le colocamos el Interval al Timer, el valor de la barra (su propiedad Value)Timer1.Interval = HScroll1.ValueEnd SubPrivate Sub HScroll1_Scroll()HScroll1_ChangeEnd SubPrivate Sub Timer1_Timer()'Esta instrucción lo que hace es que si el Label1 está visible lo pone invisible'Si está Invisible lo hace visible. Cambiando la propiedad Visible'mediante el operador Not de Visual basicLabel1.Visible = Not Label1.VisibleEnd Sub

Ejemplo 4 - Crear una marquesina de texto
el siguiente ejemplo, cra una marquesina de texto que se desplaza a lo ancho del formulario utilizando nu control Label y por supuesto un Timer.
Coloca un control Frame en el formulario llamado Contenedor. Dentro del contenedor, es decir del Frame, coloca un Label1. Por último un control Timer llamado Timer1.
Desde el modo de Diseño debe verse mas o menos asi:



Lo que está seleccionado, es el control Frame, el Label asegurate que esté dentro del Frame, de lo contrario no funcionará.
Colocar en la propiedad Interval del Timer el valor 1
Ahora el siguiente código en el formulario:

Private Sub Form_Load()
Label1.Caption = " Hola Mundo "
End Sub

Private Sub Timer1_Timer()

With Label1

' Se desplaza el Label hacia la izquierda

.Move .Left - 30

'Si finalizó, vuelve a comenzar desde la parte derecha

If .Left + .Width < left =" Contenedor.Left" name="ejemplo5">Ejemplo 5 - Crear una marquesina de texto vertical
Este ejemplo es identico al anterior, pero el control Label, que estará dentro de un control Frame, se desplazará desde abajo hacia arriba, haciendo un efecto de Scroll vertical
Coloca un Label1 dentro de un Frame llamado contenedor, como está en la siguiente imagen:


Lo que se ve en amarillo es el control Frame, lo que está en Azul es el Label.
Nota: Los colores anteriores, solo están de muestra para distinguirlos, es decir no cambir los colores de fondo, y dejarlo con el color por defecto. O si se quiere especificar un color, que sean iguales, es decir si el frame está en amarillo, el color de fondo del Label también en amarillo, por decir un ejemplo.
Por último colocar un Timer llamado Timer1, y en la propiedad Interval colocarle el valor 1

Código fuente en el formulario:

Private Sub Form_Load()


'Valores para el tamaño y posición del Label
Label1.Height = 2500
Label1.Width = 2385
Label1.Left = 240
Label1.Top = 240

'Valores para el ancho ya alto del control Frame
Contenedor.Width = 3000
Contenedor.Height = 2000

' Texto del Label
Label1 = "Esto es una linea" & vbNewLine _
& "Otras linea mas" & vbNewLine _
& "Otra mas" & vbNewLine & vbNewLine _
& "... y otra" & vbNewLine & vbNewLine _
& "... y otra" & vbNewLine

End Sub

Private Sub Timer_Timer()

With Label1

' Se desplaza hacia arriba

.Move .Left, .Top - 10

'Si finalizó, vuelve a comenzar desde abajo

If .Top + .Height < top =" Contenedor.Top" href="http://www.recursosvisualbasic.com.ar/htm/listado-api/149-scroll-de-texto.htm">como crear una marquesina o Scroll de texto utilizando el Api de windows por ejemplo para las pantallas de créditos o " ... Acerca de ".
Otro ejemplo que tiene tan solo cuatro lineas de código, de una marquesina vertical, usando un picturebox que se encuentra dentro de otro picture y se va corriendo la propiedad Top mediante el timer para realizar el desplazamiento


Descargar
Ejemplo 6 - Animar una secuencia de archivos Gif
Este ejemplo muestra como a partir de una secuencia de archivos cargados en unos controles PictureBox, mediante un Timer y la función PaintPicture, copiar cada cuadro y generar la animación:

Descargar ejemplo

7 - Nota sobre la propiedad interval
La propiedad interval acepta como máximo el valor 65535. Es decir que si queremos asignar un valor superior nos dará un error por que desborda
Por eso , si queremos configurar el timer, con valores superiores , por ejemplo hacer que el timer se ejecute cada 10 minutos por decir un caso , podriamos hacer algo por el estilo :
Este código, ejecuta el temporizador cada 5 minutos ( el valor de la constante INTERVALO_EN_MINUTOS )

Código en el form con un timer1
Option Explicit

' Cantidad de minutos para el intervalo del timer _
en este caso para 5 minutos
Const INTERVALO_EN_MINUTOS As Integer = 5

Private Sub Form_Load()
' Ejecuta el timer cada 1 segundo
Timer1.Interval = 1000
End Sub

Private Sub Timer1_Timer()
' variable estática para acumular la cantidad de segundos
Static Temp_Seg As Long
' incrementa
Temp_Seg = Temp_Seg + 1
' comprueba que los segundos no sea igual a la cantidad de minutos _
que queremos , en este caso 5 minutos
If (Temp_Seg * 60) >= (INTERVALO_EN_MINUTOS * 60) * 60 Then
' reestablece
Temp_Seg = 0
MsgBox "Se ejcutó el timer ", vbInformation
End If

End Sub

Para utilizar temporizadores en Visual Basic, no es la única forma mediante el control Timer, hay unas funciones del Api llamadas SetTimer y KillTimer que permiten crearlos sin utilizar el control estándar de Visual Basic.
En este enlace, Crear un Timer con el Api podés ver un ejemplo
También en este enlace podés descargar un módulo de clase para poder crear un timer con el api realizado por microsoft

Volver al índice

No hay comentarios:

Publicar un comentario