Creando formulario para manipular
valores de propiedades de un objeto
Una de las cosas que siempre he querido programar es unformulario donde pudiera establecer los valores de laspropiedades 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
No hay comentarios:
Publicar un comentario