[RESUELTO]Repintar Formulario mediante Macro OOBasic en Calc

Discute sobre la aplicación de hojas de cálculo
Responder
BarryBlackOO
Mensajes: 5
Registrado: Mar Oct 15, 2019 7:37 pm

[RESUELTO]Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por BarryBlackOO »

Hola, estoy intentando hacer un formulario que lee datos de una hoja de calc y los muestra en dicho formulario.

Los datos se muestran en el formulario mediante 'Labels' o etiquetas que se actualizan cuando pulsas un botón con el contenido de las celdas de la hoja.

El problema es que cuando quiero cambiar la propiedad 'Label' para mostrar otro texto en el formulario, no se refresca, en cambio los datos si que los carga bien.

Si volvemos a ejecutar el formulario, se ven los nuevos datos, pero duplica la ventana del formulario, tampoco he conseguido que me cierre la ventana usando .EndExec ni de ninguna forma.

En resumen ¿Cómo se puede refrescar la propiedad Label de una etiqueta en un formulario usando ooBasic?

Adjunto código y diseño del formulario y la tabla:

Código: Seleccionar todo

REM  *****  BASIC  *****
Option Explicit
   Dim oDialogo As Object
   
   
Sub Main
	'Cargamos el formulario inicialmente desde la hoja pulsando un botón al que le hemos asignado este código
	 DialogLibraries.LoadLibrary("Standard")
  oDialogo=CreateUNODialog(DialogLibraries.Standard.Dialog1)
  oDialogo.Execute()  
  oDialogo.Dispose
  
End Sub


' -------------------------------------------------------------------


Sub CargarPregunta

 DialogLibraries.LoadLibrary("Standard")
  oDialogo=CreateUNODialog(DialogLibraries.Standard.Dialog1)
  
  
Dim fila_dato As Integer, numpreguntas_dato As Integer, numaciertos_dato As Integer, numFallos_dato As Integer, nota_dato As Double
Dim preguntaDTA As String, respuestaaDTA As String, respuestabDTA As String, respuestacDTA As String, respuestadDTA As String

' Recuperar los datos de las estadísticas y la posición de la fila
fila_dato =  ThisComponent.Sheets(0).GetCellByPosition(0,0).Value
numpreguntas_dato =  ThisComponent.Sheets(0).GetCellByPosition(1,0).Value
numaciertos_dato =  ThisComponent.Sheets(0).GetCellByPosition(2,0).Value
numFallos_dato =  ThisComponent.Sheets(0).GetCellByPosition(3,0).Value
nota_dato =  ThisComponent.Sheets(0).GetCellByPosition(4,0).Value

' Recuperar los datos y Mostrar la pregunta
preguntaDTA =  ThisComponent.Sheets(0).GetCellByPosition(0,fila_dato).String
respuestaaDTA = ThisComponent.Sheets(0).GetCellByPosition(1,fila_dato).String
respuestabDTA = ThisComponent.Sheets(0).GetCellByPosition(2,fila_dato).String
respuestacDTA = ThisComponent.Sheets(0).GetCellByPosition(3,fila_dato).String
respuestadDTA = ThisComponent.Sheets(0).GetCellByPosition(4,fila_dato).String

With oDialogo.Model

	.pregunta.BackgroundColor(&HFF0000)

	.pregunta.Label = preguntaDTA
	.respuestaa.Label = respuestaaDTA
	.respuestab.Label = respuestabDTA
	.respuestac.Label = respuestacDTA
	.respuestad.Label = respuestadDTA
	
	.numpreguntas.Label = numpreguntas_dato

End With

End Sub


' -------------------------------------------------------------------

Sub Aceptar

' El botón aceptar aún no está programado, esto son pruebas para ver si se repinta el formulario

 DialogLibraries.LoadLibrary("Standard")
  oDialogo=CreateUNODialog(DialogLibraries.Standard.Dialog1)
  
  
  oDialogo.Model.pregunta.Label
  oDialogo.Model.pregunta.Label = "Pregunta!!!!!"
  oDialogo.EndExecute()   ' No funciona!! no cierra el formulario
  oDialogo.Execute()   ' Vuelve a ejecutar el formulario y aparece otra ventana, ahora sí con los nuevos datos

End Sub
Así estan los datos en la tabla
Así estan los datos en la tabla
Diseño del formulario
Diseño del formulario
Última edición por PepeOooSevilla el Jue Oct 17, 2019 7:32 pm, editado 1 vez en total.
Razón: Marcar [RESUELTO] correctamente
OpenOffice 4.1.7 - Windows 10
Avatar de Usuario
PepeOooSevilla
Mensajes: 1480
Registrado: Sab Abr 04, 2009 6:10 pm
Ubicación: Sevilla (España)

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por PepeOooSevilla »

Hola.
Te damos la bienvenida al Foro y, por favor, no dejes de leer la Guía de supervivencia.
Por favor, ¿podrías subir un archivo Calc en lugar de unas imágenes? De esta forma no obligas a quien pueda ayudarte a comenzar de cero.
Si no sabes cómo subir un archivo, consulta Cómo adjuntar un archivo.
Saludos cordiales.
LibreOffice 6.4.6. Windows 10. Java 8 rev. 261 (64 bits)
Por favor, utiliza el Foro para tus consultas, no los mensajes privados
Si usas OpenOffice/LibreOffice trabaja y guarda en ODT, ODS, ODP, ... Y haz copias de seguridad.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por mauricio »

