Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Error en programa: Illegal function call


Begoguay
10 de julio de 2018, 18:48
Hola foreros.

Mi problema es el siguiente:

En los programas que hago pongo la propiedad 'Enabled' de los controles que utilizo como POW-TRUE o POW-FALSE, dependiendo de si quiero que el usuario modifique en ese momento el valor del control o no. Por ejemplo, en un mantenimiento de un fichero, si no se pulsa el botón de 'Editar' no quiero que acceda a ningún campo del fichero.
También tengo indicado en el evento 'PreKeyDown' del formulario, que cuando se pulse 'ESC', según si está en modo edición o no, acceda a unos controles u otros.
Pero me pasa que, solo a veces en algunos programas, cuando va a 'Enablar' o 'Desenablar' un control se me pierde el foco y me da el error 'Illegal function call'. Y aunque haga un 'SetFocus' a un control que anteriormente le he puesto POW-TRUE en su propiedad 'Enabled', no va a dicho control, y el foco se sitúa en otro control (es decir, donde le da la gana).
No se si alguien me puede dar una pista de por qué me puede ocurrir esto.

Un saludo.

Kuk
10 de julio de 2018, 21:22
Begoguay, esto ocurre porque el orden de ejecución de las rutinas GUI no siempre corresponde con el orden de su lanzamiento.

Este error suele darse cuando justamente hacemos SetFocus sobre un control que en el momento lo tiene en estado Disabled.

Para evitar este tipo de problemas, usa el método ThruEvents antes de hacer SetFocus:

INVOKE POW-SELF "ThruEvents"

Dicho método asegurará la espera necesaria para que todas la rutinas GUI se ejecuten antes de la siguiente línea de código, que en nuestro caso es el SetFocus.

Begoguay
11 de julio de 2018, 09:18
Hola.

Lo estoy probando, poniendo delante de cada SetFocus el evento ThruEvents y sigue sin funcionar

La única forma de arreglarlo es dejar activos los controles a los que va (sin que yo se lo diga) y en su evento GotFocus controlar que deje o no modificar ese control según si quiero que esté activo o no.

Kuk
11 de julio de 2018, 19:41
Begoguay, eso es que se te está escapando algo. Jugando con GetFocus y SetFocus, como decía, el orden de ejecución no está garantizado. Revísalo, yo lo resolví con el ThruEvents.