Cancelar pérdida de foco en formulario

Hola.

Estoy intentando hacer la comprobación de un campo de formulario al perder el foco. Si la condición no se cumple, cancelo la entrada de datos y vuelve al campo.

 

Objetos que uso:

1) Función que comprueba el formato del campo y devuelve 1 (correcto) o 0 (incorrecto). Si es incorrecto, muestra un mensaje (con la función Mensaje) y se sale.

2) Evento que llama a la función y, si el resultado es incorrecto, se sale con un "Set retorno proceso = NO"

3) Conexión de evento al perder el foco el campo, que llama al evento anterior

 

Resultados:

a) Si la comprobación del campo es correcta, ningún problema.

b) Si la comprobación es incorrecta, pasa lo siguiente:

b.1) Muestra el mensaje (bien)

b.2) El puntero pasa a reloj de arena... y queda ahí hasta que cierras la aplicación (mal)

b.3) El cursor pasa al siguiente campo (mal) y además queda otro cursor parpadeante en el campo que acabo de comprobar (desconcertante!). Paso a tener dos cursores, pero sólo uno, lógicamente, es de verdad (cuando escribo, se escribe en uno)

Si hago que el mensaje se presente en el evento, en vez de en la función, consigo que el puntero no se quede en reloj de arena, pero el segundo efecto (doble cursor) sigue pasando.

 

¿Es ésta la manera correcta de realizar este proceso?

 

Saludos,

Fran Varona

 

 

 

Hola, Fran:

Sobre los resultados comentarte que (b.2), en las pruebas que hemos realizado, el cursor se transforma en reloj de arena mientras el mensaje esta abierto, pero una vez cerrado vuelve al estado de puntero. (b.3) El comportamiento que indicas lo hemos añadido a nuestro sistema de gestión de incidencias (código nº 843)- no obstante, añadirte que tienes un comando de interfaz que te permite controlar el foco, asi que puedes añadir al proceso el comando de instrucción Interfaz: Activar foco objeto para retornar el foco al edit.

Gracias por tu colaboración.

Un saludo.

Hola, Rafael.

El problema de que se convierta el puntero en reloj de arena me pasa sólo si el mensaje se muestra en la función. Si, en cambio, se muestra en el evento, no hay problema. Lo he reproducido varias veces, para asegurarme.

En cuanto a la función de interfaz, no quería usarla porque suponía que el "set retorno proceso=NO" debería cumplir su función. Al menos, es un sustituto, hasta solucionar la incidencia. Por cierto... no veo la incidencia 843.

Muchas gracias,

Fran Varona

Hola.

Más problemas:

Ahora, el evento lo que hace es lo siguiente:

- Comprueba el resultado de la función (si el formato del campo es el correcto)

- Si no lo es, presenta un Mensaje y utiliza el comando "Interfaz: activar foco objeto" para quedarse en el mismo campo (es decir, para no seguir el foco al siguiente)

 

Resultado:

- Si la comprobación es incorrecta, muestra el mensaje (bien), el puntero queda en reloj de arena (mal), y el cursor queda en el campo (bien), pero NO se visualiza. Puedo escribir, pero no veo el cursor parpadeante. 

- Una vez que sucede eso, aunque escriba el campo de modo correcto (comprobación correcta), el puntero no vuelve.

 

¿Qué estoy haciendo mal? Gracias,

Fran Varona

 

 

Adjunto el evento.

Saludos,

Fran Varona

 

[attachment=3879,404]

Viendo lo que muestras en el mensaje, recuerda que tienes la posibilidad de usar la máscara para los controles de edición, lo que te permite controlar la forma en que introduce los datos el usuario.

Un saludo.

 

Hola.

Muchas gracias por la sugerencia (que pondré en práctica ahora mismo). De todos modos, creo que es un proceso habitual hacer algún chequeo a la pérdida de foco, y volver al mismo punto si no se cumple. ¿Cómo tendría que hacerlo?

Y... ¿algún sitio donde pueda encontrar cómo se formatean las máscaras?

Muchas gracias,

Fran Varona

 

 

Cómo debes hacerlo es tal y como te indicó mi compañero, usando el comando de interfaz Activar foco. Puedes verlo programado y en ejecución en vBugMan en el catálogo de Velneo Open Apps.

El formulario de la incidencia tiene un evento asociado al botón aceptar comprueba que las condiciones de los campos, y si alguno no la cumple (en la mayor parte se trata de que estén cubiertos) lleva al control en el que el usuario ha de completar el dato. Incluso modifica la paleta del control en tiempo de ejecución para que se muestre con colores vivos que indiquen más claramente al usuario del error que se ha producido.