Lo que muestras son cuadros de diálogo, no formularios, y hay mucha documentación al respecto: https://wiki.openoffice.org/wiki/ES/Man ... rosDialogo

Casi la inicio de tu código, cierras correctamente el cuadro de dialogo, solo usa lo mismo donde te marca el error en endExecute, ese método no existe.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
BarryBlackOO
Mensajes: 5
Registrado: Mar Oct 15, 2019 7:37 pm

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por BarryBlackOO »

Hola, muchas gracias por vuestras respuestas. Adjunto archivo 'ods' de calc para que podáis ver lo que comento.
Me expresé mal, es cierto, son cuadros de diálogo.
Probando, he cambiado los "Labels" por ''TextField" por si al estar pensadas las etiquetas para ser un texto fijo, por alguna razón, no fuera posible cambiar el texto de forma dinámica, pero tampoco funciona con los campos de texto.
Tampoco me permite cambiar el 'BackgroundColor' ni otras propiedades de los componentes del cuadro de diálogo, pasa igual.
¿Hay algún tipo de 'Commit', 'Refresh' o 'Update' o similar?

He buscado en el foro y en el wiki de OpenOffice, pero no logro encontrar nada sobre esto :(
En la documentación que amablemente indicaba Mauricio, vienen ejemplos, pero hacen los cambios en las propiedades y luego llaman al método 'execute', por lo que se muestra el diálogo tal cual con los cambios que quieras.
Lo que yo trato de hacer es cambiar las propiedades con el diálogo en pantalla y actualizarlo respondiendo a los botones que pulse el usuario.
También he probado en Linux Fedora y LibreOffice con los mismos resultados.

Gracias por adelantado!!
Dialogo.ods
Archivo de calc con macro y cuadro de diálogo.
(16.22 KiB) Descargado 105 veces
OpenOffice 4.1.7 - Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por mauricio »

Estas intentando acceder a los controles de forma incorrecta, todo esta documentado en la página que te mande: https://wiki.openoffice.org/wiki/ES/Man ... rosDialogo

https://wiki.openoffice.org/wiki/ES/Man ... 28Label.29
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
BarryBlackOO
Mensajes: 5
Registrado: Mar Oct 15, 2019 7:37 pm

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por BarryBlackOO »

Hola Mauricio, no veo que está incorrecto, accedo a los componentes sin problema, he mirado tu enlace y creo que está correcto tal como viene en la documentación.

El problema es otro, la única manera que consigo que cambien los textos y propiedades de cualquier componente es ejecutando de nuevo el diálogo, con lo que se duplica la ventana.

Si como dices hay algo mal, por favor, dime cómo debo hacerlo.

Gracias!!!!!
OpenOffice 4.1.7 - Windows 10
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por mauricio »

EL problema es que no hace lo que quieres, por que no accedes de forma correcta, por favor mira la documentación e intentalo como dice en la misma:

Código: Seleccionar todo

oControl = oDialogo.getControl("lblTitulo")
oControl.Label = "Otra cosa"    
Esto no lo tienes en tu código.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
BarryBlackOO
Mensajes: 5
Registrado: Mar Oct 15, 2019 7:37 pm

Re: Repintar Formulario mediante Macro OOBasic en Calc

Mensaje por BarryBlackOO »

Buenas, también lo probé, como te digo me he leído detenidamente la documentación y creo que no hay problema en acceder a los componentes.

Adjunto de nuevo el archivo, en el que si lo abres verás que si que utilizo el código que indicas, pero hace exactamente lo mismo. (en cada botón está de una manera diferente a modo de ejemplo)

Al pulsar los botones, comprobarás que se ven los cambios, pero abre una nueva ventana, duplicando el diálogo (porque ejecuta todo de nuevo, sin hacer esto no se actualiza).

Enfín, se agradecen los comentarios, pero veo que va a ser difícil conseguir lo que quiero de esta manera :crazy: , llevo tres días para hacer una cosa que debería ser muy sencilla...

Saludos,

Juan L
Dialogo.ods
Archivo con actualizaciones según documentación indicada por el amigo Mauricio
(16.73 KiB) Descargado 112 veces
OpenOffice 4.1.7 - Windows 10
BarryBlackOO
Mensajes: 5
Registrado: Mar Oct 15, 2019 7:37 pm

Re: Repintar Dialog con Macro OOBasic en Calc

Mensaje por BarryBlackOO »

Acabo de encontrar la solución... El problema es que hay que declarar los objetos del diálogo (Etiquetas, TextField, Botones, etcl) de manera Global, para que exista este único objeto en memoria. (Con la palabra clave Global)
En este link está la información completa: https://wiki.openoffice.org/wiki/ES/Man ... oVariables
Después se cargan inicialmente y se utilizan en todas las subrutinas, accediendo a dichos objetos y sus propiedades.
Así cuando hay un cambio en las propiedades, se actualiza dinámicamente y podemos ver el resultado sin necesidad de llamar al 'execute' cada vez.
Adjunto archivo de ejemplo funcionando de la manera que explico.
Mi idea era hacer una especie de 'test' que compruebe las respuestas correctas y guardar todos los datos en una hoja de calc.
Solucionado este problema voy a continuar programando el resto del código.
Adjunto archivo estructurado como acabo de explicar.

Espero que le sirva a alguien,

:D

Saludos!!

Juan L.
Dialogo.ods
Archivo de ejemplo solucionado!!
(14.42 KiB) Descargado 121 veces
OpenOffice 4.1.7 - Windows 10
Responder