Este es un ejemplo de uso de clases que contienen array de otras clases.
Lo podéis usar, en problemas donde una lista contienen otra lista de objetos, y a su vez esa lista contienen otras listas.
Queremos generar el dibujo de una lista de polígonos. Esta lista de polígonos esta compuesta por polígonos que tienen una propiedad de color y una lista de vértices o coordenadas. Este número de vértices es aleatorio, pueden variar de 2 a 7. Y el color puede ser elegido por el usuario.
Podemos hacer el siguiente esquema:
Siguiendo este esquema podemos desarrollar las clases, con sus propiedades y métodos.
Clases Coordenada:
-->
'
Gambas class file
'un
vertice del poligono
Property
x0 As
Integer
Private
hx0 As
Integer
Property
y0 As
Integer
Private
hy0 As
Integer
Private
Function
x0_Read() As
Integer
Return
hx0
End
Private
Sub
x0_Write(Value As
Integer)
hx0 =
value
End
Private
Function
y0_Read() As
Integer
Return
hy0
End
Private
Sub
y0_Write(Value As
Integer)
hy0 =
value
End
Clase Poligono:
-->
'
Gambas class file
Property
colores As
Integer
Private
hcolores As
Integer
Property
puntos As
ClassCoordenada[]
Private
hpuntos As
New
ClassCoordenada[]
Private
Function
puntos_Read() As
ClassCoordenada[]
Return
hpuntos
End
Private
Sub
puntos_Write(Value As
ClassCoordenada[])
hpuntos
=
Value
End
Private
Function
colores_Read() As
Integer
Return
hcolores
End
Private
Sub
colores_Write(Value As
Integer)
hcolores
=
Value
End
Public
Sub
dibuja(area As
DrawingArea)
Dim
a As
Integer
Draw.Begin(area)
'dibujo
la linea con el color del poligono
Draw.Foreground
=
hcolores
For
a =
0
To
hpuntos.Max
-
1
Draw.Line(hpuntos[a].x0,
hpuntos[a].y0,
hpuntos[a +
1].x0,
hpuntos[a +
1].y0)
Next
Draw.Line(hpuntos[hpuntos.max
-
1].x0,
hpuntos[hpuntos.max
-
1].y0,
hpuntos[hpuntos.max].x0,
hpuntos[hpuntos.max].y0)
Draw.End
End
Clase Lista de Poligonos:
-->
'
Gambas class file
Property
pol As
ClassPoligono[]
Private
hpol As
New
ClassPoligono[]
Private
Function
pol_Read() As
ClassPoligono[]
Return
hpol
End
Private
Sub
pol_Write(Value As
ClassPoligono[])
hpol
=
value
End
Public
Sub
dibujo(area As
DrawingArea)
Dim
p As
ClassPoligono
'recorremos la lista...
For
Each
p In hpol
p.dibuja(area)
Next
End
Ahora vamos al formulario principal:
Y su código:
-->
'
Gambas class file
Public
poligonos As
New
ClassArrayPoligonos 'lista
de poligonos..
Public
Sub
_new()
End
Public
Sub
Form_Open()
Randomize
'generador
aleatorio iniciado...
Me.center
End
Public
Sub
ToggleButton1_Click()
Dialog.Color
=
ToggleButton1.background
If
Dialog.SelectColor()
Then
Return
ToggleButton1.background
=
Dialog.Color
End
Public
Sub
ButtonCrea_Click()
Dim
pol As
New
ClassPoligono
Dim
pto As
ClassCoordenada
Dim
a As
Integer
'creo
un poligono, el color lo elige el usuario, y con N puntos
aleatorias...
pol.colores
=
ToggleButton1.background
For
a =
0
To
Rnd(2,
8)
'
de 2 puntos a 7 puntos...
pto
=
New
ClassCoordenada
pto.x0
=
Int(Rnd(0,
DrawingArea1.w))
pto.y0
=
Int(Rnd(0,
DrawingArea1.h))
pol.puntos.Add(pto)
pto
=
Null
Next
'añado
el poligono creado al array de poligonos...
poligonos.pol.Add(pol)
ButtonRedibuja_Click()
End
Public
Sub
ButtonRedibuja_Click()
'dibujo
los poligonos...
poligonos.dibujo(DrawingArea1)
LabelNumero.text
=
poligonos.pol.Count
End
Public
Sub
ButtonOkBorrado_Click()
If
ValueBox1.value
<=
poligonos.pol.max
Then
poligonos.pol.Delete(ValueBox1.value)
If
poligonos.pol.count
=
0
Then
DrawingArea1.Background
=
&HFFFFFF&
Else
DrawingArea1.Clear()
Endif
ButtonRedibuja_Click()
ValueBox1.value
=
0
End
Video explicativo:
Código fuente del ejemplo: enlace
(realizado en gambas 3.3.90)
No hay comentarios:
Publicar un comentario