[RESUELTO] Foco en cursor

Discute sobre las herramientas de la base de datos
Responder
Avatar de Usuario
JoseJuan
Mensajes: 34
Registrado: Mié Abr 04, 2018 10:41 pm
Ubicación: Valencia (España)

[RESUELTO] Foco en cursor

Mensaje por JoseJuan »

Hola a todos,
Tengo un formulario con muchos controles, algunos de ellos se recalculan en función de los datos que introduzco.
Estos cálculos se realizan desde el evento "Despues de Actualizar", que se activa cuando cambio el cursor a otro campo.
Depués de realizar los cálculos no me permite introducir datos en el campo donde tengo el cursor, me ignora las pulsaciones de teclado.
Para solucionarlo tengo que hacer un segundo click en ese campo o cambiar la vista a otro form abierto previamente y volver.

Entre otras cosas he probado con SetFocus, pero no funciona.

Código: Seleccionar todo

...
    CtlDatTmp = FormDat.GetByName(NomFoco)
    CtlObjTmp = FormDocTmp.Component.getCurrentController().getControl(CtlDatTmp)
    CtlObjTmp.SetFocus()
Alguna idea para poder escribir despues de cambiar el cursor a otro campo?
Gracias.

Saludos.
Última edición por JoseJuan el Lun Dic 28, 2020 1:43 pm, editado 1 vez en total.
libreoffice 5.3.7.2 (x64) en Windows 7 / Libreoffice 6.4.2.2 en Windows 10
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Foco en cursor

Mensaje por RMG »

Hola,

Con la macro, además de actualizar guardas el registro?. Mira si van por ahí los tiros, falta información para ver mejor el problema.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Foco en cursor

Mensaje por Longi »

Buenas!
RMG es rápido como él solo!
Te iba a comentar si la macro recalculaba los campos, y en ese caso después hay que guardarlos, lo cual sería algo como 'Form.UpdateRow' (o algo así), pero supongo que eso ya lo tienes intentado.
Yo en ocasiones arreglé cosas similares con un Wait XXXX (para todo X= milisegundos), ya que no le da tiempo a hacer los cálculos,guardarlos, ponerse en el sitio que se le manda y trabajar tan fresco.
En otras ocasiones ( y esto ya es chapuza total), para evitar un reload de todo el formulario le doy a 'Form.previous' y después a 'Form.next', es decir voy al registro anterior y vuelvo, con lo que hago un refresco de la línea que acabamos de rellenar. Esto no sería válido para el primer registro que se graba en un formulario. Lo utilizo cuando el UpdateRow no me funciona ( que no suelo saber el porqué).
En fin, Batallitas....!

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
JoseJuan
Mensajes: 34
Registrado: Mié Abr 04, 2018 10:41 pm
Ubicación: Valencia (España)

Re: Foco en cursor

Mensaje por JoseJuan »

Hola,
Gracias por las respuestas.
No crei necesario guardar el registro porque todavia no he acabado de introducir datos en él. Lo probaré.
En alguna de las pruebas intenté con DoEvents y con Wait, pero no funcionaron.
Que información necsitas RMG?
Puedo añadir que an alguna ocasión excepcional funciona correctamente, a pesar de repetir siempre la misma secuencia de pulsaciones.
En realidad no se trata de una sola macro, sino varias que se encadenan y que son usadas también en otros procesos.
Es como si los diferentes objetos que componen el form perdieran su sicronización.
Saludos.
libreoffice 5.3.7.2 (x64) en Windows 7 / Libreoffice 6.4.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Foco en cursor

Mensaje por Longi »

Buenas!

Supongo que RMG se refiere a que se ven mejor las cosas con un ejemplo sin datos comprometedores (aunque no es garantía ninguna ). Si no es como dar palos de ciego.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Avatar de Usuario
JoseJuan
Mensajes: 34
Registrado: Mié Abr 04, 2018 10:41 pm
Ubicación: Valencia (España)

Re: Foco en cursor

Mensaje por JoseJuan »

Buenas.
Intentaré crear una versión resumida del problema, que además me servirá para comprobar el todo el proceso.
Saludos.
libreoffice 5.3.7.2 (x64) en Windows 7 / Libreoffice 6.4.2.2 en Windows 10
Avatar de Usuario
JoseJuan
Mensajes: 34
Registrado: Mié Abr 04, 2018 10:41 pm
Ubicación: Valencia (España)

Re: Foco en cursor

Mensaje por JoseJuan »

Hola.
Problema resuelto.
Al modificar algunos campos del formulario, necesitaba saber si el valor habia cambiado, para ello solía usar la propiedad OldValue (en ms-access), al no encontrar nada similar en LO, se me ocurrió guardar el valor previo en la propiedad HelpText del campo desde el evento 'Antes de actualizar', para luego compararlo con el nuevo valor desde el evento 'Despues de actualizar'.

Según parece, al modificar la propiedad HelpText desde código se activa el evento el evento 'Despues de actualizar' que a su vez vuelve a activar el evento 'Antes de actualizar', estableciendo un bucle que impide reconocer las pulsciones del teblado. En ocasiones alguno de los eventos finalizaba de forma correcta, no sé si antes o después de lo previsto, y no se establecía el bucle.
Al realizar un segundo click de ratón en el mismo campo también se rompia el bucle, pero resultaba muy molesto no saber si con un click en el campo era suficiente para escribir en él o era necesario un segundo click.

Conociendo este problema la solución era sencilla, cambiar los eventos por otros similares: 'Al recibir el foco' y 'Al perder el foco' y por otro lado no usar ninguna propiedad de los campos del form sino usar una variable global para guardar el valor previo.

Saludos.
libreoffice 5.3.7.2 (x64) en Windows 7 / Libreoffice 6.4.2.2 en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Foco en cursor [SOLUCIONADO]

Mensaje por Longi »

Vamos, que te lo has currado!
Enhorabuena por tu tesón y gracias por compartir.
Yo Tardé un tiempo, después de prueba y error, en ver que los eventos de antes y después de modificar el registro se ejecutan dos veces. Para evitar la segunda vez suelo usar una variable global y un condicional, de tal modo que si la variable vale 1 (por ejemplo) le dejo continuar, y al final de la macro le doy valor 0. Así, cuando entra en el segundo ciclo, como el valor ya no es 1 no continúa.
En el condicional, si el valor es distinto de uno pongo la variable a 1 y me autoexpulso de la macro (exit sub) con lo que sin seguir ciclando está preparada para la siguiente vez que se llame al evento
Este es uno de esos trucos que te imaginas y que quizá no sea muy bonito o los hay mucho más eficientes, pero que a alguien le puede venir bien en algún momento.
Un saludo y feliz año! ;) .
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder