Creando formulario para manipular
valores de propiedades de un objeto
Una de las cosas que siempre he querido programar es un formulario donde pudiera establecer los valores de las propiedades de un objeto "en tiempo de ejecución", como lo hace el ide de gambas3.
Pues hoy, me he creado el pequeño programa para hacerlo, solo para propiedades que sean cadenas de texto y numeros.
Os dejo aquí un video corto explicando como usarlo:
Código fuente:
'
Gambas class file
Private
incrementoX
As
Integer
Private
incrementoY
As
Integer
Property
objeto
As
Object
Private
hobjeto
As
Object
Public
Struct
ObjetoTipo
nombre
As
String
tipo
As
String
End
Struct
Private
activaListaPropiedadesDatas
As
Boolean
=
False
Private
ListaMostrar
As
String[]
Private
Function
objeto_Read()
As
Object
Return
hobjeto
End
Private
Sub
objeto_Write(Value
As
Object)
hobjeto
=
Value
End
Public
Sub
Form_Open()
Dim
propiedades
As
Collection
'creo
lista de propiedades y controles
LabelObjeto.text
=
"Objeto:
" &
Str(Me.objeto)
propiedades
=
listaPropiedades(Me.objeto)
CreaControles(propiedades)
Me.Border
=
False
End
'--------------------------------------
Public
Sub
listaPropiedades(obj
As
Object)
As
Collection
Dim
s
As
String
Dim
hlistaPropiedades
As
New
Collection
Dim
hclass
As
Class
=
Object.Class(obj)
Dim
Est_Prop
As
ObjetoTipo
For
Each
s
In
hclass.symbols
If
s
=
"Children"
Then
Continue
If
hclass[s].readOnly
Then
Continue
Est_Prop
=
New
ObjetoTipo
Est_Prop.nombre
=
Object.GetProperty(obj,
s)
Est_Prop.tipo
=
TypeOf(Object.GetProperty(obj,
s))
'tipo
integer, long, string
Select
Case
activaListaPropiedadesDatas
Case
True
If
ListaMostrar.Exist(s)
=
True
Then
hlistaPropiedades.add(Est_Prop,
s)
Endif
Case
False
hlistaPropiedades.add(Est_Prop,
s)
End
Select
Next
Return
hlistaPropiedades
End
Public
Sub
CreaControles(datos
As
Collection)
Dim
valor
As
ObjetoTipo
Dim
htmp
As
HBox
Dim
ltmp
As
Label
Dim
ttmp
As
TextBox
Dim
vtmp
As
ValueBox
Dim
checktmp
As
CheckBox
'lo
suyo seria ordenar por orden alfabetico las propiedades....."
htmp
=
New
HBox(VBox1)
htmp.h
=
20
htmp.w
=
VBox1.W
ltmp
=
New
Label(htmp)
ltmp.h
=
20
ltmp.Border
=
Border.Plain
ltmp.w
=
100
ltmp.text
=
"Propiedades"
ltmp.Font
=
Font["bold"]
ltmp.Alignment
=
Align.Center
ltmp
=
New
Label(htmp)
ltmp.h
=
20
ltmp.Border
=
Border.Plain
ltmp.w
=
VBox1.w
/
2
ltmp.text
=
"Valor"
ltmp.Font
=
Font["bold"]
ltmp.Alignment
=
Align.Center
ltmp.Expand
=
True
For
Each
valor
In
datos
htmp
=
New
HBox(VBox1)
htmp.h
=
20
htmp.w
=
VBox1.W
ltmp
=
New
Label(htmp)
ltmp.h
=
20
ltmp.w
=
100
ltmp.text
=
datos.Key
&
":"
ltmp.Tooltip
=
datos.Key
ltmp.Alignment
=
Align.Right
ltmp.Border
=
Border.Plain
Select
Case
valor.tipo
Case
gb.String
ttmp
=
New
TextBox(htmp)
As
"Observador"
ttmp.h
=
20
ttmp.w
=
VBox1.w
/
2
ttmp.text
=
valor.nombre
ttmp.Expand
=
True
ttmp.Tag
=
[datos.Key,
valor.tipo]
Case
gb.Integer,
gb.Long,
gb.Float
vtmp
=
New
ValueBox(htmp)
As
"Observador"
vtmp.h
=
20
vtmp.w
=
VBox1.w
/
2
vtmp.value
=
Val(valor.nombre)
vtmp.Expand
=
True
vtmp.Tag
=
[datos.Key,
valor.tipo]
Case
gb.Boolean
checktmp
=
New
CheckBox(htmp)
As
"Observador"
checktmp.h
=
20
checktmp.w
=
VBox1.w
/
2
Try
checktmp.value
=
Val(valor.nombre)
checktmp.Expand
=
True
checktmp.Tag
=
[datos.Key,
valor.tipo]
Default
'no
hago nada...
End
Select
Next
VBox1.h
=
(datos.count
+
1)
*
20
Me.h
=
VBox1.h
+
LabelObjeto.h
+
ButtonCerrar.h
End
Public
Sub
Observador_KeyPress()
If
Key.code
=
Key.enter
Or
Key.code
=
Key.return
Then
Object.SetProperty(Me.objeto,
Last.tag[0],
Last.text)
Endif
End
Public
Sub
Observador_lostFocus()
If
object.Class(Last).name
=
"ValueBox"
Then
Try
Object.SetProperty(Me.objeto,
Last.tag[0],
Last.value)
Return
Endif
Try
Object.SetProperty(Me.objeto,
Last.tag[0],
Last.text)
If
Error
Then
Message.Error("no
es válido el dato introducido")
Endif
End
Public
Sub
Convierte(obj
As
Object,
datos
As
Collection)
Dim
valor
As
Variant
For
Each
valor
In
datos
Try
Object.SetProperty(obj,
datos.key,
valor)
If
Error
Then
Print
"Error: no
es posible que se la esta asignando un tipo distinto al que tiene el
dato"
Endif
Next
End
Public
Sub
Form_Close()
Dim
s
As
String
Dim
hclass
As
Class
=
Object.Class(Me.objeto)
Debug
""
Debug
""
If
object.Class(Last).name
=
"Textbox"
Or
object.Class(Last).name
=
"ValueBox"
Then
Try
Object.SetProperty(Me.objeto,
Last.tag,
Last.text)
Endif
For
Each
s
In
hclass.symbols
If
s
=
"Children"
Then
Continue
If
hclass[s].readOnly
Then
Continue
Debug
Object.GetProperty(Me.objeto,
s),
s
Next
End
Public
Sub
ButtonCerrar_Click()
Me.Close()
End
Public
Sub
LabelObjeto_MouseMove()
Me.x
+=
Mouse.X
-
incrementoX
Me.Y
+=
Mouse.y
-
incrementoY
End
Public
Sub
LabelObjeto_MouseDown()
incrementoX
=
Mouse.X
incrementoY
=
Mouse.Y
End
Public
Sub
mostrar(o
As
Object,
Optional
lista
As
String[])
If
Not
IsNull(lista)
Then
activaListaPropiedadesDatas
=
True
ListaMostrar
=
lista
Endif
Me.objeto
=
o
Me.Show()
End
Nota: Version 0.0.4
Nueva version Admite llamar a cuadros de dialogos para elegir colores, fichero o directorios.
Ejemplo de uso:
prop.mostrar(t2, ["ruta|SelectDirectory", "nombre|OpenFile", "colorEtiqueta|colorbutton", "relleno"]) '
Descarga del código completo: alojado en google
Saludos