sábado, 25 de agosto de 2012

Control Timer


Algunas veces necesitamos en una parte de nuestra aplicación añadir un retardo.
Un evento cada cierto tiempo. Ya sea para la creación de un archivo. Comprobar
la existencia de este archivo,la ejecución de un proceso cada x segundos.

Este control tiene propiedades importantes como son:

  • Delay
  • Enabled

Delay es la cantidad de tiempo o el retardo que se produce cada x milisegundos
antes de ejecutar un grupo de instrucciones incluidas dentro del código del Timer.
El valor de la propiedad esta por defecto en 1000 mS, un segundo. :-)

¿ Como hacemos para activar nuestro Timer ?.

Lo podemos hacer de dos formas.

Timer.Enabled = True

Activa el Timer. O de una manera mas sencilla.

Timer.Start

Y nos ahorramos algo de código.
Para parar nuestro timer hacemos:

Timer.Enabled = false

Ó

Timer.Stop

Nuestro código se encuentra en el procedimiento del Timer tal que así:

PUBLIC SUB Timer1_Timer()


END

En el podemos añadir nuestro código o también llamadas a otros procedimientos.


A continuación os muestro varios ejemplos con este componente:



Imitación de una barra de progreso con el componente Label y Timer.



Public Sub Timer1_Timer()
   If lblBarra.Width < 335 Then
   lblBarra.Width = lblBarra.Width + 5 'Aumentamos el ancho de la barra en 5,10,20...
  Else
    Timer1.Stop 'Se para el Timer1
  Endif
End

Public Sub Form_Open()
   'Inicializamos los valores
   Me.Caption = "Simula barra de progreso"
   Me.Center
   'Podemos asignar estos valores en las propiedades de los componentes
  lblBarra.Width = 0
  lblBarra.Background = Color.Blue
  Timer1.Delay = 50
  Timer1.Start 'Iniciamos el Timer1
End

Un reloj:



Public Sub _new()

End

Public Sub Form_Open()
  Me.Caption = "RELOJ"
End

Public Sub Timer1_Timer()
  Dim tiempo As Date
  tiempo = Time
  lblreloj.Text = Format$(tiempo, "hh:nn:ss")

End

Public Sub cmdIniciar_Click()
  Timer1.Start
End

Public Sub cmdDetener_Click()
  Timer1.Stop
End

Un temporizador:


Private inicio As Date

Public Sub _new()

End

Public Sub Form_Open()
   Me.Caption = "TEMPORIZADOR"
End

Public Sub Timer1_Timer()
  Dim tiempo As Date
  tiempo = Time - inicio
  lbltempo.Text = Format$(tiempo, "hh:nn:ss")
End

Public Sub cmdIniciar_Click()
  inicio = Time
  Timer1.Start
End

Public Sub cmdDetener_Click()
  Timer1.Stop
End

Con pocas instrucciones hemos creados dos aplicaciones que pueden ser útiles.
Hemos visto la instrucción Format. Nos muestra en la etiqueta el contenido de la
variable tiempo con el formato horas,minutos,segundos con dos dígitos cada una.


Un ejemplo más:

' Gambas class file
PRIVATE estado AS Boolean
PRIVATE alerta AS Sound
PRIVATE canal1 AS Channel
'La aplicación usara la pantalla completa,usar Alt-Tabulador para cambiar
'entre aplicaciones y usar stop del editor.Esto hay que cambiarlo

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
'Ajustamos el tamaño del formulario
WITH ME
   .Width = Desktop.Width
   .Height = Desktop.Height
   .FullScreen = TRUE
END WITH
'Ajustamos propiedades de la etiqueta
WITH lbMensaje
   .Alignment = Align.Center
'Cambiar el divisor por un valor más grande si no entra todo el texto en vuestra pantalla.
'En este equipo uso 1680x1050
   .Font.Size = lbMensaje.Height / 1.2
   .Font.Bold = TRUE
