Este es un pequeño ejemplo de como usar clases contenidas en otras clases.
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)