Consultas, desarrollo de programas y petición de presupuestos:

viernes, 13 de febrero de 2015

Creando formulario para manipular valores de propiedades de un objeto

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

No hay comentarios:

Publicar un comentario