El formato de las máscaras lo tienes en la zona info, a la que puedes acceder desde esta web o desde el propio Velneo vDevelop V7 en la opción de ayuda. Puedes ver la del apartado referido al control de edición, o el de cada uno de los tipos de control, verás que están disponibles en función de ese tipo. Te copio las de el control de edición:

 

 

 

 

 

Máscara: Permite aplicar una máscara para formatear el texto. Las máscaras disponibles son:

Espacio en blanco: Cualquier caracter

A: Carácter ASCII requerido. A-Z, a-z.

a: Carácter ASCII alfabético permitido pero no requerido.

N: Carácter ASCII alphanumeric character required. A-Z, a-z, 0-9.

n: Carácter ASCII alfanumérico permitod pero no requerido.

X: Requerido cualquier carácter.

x: Cualquier carácter permitido pero no requerido.

9: Dígito ASCII requerido. 0-9.

0: Dígito ASCII permitido pero no requerido.

D: Dígito ASCII requerido. 1-9.

d: Dígito ASCII permitido pero no requerido. 1-9.

#: Signo más o menos permitido pero no requerido.

H: Carácter hexadecimal requerido. A-F, a-f, 0-9.

h: Carácter hexadecimal permitdo pero no requerido.

B: Carácter binario requerido. 0-1.

b: Carácter binario permitido pero no requerido.

>: Los siguientes caracteres irán en mayúsculas.

<: Los siguientes caracteres irán en minúsculas.

!: Finaliza la conversión a mayúsculas o minúsculas.

: Usar el caracter con algún símbolo de los anteriores para ser usado como separador.

Máscaras para horas:

Horas:

h: (0-23, 1-12 AM/PM)

hh: (00-23, 01-12 AM/PM)

H: (0-23)

HH: (00-23)

Minutos:

m: (0-59)

mm: (00-59)

Segundos:

s: (0-59)

ss: (00-59)

z: (0-999) zzz (000-999)

Periodos:

AP: (AM/PM)

ap: (am/pm)

Máscaras para fechas:

Día:

d: (1-31)

dd: (01-31)

ddd: (Lun-Dom)

:dddd: (Lunes-Domingo)

Mes:

M: (1-12)

MM: (01-12)

MMM: (Ene-Dic)

MMMM: (Enero-Diciembre)

Año:

yy: (00-99)

yyyy: (0000-9999)

El resto de caracteres en la cadena de formato serán tratados como

texto. También los caracteres que estén entre comillas simples ( ’ ) en

la cadena de formato serán tratados como texto, lo que nos permite

tratar los caracteres específicos de formato (d, dd, M, MM, etc.) como

texto.

 

 

 

 

 

Un saludo.

 

 

 

 

 

 

Hola.

Lo primero, disculpas por no encontrar la definición de la máscara en la zona info. Miré donde no tenía que mirar (en info, pero en otro sitio), y lancé una búsqueda global que sólo me enseñaba un par de mensajes del foro. 

Puede que el problema con el foco está en que estoy saliendo del mismo control al que quiero volver.

Gracias,

Fran Varona

 

Ya te digo que el funcionamiento normal es con Activar foco. Set retorno NO no está programado para ese uso.

Ten en cuenta que Velneo V7 no es 6.X. La filosofía es similar pero en algunos casos no tiene por qué funcionar exactamente igual. Al tener Activar foco no tiene tanto sentido el uso de Set retorno para esa misma funcionalidad.

 

Un saludo.

Hola de nuevo:

En las pruebas que hemos hecho, efectivamente, solamente aparece el cursor si el mensaje es emitido desde la función llamada (o un subproceso llamado). Solamente aprece además, cuando pasamos el cursor por la ventana del mensaje -pero no si está fuera de ella-. Lo hemos incluido en nuestro sistema de gestión de incidencias con el código 1515.

El cuanto al uso del comando de instrucción que te indicamos realmente no es un sustituto, es el comando que en Velneo V7 se usa para comtrolar el foco de los controles.

Con respecto a la incidencia 843, decirte que revisaremos por qué no aparece.

Gracias y un saludo.

Buenas tardes. Siento levantar este tema de 11 años atrás.

Venía buscando ayuda para hacer lo mismo que EIC: cancelar la entrada de datos si la condición no se cumple y volver al campo. En mi caso no es un campo, es un control de edición alfabética asociado a una variable.

El dato es una referencia ó código de barras. Quiero admitir ambas opciones en un solo control para simplificar el uso.

Primero busco por referencia y, si no existe, por código de barras. Si encuentra algún resultado, pasamos al siguiente campo. Ok.

Si no encuentra nada, informo con un mensaje (1seg) y salgo del Manejador de Evento con “set retorno proceso = NO”. Eso funciona. Ok.

Pero si pongo como se supone que debería, “Interfaz: Activar foco objeto”, el cursor desaparece, si bien permite escribir. Lo mismo que le pasó a EIC hace 11 años. Y eso me desconcierta, porque según fgutierrez “set retorno proceso = NO” no está programado para ese uso.

Además, también he tenido el problema de doble cursor y también que el cursor se vuelve estático y deja de “parpadear”.

Y todavía tengo un último problema. Cuando el usuario pulsa el botón “Cancelar” o cierra el formulario, lo que primero sucede es la pérdida de foco y se activa la consiguiente búsqueda cuando ya no se quiere buscar. Y quiero dejar el dato y no borrarlo aunque no exista.

¿No se puede activar una variable booleana que indique que el usuario pulsó “Cancelar” o ESC o cerró la ventana con el ratón, ANTES de que salte la señal de perder foco?

Otra opción sería cambiar la señal de perder foco por la de “value changed”. Más bello, pero no es lo mismo: se te puede ir el cursor al siguiente campo, por ejemplo.

Saludos.

Hola carlosan.

Pues sí, es un comportamiento nada coherente, pero es que todo lo que tiene que ver con gestión de eventos en el interfaz de velneo es un despropósito, lo mires como lo mires.

En este caso, efectívamente, funciona correctamente el comando “Set retorno de proceso = NO” en lugar de “Interfaz: Establecer foco”, a pesar de lo que se indica en este hilo, aunque después de 11 años habrá llovido mucho sobre este tema.

En la documentación se indica que no se deben usar mensajes ni formularios en manejadores de “Perdida de foco” por lo que se invalida totalmente lo que quieres hacer.

En cualquier caso, si con “Set retorno de proceso = NO” es como funciona, úsalo.

Para el Botón Cancelar asígnale un Manejador en el que pongas una variable local LCANCEL = 1.
En el manejador Pierde foco pones if (LCANCEL = 0) & (isEmpty(VALOR)) …

Y finalmente, olvídate de todo esto que te he dicho porque es hacer chapucillas a las que nos obliga el limitado interface de Velneo que solo te traerán problemas tarde o temprano.

Usa el método más seguro que consiste en dejar que el Usuario rellene los campos como quiera, y en el Manejador del botón Aceptar haz las comprobaciones pertinentes, enviando el Foco al campo que quieras ya que en este caso funciona prefertamente.

Saludos
Paco Satué

Gracias 3 veces, Paco, por responder, por la rápidez y por hacerlo con franqueza.

Tendré que volver a valorar las otras opciones que no sean “pierde-foco” ya que hablan sobre ello en la documentación. Curioso que ponga:

“No se deben mostrar mensajes o formularios en los manejadores de evento disparados con esta señal de pérdida foco, porque eso produce efectos secundarios ya que a su vez estamos generando nuevas pérdidas de foco”

Porque vale. No debemos mostrar formularios, pero … ¿tampoco mensajes? Si estoy en medio de un trozo de programa que lo está gestionando no debería ganar foco ningún otro control… 'amos digo yo.

Lo de poner un manejador de evento en “Cancelar” previo a ejecutar no sirve porque lo que sucede primero es la pérdida de foco y después la cancelación o cierre de ventana.

Y tampoco puedo dejar que rellene el usuario y esperar que acepte, porque está buscando un artículo por referencia o código de barras, y tenemos que conocer lo que busca para facilitar la cantidad, el precio, etc antes de aceptar. Ya tú sabes.

Lo del cursor desaparecido en combate, los dos cursores con vidas independientes y el cursor catatónico me temo que sea porque (no me había dado cuenta de este detalle) el formulario en cuestión no es tal, sino un subformulario anidado en un separador con otros dos. En el vERP viene así la introducción de líneas de venta. Subform. detalle, Subform. descripción larga y Subform. trazabilidad. Ahí probé de nuevo lo de “Cancelar” LCancel=1, pero tampoco. Primero perdemos el foco.

3xGracias, Paco.