END WITH
'Cambiamos o creamos las propiedades para el sonido
Channels.Count = 1
canal1 = Channels[0]
canal1.Volume = 0.4
alerta = NEW Sound["Alert.wav"]
Timer1.Start
END

PUBLIC SUB Timer1_Timer()
canal1.Play(alerta) 'Hacemos sonar el sonido que contiene la variable alerta
'Cada segundo cambia el contenido del texto de la etiqueta
IF estado = FALSE THEN
WITH lbMensaje
   .Background = Color.Yellow
   .Foreground = Color.Red
   .Text = "ALERTA"
END WITH
ELSE
lbMensaje.Text = "INTRUSO"
ENDIF
estado = NOT estado
END




martes, 24 de julio de 2012

Números aleatorios.Ejemplo 2

Aquí tenemos otro ejemplo con dados de poker. :-)



Con los números aleatorios podemos crear simulaciones.
Serán fundamentales en nuestras aplicaciones.


' Gambas class file

Private carasdadosalida As New Integer[]
Private odadopoker As PictureBox

Public Sub Form_Open()
    Me.Center()
    Me.Caption = "DADOS DE POKER"
End


Public Function mostrardados() As Integer
   Dim contador As Integer
   Dim cara As Integer
  
   For contador = 1 To 6
      cara = Int(Rnd(7, 13))
     odadopoker.Picture = Picture[cara & ".gif"] 'Para que veamos una repetición de las caras
      Wait 0.1
  Next
  carasdadosalida.Add(cara) 'Añadimos la ultima cara que ha salido al array
  Return cara
End


Public Sub tobDados_Click()
   Dim objeto As Object
   Dim x As Integer
   Dim coincidencias As Integer
   Dim temporal As New Integer[]
  
   LblSalida.Caption = "" 'Limpiamos la etiqueta que nos dice la jugada que se ha hecho
   For Each objeto In HBox2.Children
       If objeto Is PictureBox Then
          objeto.delete 'Borramos todos los objetos si hubiera algunos. Para limpiar el contenedor
       Endif
   Next
   carasdadosalida.Clear 'Limpiamos el array que contendrá los valores de los dados en este array
    creadadospoker() 'Creamos 5 dados
  carasdadosalida.Sort 'Clasificamos el array donde están los valores de los dados para identificar mejor la jugada
   Do While x <= carasdadosalida.Count - 2 'Mientras x sea menor que el número de dados en el array
      If carasdadosalida[x] = carasdadosalida[x + 1] Then 
'Si el primero coincide con el segundo,el segundo con el tercero....etc.
'Siempre sin salirnos del numero máximo de elementos del array carasdadosalida
      temporal.Add(carasdadosalida[x + 1]) 'Añadimos al array temporal la cara del dado que se repite
       coincidencias = coincidencias + 1 'Aumentamos el número de coincidencias
     Endif
     x += 1
    Loop
'Según el número de coincidencias que existan,decimos la jugada que se ha hecho
    If coincidencias = 1 Then LblSalida.Caption = "Pareja" 'Una sola coincidencia
    If coincidencias = 2 Then
        If temporal[0] = temporal[1] Then 'Dos coincidencias
            LblSalida.Caption = "Trio" 'Ejemplo 777XX
       Else
            LblSalida.Caption = "Doble Pareja" 'Ejemplo 7788X
       Endif
    Endif
    If coincidencias = 3 Then
       If (temporal[0] = temporal[1]) And (temporal[0] = temporal[2]) Then 'Ejemplo 8888X
           LblSalida.Caption = "Poker!"
      Else
            LblSalida.Caption = "Full" 'Ejemplo 88899
      Endif
   Endif
   If coincidencias = 4 Then
       LblSalida.Caption = "Repoker!!" 'Si hay 5 números iguales
   Endif
End


