Buenas!
Estoy en Windows 11, LOo 5.5.3.2 (x86), Base con motor HSQLDB 2.3 dividido:
Formulario hecho en Base. Control de tablas. Columna como ComboBox desplegable (y creo que pasa lo mismo con el listbox y con las fechas también desplegables)
Se me ocurre poner una macro en el evento ‘Al perder el foco’, y la macro se ejecuta cuando recibe el foco, cuando se despliega y escoges el item del desplegable, y finalmente cuando abandonas el control.
Lo más probable es que no sepa aplicar las macros al evento, o que necesite un freno especial en este tipo de controles, pero me gusta pensar que es algo que no está bien en el sistema, ya que en las versiones más antiguas (no sé señalar una de ellas), en las que el control no cambiaba de tamaño al recibir el foco o al perderlo, solo se ejecutaba una vez.
Es como si en el cambio de forma (aumenta el tamaño como para indicarte que tienes el control seleccionado) abandona el control. Lo mismo pasaría después de seleccionar en el desplegable, y otra vez cuando realmente sales.
Es posible que sea un Bug o realmente es como debe funcionar?
En el segundo caso ¿tendría sentido que haya el evento ‘Al perder el foco’?
Gracias y un saludo!
Si tienes un ejemplo minimo donde se reproduzca el problema, lo miro… pero los eventos de “foco” (ganar y perder) no son fáciles de controlar y recomiendo usarlos solo si no hay una mejor alternativa.
Bueno…
Hice un ejemplillo, a ver si así me quedan las cosas mejor explicadas…
Aunque no incluí el control desplegable de fechas el comportamiento es el mismo.
Un saludo!
Base Perder foco.odb (15.4 KB)
En mi equipo de comporta correctamente.
Version: 7.5.7.1 (X86_64) / LibreOffice Community
Build ID: 50(Build:1)
CPU threads: 16; OS: Linux 6.5; UI render: default; VCL: gtk3
Locale: es-MX (en_US.UTF-8); UI: en-US
7.5.7-2
Calc: threaded
Exactamente, en ese combobox todo va bien, lo puse de contraejemplo con el combobox que está dentro del control de tabla, que en su cabecera tiene ‘COMBO BOX nombre’.
Pensé que lo dejé escrito y explicado en el propio formulario, pero quizá no me exprese con mucha claridad.
Son dos formularios en la misma pantalla, basados en tablas diferentes, aunque tienen los mismos campos. El control de tablas es el único control que tiene el primer formulario. Los otros controles son independientes del control de tablas, juntos forman un segundo formulario. No lo llamo subformulario porque no hay dependencia.
El problema surge en el control de tablas en la columna ‘COMBO BOX Nombre’, al desplegarlo e intentar seleccionar del desplegable.
Es cierto que no hay ninguna marca desplegable hasta que te pones en el campo en cuestión, pero por eso el nombre que le puse, para que se viese que es un COMBO BOX.
Un saludo y gracias por chequearlo!
Como dije, los eventos de foco no son fáciles. El problema que veo es que son realmente dos controles, el control de la tabla y el control “incrustado en la celda” de esa tabla.
Ahora, dependiendo de lo que “quieres hacer realmente”, se buscan otras alternativas.
Yo no discuto que no haya que buscar alternativas, de hecho es lo que estoy intentando, y seguro que lo estoy utilizando mal, o como mínimo de forma defectuosa. Simplemente pregunto si ese es un comportamiento lógico o es un bug.
Quisiera entender que el comportamiento debiera ser igual en el cuadro de tabla que cuando es un control independiente.
En tiempos (no recuerdo el número de versión), cuando no existía ese incrustamiento (o al menos no se veía graficamente un cambio en el control al recibir el foco) no ocurría.
En definitiva, no es un tema de mis necesidades concretas, sino que si el sistema se comporta como debe o si es una falla que en algún momento habría que reparar.
Si es una falla tampoco debe ser muy importante, ya que lleva tiempo ahí y no parece molestar a la gente.
Otro saludo y muchas gracias!
He cambiado el evento para probar desde Python, sin usar el MsgBox ya que afecta el comportamiento al perder el foco, y funciona como se espera:
form = event.Source.Model.Parent.Parent
index = form.findColumn('Nombre')
valor = form.getString(index)
app.debug(f'Nombre: {valor}')
Veo en mi terminal:
05/10/2023 10:32:14 - DEBUG - Nombre: Juan
05/10/2023 10:32:14 - DEBUG - Nombre: Juan
05/10/2023 10:32:18 - DEBUG - Nombre: Mérida
05/10/2023 10:32:18 - DEBUG - Nombre: Mérida
05/10/2023 10:32:22 - DEBUG - Nombre: Pedro
05/10/2023 10:32:22 - DEBUG - Nombre: Pedro
05/10/2023 10:32:24 - DEBUG - Nombre: Mérida
05/10/2023 10:32:24 - DEBUG - Nombre: Mérida
05/10/2023 10:32:28 - DEBUG - Nombre: Carmelo
05/10/2023 10:32:28 - DEBUG - Nombre: Carmelo
05/10/2023 10:33:00 - DEBUG - Nombre: Carmelo
05/10/2023 10:33:00 - DEBUG - Nombre: Carmelo
05/10/2023 10:33:07 - DEBUG - Nombre: María
05/10/2023 10:33:07 - DEBUG - Nombre: María
Pues si no hay ‘ná’ que hacer lo dejaremos correr, pero sigo pensando que o bien es un bug de la suite o es un bug mío
Otro saludo!
¡Hombre! siempre hay algo que hacer.
Si consideras que puede ser un bug (yo también lo creo así) lo que hay que hacer es reportarlo en Bugzilla Main Page (documentfoundation.org).
Creo que la parte más importante aquí es que proporciones un buen archivo de ejemplo (en mi opinión que solo contenga el control con comportamiento erróneo) y también una buena descripción paso a paso para reproducir el (posible) error, no importa si el inglés es muy correcto…
Hola.
Estaba intentando simplificar tu ejemplo para reportar el bug y resulta que parece que el bug no es exactamente como parece en un principio.
Me explico, al modificar el código para simplificarlo, resulta que el evento solo se ejecuta una vez al perder el foco, y no dos, como ocurría con tu código anterior. Es decir, puede que sea parte del código (de tu código) el que haga que se genere dos veces el evento.
Sin embargo, sí que es cierto que el evento “Al perder el foco” se ejecuta cuando el control obtiene el foco, y eso sí que es erróneo.
Añado la base de datos que me ha llevado a estas conclusiones, para que comprobéis si con otros SO u otras condiciones el resultado no es el que expongo.
TestLostFocus.odb (13,7 KB)
Version: 7.6.2.1 (X86_64) / LibreOffice Community
Build ID: 56f7684011345957bbf33a7ee678afaf4d2ba333
CPU threads: 16; OS: Windows 10.0 Build 22621; UI render: Skia/Raster; VCL: win
Locale: es-ES (es_ES); UI: es-ES
Calc: CL threaded Jumbo
Ya cierro el tema…
Jucasaca lo vió de otra manera diferente a mi, supongo que es cuestión de matiz, pero yo veía el mensaje al recibir el foco (que yo lo interpretaba como que para activarse el control incrustado (ese aumento de tamaño que se ve al seleccionar) era como que perdía el foco y luego lo recuperaba al colocarse en el control incrustado ya agrandado, lo cierto es que en un registro nuevo el mensaje vuelve a salir al desplegar una vez que has seleccionado un elemento, y por último otra vez más al salir del control para ir al siguiente (cuento tres en un registro nuevo)
Si intentamos cambiar el elemento seleccionado en un registro ya grabado pasa lo mismo, en la misma secuencia cuento tres.
Si solo pinchamos en el combobox de un registro ya grabado, y no seleccionamos nada, dando un intro o un tab para pasar al siguiente control solo cuento dos.
Gracias por los desvelos!
Version: 7.5.3.2 (x86) / LibreOffice Community
Build ID: 9f56dff12ba03b9acd7730a5a481eea045e468f3
CPU threads: 4; OS: Windows 10.0 Build 19045; UI render: Skia/Raster; VCL: win
Locale: es-ES (es_ES); UI: es-ES
Calc: CL threaded
Bueno, no es necesario cerrar el tema mientras tengamos algo que comentar…
Efectivamente, si seleccionas algo de la lista se producen tres pérdidas de foco:
- Una al entrar en el campo de lista (esto es un error)
- Otra si seleccionas algo en la lista (esto también es un error)
- Y una tercera cuando te vas a otro campo, bien sea con el ratón o con tabulador (esta es la única correcta, bajo mi punto de vista)
Aunque se puede contar como que el evento se produce tres veces, yo no lo reportaría así, sino diciendo que se produce el evento erróneamente con dos acciones (diferentes) en las que no se debería producir.
Ya me encargo yo de reportar el bug
Ya he reportado el bug: 157671 – Combo box in a Table control grid throws "When losing focus" event when receive focus, e incluso creo que he identificado el momento en que se introdujo el fallo