Crear datawindows en tiempo de ejecución

Tengo una ventana en la cual muestro el estado de unas máquinas (apagada/encendida) a través de consultas a la BD. Para mostrar el estado, utilizo un datawindow. En cada dw muestro el estado de una única maquina. El problema es que el número de máquinas es variable y por lo tanto, en esta ventana tengo que crear tantos datawindows como maquinas tenga. El código que he creado es este, que se ejecuta en el evento Open:
(...)
OPEN cur_pesadoras;
FETCH cur_pesadoras INTO :li_pesadoraid;
do while sqlca.sqlcode=0
ldw_tmp=create u_dw
ldw_tmp.visible=true
ldw_tmp.x=50+(680*li_i)
ldw_tmp.y=84
ldw_tmp.width=660
ldw_tmp.height=300
ldw_tmp.taborder=100+li_i
ldw_tmp.dataobject="dw_estado"
ldw_tmp.settransobject(sqlca)
ldw_tmp.retrieve(li_pesadoraid)
idw_pesadoras[li_i]=ldw_tmp
li_i++
FETCH cur_pesadoras INTO :li_pesadoraid;
loop
CLOSE cur_pesadoras;
(...)
Tengo dos problemas: el primero, la llamada a settransobject me devuelve siempre -1; y por otra parte al hacer la asignación al array de dw:
idw_pesadoras[li_i]=ldw_tmp
siempre me salta el error de Array Boundary Exceded, aunque li_i=0.
Respuesta
1
1. antes que el transobject fijate que te devuelve el ldw_tmp.dataobject="dw_estado" capaza que no encuentra el dataobject.
2. Asegurate que sqlca este conectado (cosa que debería ya que lo usas con el cursor)
3. Los arrays en pb empiezan en 1, así que pone li_i = 1 antes de entrar en el loop.
(Al array decláralo sin limite)
Hola otra vez
He probado creando datastores en vez de datawindows y así funciona bien por lo que el dataobject esta bien puesto. SQLCA esta conectado y lo del array, un pequeño fallo mio :)
settransobject de los datawindow sigue dando -1. Me he fijado que ade+, ni siquiera sale en pantalla lo que es el marco del control. Si tu creas un dw en diseño pero no le asignas ni dataobject ni nada, al ejecutar al menos ves el borde del objeto en la ventana. Con los que creo yo no pasa esto... ¿puede ser alguna pista? ¿O alguna otra idea?
Lo que me parece que esta pasando es esto:
Las dw son objetos visuales y no podes crearlos e intentar usarlos como vos propones.
Por eso con los datastore te anda y con los dw no.
La ventana tiene un arreglo llamado control que contiene todos los objetos que se muestran (si exportas la ventana y ves la sintaxis lo vas a ver). Podrías tratar de agregar las dw a este control pero no lo recomiendan en pb.
Si el numero es variable pero limitado tal vez podrías tener todas las dw creadas e ir haciéndolas visibles en vez de crearlas.
¿No hay una forma de mostrar eso en campos de una dw en vez de dws?
Ya lo arregle! He estado investigando durante mucho rato, pero al final ha válido la pena. La clave esta en no usar create. PowerBuilder tiene un método en las ventanas que se llama OpenUserObject que sirve para crear instancias de objetos visuales, así utilizando esta orden y guardándolos en el vector, puedo crear dw y otros objetos visuales en tiempo de ejecución sin ninguna complicación o problema.
Muchas gracias de todas formas por tu tiempo! Hasta otra!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas