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