Public Sub creadadospoker() 'Para crear los 5 dados con su imagen
   Dim contador As Integer
   For contador = 1 To 5
          odadopoker = New PictureBox(HBox2)
          With odadopoker
               .Width = 64
               .Height = 64
               .Stretch = True
               .Picture = Picture[mostrardados() & ".gif"]
         End With
   Next
End

Podéis bajar el código aquí:

lunes, 23 de julio de 2012

Números aleatorios


Dependiendo de nuestra aplicación usaremos los números aleatorios.
Números al azar, para los juegos, para una aplicación de calculo,estadística

Los llamamos números aleatorios, pero no existen como tales en Gambas,
el nombre mas adecuado es pseudo-aleatorio. Llega un momento que
se pueden repetir, entonces dejan de ser tan aleatorios.

Tenemos dos funciones principales para el manejo de estos números.

  • Randomize
  • Rnd

Randomize:

Randomize inicia el generador de números pseudo-aleatorios.
Podemos darles un número a esta función.

Randomize Numero Entero

Con lo que generación de los números siempre serian iguales. Se repetirían
O dejarlo sin el valor, lo que lo hace diferente en cada generación.

Randomize

Solemos usar la función Randomize solamente una vez en la aplicación.
Al inicio en Form_Open() por ejemplo.

Rnd:

De por si sola, la función nos devuelve un número decimal 0 y 1.

Ejemplo:

---código---
Public Sub Form_Open()
   Dim x As Integer

   Randomize
  'Generar 5 números decimales entre 0 y 1
   For x = 1 To 5
       Print Rnd
   Next
End
---código---

Si nosotros hubiésemos asignado el resultado de la función RND a un número entero.
Estaríamos diciendo que la salida va ser del tipo entero. Estamos creando
unas propiedades para la variable de salida y lo más normal que su
valor hubiera sido siempre 0.Al decir que el tipo es entero.

Ahora bien, la función RND permite la generación de un número dentro de un intervalo.

RND(mínimo,máximo)

Cuando decimos

---código---

PRINT RND(1,10) 'Entre 1 y 9

--código---

Le decimos realmente que el número generado es entre 1 y 9. Así que si queremos
que el número generado este realmente entre 1 y 10 debemos usar

---código---

PRINT RND(1,11) 'Entre 1 y 10

--código---

Para la generación de números enteros debemos hacer uso de la función INT.
Comprobar la diferencia a no usar la función INT a usarla.

---código---

PRINT RND(1,11) 'Número decimal

PRINT INT (RND(1,11)) 'Número entero

---código---

El caso más típico de la generación de un dado de 6 caras.

---código---
Public Sub Form_Open()
   Dim x As Integer
 
   Randomize
   For x = 1 To 6
      Print Int(Rnd(1, 7))
   Next
End
---código---

Ejemplo de la tirada de un dado con imágenes



---código---
' Gambas class file

Private dado As PictureBox 'Definimos un objeto del tipo PictureBox

Public Sub _new()
End

Public Sub Form_Open()
   Me.Title = "DADO"
   Me.Center
End

Public Sub BtnDado_Click()

dado = New PictureBox(Me) 'Creamos el objeto picturebox que contendrá la imagen del dado

'Damos propiedades al objeto dado
With dado
   .x = 56
   .y = 24
   .Height = 64
   .Width = 64
   .Stretch = True
   .Border = Border.Sunken
   .Picture = Picture[muestradados() & ".gif"]
End With
End

Public Function muestradados() As Integer

Dim i As Integer
Dim cara As Integer
'Estamos generando 6 veces el dado. Para que el dado cambie su imagen
'Si este número se repite no percibimos el cambio de cara
   For i = 1 To 6
      cara = Int(Rnd(0, 6))
      dado.Picture = Picture[cara & ".gif"]
      Wait 0.3 'Añadimos un retardo para percibir ese cambio de cara del dado
  Next
  Return cara

End
---código---


Mas información en: