Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

domingo, 9 de septiembre de 2012

Observadores

 Los observadores son objetos que  permiten interceptar eventos generados por otros objetos. Ellos se "observan" a ellos mismos.

Puede interceptar eventos justo antes de que se han planteado, o justo después.

Para cada evento interceptado, el observador deberá generar un evento con el mismo nombre y los mismos argumentos.

Mediante el uso de stop event  en el interior de un controlador de eventos observador, se cancela el evento original.


Ejemplo:


PRIVATE $hButton as Button
 PRIVATE $hObserver AS Observer  
PUBLIC SUB Form_Load()
 $hButton = NEW Button(ME) AS "Button" 
$hObserver = NEW Observer(hButton) AS "Observer"  
END 
 PUBLIC SUB Observer_Click()
 DEBUG "En el obotn se ha echo click, a continuacion se cancela el evento!"  
STOP EVENT  
END  
PUBLIC SUB Button_Click()  
DEBUG "Esto nunca se verá"  
END


Para más información:
Clase observer
Gambasdoc_Observadores

Un ejemplo completo:
Vamos a añadir a un un valuebox, un control que nos sirve para introducir números, una nueva caracteristica: cambiar de color según el valor que tenga (positivo en azul, cero en amarillo y  negativo como rojo).

Para ello, creamos una nueva clase, (ClassValueBoxColor), que hereda de la clase ValueBox:


Inherits ValueBox

Luego definimos un observador:

Private $hObserver As Observer

Y un array para almacenar los colores:

Private colores As New Integer[3]

En el "constructor", vamos a crear el observador, y definimos los colores iniciales. Además damos el color Amarillo, cuando el valor que tengamos sea igual a 0

Public Sub _new()

$hObserver = New Observer(Me) As "Observer"
colores[0] = Color.Blue
colores[1] = Color.Yellow
colores[2] = Color.red

If Me.value = 0 Then Me.Background = colores[1]

End

¿que evento podemos usar para realizar el cambio de color?
He elegido el evento que se produce cuando se abandona el control, LostFocus()

Cuando se produzca el evento, según el valor que tenga el objeto (para indicarse a el mismo se usa Me),  cambia el color. El código es el siguiente:

Public Sub Observer_LostFocus()

If Me.value > 0 Then Me.Background = colores[0]
If Me.value = 0 Then Me.Background = colores[1]
If Me.value < 0 Then Me.Background = colores[2]

Me.Refresh

End

Para terminar la clase he añadido una subrutina que puede redefinir los colores.

Public Sub defineColor(Color_positivo As Integer, Color_igual As Integer, Color_negativo As Integer) '' 3 colores: 1º Color positivo, 2º cuando sea igual a cero, 3º cuando sea menor a cero

colores[0] = Color_positivo
colores[1] = Color_igual
colores[2] = Color_negativo

Observer_LostFocus()

End

Ya tenemos la clase terminada, ahora pasamos a usar la clase:
En un formulario, vamos a varios objetos de la clase ClassValueBoxColor, lo haremos mediante código y  para manejarlos, usamos un array de controles.

Private estado As Integer
Public valueBoxColor As ClassValueBoxColor
Public array_valueboxcolor As New ClassValueBoxColor[]


Cuando abramos el formulario, se creara el array de controles y se presentarán en la pantalla.

Public Sub Form_Open()

Dim a As Integer

Me.center
For a = 0 To 10
valueBoxColor = New ClassValueBoxColor(Me)
valueBoxColor.x = 10
valueBoxColor.y = 20 + a * 15
valueBoxColor.w = 80
valueBoxColor.h = 20
array_valueboxcolor.add(valueBoxColor)

Next

End

 Además se ha añadido un botón, para que podamos cambiar los colores definidos inicialmente, en la clase ClassValueBoxColor, usando el método .defineColor


Public Sub Button1_Click()

Dim a As Integer

For a = 0 To 10
 
If estado = 0 Then
array_valueboxcolor[a].defineColor(Color.cyan, Color.Green, Color.Gray)
Else
array_valueboxcolor[a].defineColor(Color.Blue, Color.Yellow, Color.red)
Endif

Next

If estado = 0 Then
estado = 1
Else
estado = 0
Endif

End


 El programa al ejecutarlo, y añadiendo valores quedaría así:



Ejemplo: ValueBox que cambia de color según el valor.

No hay comentarios:

Publicar un comentario

A falta de donativos... un poco de publicidad