29 septiembre 2006

Crear objetos de Forma dinámica en un UserObject

Este post se origina con la respuesta que he dado en un foro de Sybase a este tema. Me parece interesante dejarlo aquí para que no se quede en el tintero, luego es muy difícil localizar temas antiguos en los foros.

La problemática surge de que en PB no se puede añadir un objeto, creado de modo dinámico, sobre un objeto de usuario visual. Sin embargo esto si se puede hacer sobre una ventana, así que utilizaremos esta opción para lograr lo que PB no nos permite hacer directamente.

Como se puede resolver... pues muy sencillo, hacemos el CREATE del objeto que queremos poner dinámicamente, le asignamos false a la propiedad visible y utilizamos la función OpenUserObject para pegarlo sobre la propia ventana donde se encuentra nuestro objeto visual, como el objeto esta invisible no se ve, después cambiamos mediante una función de API el padre del objeto creado dinámicamente y le asignamos como nuevo padre nuestro objeto visual y para terminar y antes de cambiar el atributo de visible, asignamos las propiedades que queremos al objeto en cuestión... Así se pierde mucho uno, por lo que lo mostraré con código. Reutilizaré el del post con las modificaciones necesarias para que funcione correctamente. Para poneros en antecedentes se trata de un objeto visual de usuario que se utilizará de barra de herramientas:

VARIABLES DE INSTANCIA DEL UO_BARRA_BOTONES:



DECLARACIÓN DE FUNCIÓN EXTERNA:



CONSTRUCTOR DEL UO_BARRA_BOTONES:



MÉTODO ADD:



Espero que os sirva a todos.

3 comentarios:

Anónimo dijo...

Mejoras respecto a pegar los botones de forma dinámica

1) Crear un objeto del tipo PictureButton y lo guardamos como uo_boton.

2) Crear una variable de instancia en este botón llamado ULong iul_Handle

3) Crear un método SetHandle(uLong aul_Handle)
iul_Handle = aul_Handle

4) Evento Clicked del botón.
Send(iul_Handle, 1024, Handle(this), 0)

------------
En el objeto UO_BARRA_BOTONES añadimos el evento ue_pulsado con el EventID pbm_custom01

Integer li_For, li_Ret, li_Total
Long lHandle

// Buscamos quien tiene el Handle

li_Total = UpperBound(iHandle)
For li_For = 1 TO li_Total
if wparam = iHandle[li_for] then
Messagebox("Pulsado", "Ha pulsado el botón con el ID = " + String(iIndex[li_for]) )
Return 1
Exit
End if
Next

Return 0

De esta forma, podemos condificar lo que necesitemos según el ID del botón que hemos añadido.

Francisco López
Keyhelp, S.L.

Michel Pérez dijo...

Efectivamente todo esto tenía una pega y consistía en manejar los eventos del objeto pegado y poder llamar a eventos ubicados en el "Padre" (Ya que utilizando el método descrito se pierde la referencia a él).

Mientras Francisco encontraba su solución yo dí con otra semejante pero distinta en parte:

1) También implemente un objeto de tipo PictureButton.

2) En él puse una variable de instancia donde almacenaría el objeto padre.

3) En lugar de openUserObject, utilizaba la opción con argumento (openUserObjectWithParm), pasando aquí el objeto padre.

4) El botón recogía el objeto padre en el constructor desde la estructura message y pasándolo a la variable de Instancia.

5) Codificaba el evento clicked del objeto PictureButton para que llamara a la función deseada del objeto padre (el de la variable del objeto de instancia del botón) pasando como argumento de dicha función la información del tag o el handle del botón.

Ambas opciones son adecuadas. Si queréis pasar más argumentos que el propio handle del botón se limitan las posibilidades.

Gracias por tu colaboración Francisco... es la primera y no estaría de más recibir otras...
Tal vez habría que celebrarlo con unas birras...

Nelson dijo...

Nice post about PowerBuilder programming services. And most of important points are discuss in this post. thanks for sharing all information about Powerbuilder.