El famoso Valid()

267 views
Skip to first unread message

Antonio Meza

unread,
Apr 7, 2023, 1:45:26 PM4/7/23
to Comunidad de Visual Foxpro en Español


Les paso el link para que descarguen un formulario de ejemplo de como manejo el valid, ya que muchos no lo usan porque no permite usar el .setFocus() y siempre se ejecuta el código del valid con el simple hecho de que el control reciba el focus y lo pierda.

Lo que abunda en internet es que usen el LostFocus pero no es correcto, puede funcionar pero no es lo correcto.

NOTA: En el ejemplo uso una propiedad del formulario, pero como manejo clases uso una propiedad en cada control. al final el efecto es el mismo pero desde luego el utilizar clases es mejor.

Si alguien tiene una mejor forma seria excelente.

saludos
Antonio Meza
Message has been deleted

Víctor Hugo Espínola Domínguez

unread,
Apr 9, 2023, 12:11:50 AM4/9/23
to publice...@googlegroups.com
Adjunto un vídeo que muestra una de las fallas del Valid en Combobox: No ejecuta el Valid al cambiar de item con las flechas arriba/abajo, a mi me sucedió lo contrario en otro tipo de Combobox: Al cambiar de item con las flechas arriba/abajo ejecutaba el Valid del Combobox!

Otro problema que puede surgir en el Valid es al llamar a otro formulario como parte de la validación, con el Lostfocus no hay conflicto.

Puedes leer el artículo de mi paisano y un comentario que publiqué en esa ocasión https://vfpavanzado.wordpress.com/2017/11/18/para-validar-es-mejor-usar-lostfocus-o-es-mejor-usar-valid/#google_vignette


Afirmar que no es correcta la sugerencia de Cetin Basoz, uno de los más renombrados gurús de VFP, es el sumum de la arrogancia!

Saludos,
Víctor.
Lambaré - Paraguay.



--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/74a54911-ab77-4644-8cd3-ffa5337ec76dn%40googlegroups.com.

Víctor Hugo Espínola Domínguez

unread,
Apr 9, 2023, 12:12:33 AM4/9/23
to publice...@googlegroups.com

Saludos,
Víctor.
Lambaré - Paraguay.



ValidAMeza.mp4

Antonio Meza

unread,
Apr 9, 2023, 2:19:31 AM4/9/23
to Comunidad de Visual Foxpro en Español
El efecto de mover los items de un combo con la flechas NUNCA va a ejecutar el Valid() y es lo correcto, porque al usar las flechas arriba y abajo estas cambiando el item para seleccionar el adecuado, es decir debes confirmar con ENTER que item vas a seleccionar, seria un error muy grande que VFP ejecutara el valid con el simple hecho de cambiar de item con las flechas, porque como adivina cual quieres? de hecho si mueves el mouse sobre los items sin hacer click realiza el mismo efecto que si usas las flechas arriba/abajo, imagina que cada vez que muevas el mouse sobre un item sin dar click se ejecute el valid seria un error de VFP.

Si usas las flechas arriba/abajo y seleccionas el item 2 y presionas ESC y no ENTER, veras que el valid no se ejecuta tampoco porque cancelaste la selección y sin embargo el combo ya te muestra que seleccionaste el item 2, eso también es correcto, sin embargo si presionas ENTER o das click en otro control se va a ejecutar el valid porque ya seleccionaste un item, es decir realizaste un cambio.

Del articulo de tu paisano te comento que soy el usuario SOLVERMEX el primero que le comento a Walter Ojeda jejejejejejejejeje y sin insultos!!

En mi caso siempre he usado el KeyPress para llamar a otro formulario y no el valid, normalmente uso la tecla F3 para abrir un formulario, y de nuevo la validación como debe ser dentro del VALID(), y efectivamente llamar a un formulario dentro del valid hace corsas muy raras, por eso use el KeyPress sin ningún problema.

Alejandro Isla

unread,
Apr 9, 2023, 4:11:16 AM4/9/23
to Comunidad de Visual Foxpro en Español
Buenas, mi opinión, por lo leído, los argumentos a favor del LOSTFOCUS() vs VALID() adolecen siempre del mismo errror, desconocimiento del programador de algunas funciones del VFP.
Específicamente, que retur (ObjetoDestino) posee la misma funcionalidad que .SetFocus() y que Return 0 mantiene el foco el el control, y a diferencia de return .f., no emite ningún cartel de advertencia.
Tomando esas dos premisas, el uso de LOSTFOCUS() pasa a ser algo meramente de gusto, sin ningún elemento técnico que la ponga por encima respecto al VALID().

Si en el primer enlace a favor del LostFocus(), https://vfpavanzado.wordpress.com/2017/11/18/para-validar-es-mejor-usar-lostfocus-o-es-mejor-usar-valid/#google_vignette, reemplazamos:

"En el método VALID() sí se pueden realizar validaciones pero…no puedes usar el método SETFOCUS() allí. Y a veces lo necesitarás"
por
"En el método VALID() sí se pueden realizar validaciones pero…no puedes usar el método SETFOCUS() allí, sin embargo puedes usar RETURN (ObjetoDestino), que cumple la misma funcionalidad Y a veces cuando lo necesitarás (al SETFOCUS()), puede ser reemplazado sin ningún inconveniente"

"¿Y es importante poder escribir MiControl.SetFocus()?, no, porque podemos escribir  RETURN (ObjetoDestino), obteniendo el mismo efecto"

"Que si llegas a agregar o a quitar un control entonces tendrías que cambiar tu línea, por ejemplo a RETURN(4). En cambio, con LOSTFOCUS() escribirías ThisForm.Text7.SetFocus(), claro, que si en vez de RETURN(4) escribes RETURN (thisForm.Text7) obtienes el mismo resultado, sin importar si agregar o quitas controles de por medio."

Es decir, completando los datos que se desconocen, a mi parecer, las afirmaciones dadas pierden sentido.

Repito, no digo que no se pueda usar el LOSTFOCUS en caso de que desee o le guste usarlo, pero es por gusto, no por las explicaciones técnicas que se elaboran. Y les recuerdo, si alguna de mis "correcciones" es errónea, por favor, indicarlo. 
Saludos.

Alejandro Isla

unread,
Apr 9, 2023, 4:53:31 AM4/9/23
to Comunidad de Visual Foxpro en Español
Respecto a las afirmaciones del gurú Cetin Basoz, en el segundo link, noto que él en ningún momento le achaca al valid() fallas o imposibilidades, tal  como en el primer post, es más, el indica "IMHO", es decir "En Mi Humilde Opinión", indicando las virtudes del LOSTFOCUS, sin embargo, dichas virtudes, tambien se encuentran en el valid ¿o no?

cambiar el valor ingresado ¿En el valid() con thisform.value no lo hacemos?
mostrar su propio mensaje  ¿sería con un wait windows o messagebox, igual que en el valid()?¿o a que se refiere?
permanecer en ese campo o moverse a un objeto de su agrado ¿el return 0 o el return (ObjetoDestino) en el valid, cierto?
invocar otro formulario Este parecería ser el inconveniente ¿se presente siempre en el valid() o como sería le problema?
Sin embargo, en este hilo, https://groups.google.com/g/publicesvfoxpro/c/eNA9AnLdvpk , se indica queel problema al ejecutar otro formulario, se dá por tener código en el lostfocus(), eliminando eso, se solucionaba ¿com osería el tema entonces?¿ambos presentan problemassegún la sircunstancia?

Saludos.

Alejandro Isla

unread,
Apr 9, 2023, 5:01:46 AM4/9/23
to Comunidad de Visual Foxpro en Español
Por último, respecto al combobox, creo que ahí realmente tenemos un bug en el control, pienso que al moverme en la lista desplegada a otro ítem, y pulsar escape, el control debería volver a mostrar en su texbox, el valor original, ya que al movernos por la lista, dicho valor fue alterado al desplazarnos.
Al igual que si el combobox ya tiene un valor por defecto al inicializarse, si ingresamos al mismo y salimos con ENTER o TAB, sin cambiar el valor de inicialización, no se ejecuta el VALID()

Ambos casos, hace que al recuperar el dato con un Variable = Thisform.Combobox1.Value, se asigne un valor, visualizado en pantalla, pero que nunca fue validado.

En este control, creo que validar por LOSTFOCUS(), si es un mandato para esquivar ese bug.

Saludos

integral

unread,
Apr 10, 2023, 3:05:09 PM4/10/23
to Comunidad de Visual Foxpro en Español

Buenas Tardes :

Las siguientes líneas expresan mi humilde opinión.

Desde que empecé a programar en VFP 6.0. El evento Valid en un ComboBox nunca funciono como tal, se podía tan solo poner un mensaje de alerta y nada mas el usuario seguía avanzado en el ingreso de datos...

Entonces había que hallar una solución al tema. Y la solución fue utilizando el evento LostFocus

Aprovecho el momento para publicar el código  a pedido del colega que me pidió que publicara el código.

LostFocus :
IF LEN(Alltrim(Thisform.CBOCLASE.DisplayValue)) = 0                      && Valida Correctamente el ComboBox
   NODEFAULT
   ?? CHR(7)
   WAIT WINDOW "Elija el Producto Generico" NOWAIT  
   Thisform.CBOCLASE.Gotfocus
ENDIF 

Cuando migre al VFP 9.0 

Fue también cambiar en mi codificación de programar usando ahora los comandos del Select SQL que como bien me dijo un conocedor en su momento, me serviría de mucho en la migración al SQL Server. Y así fue.

Apareció en las paginas Web otra forma de validación a nivel de formulario.. Es decir al momento  de Grabar recien se hacia la validacion y se presenta en la pantalla un mensaje con los errores u omisiones realizadas. Esta táctica se adapto con los comando del VFP

Hace unas semanas se me ocurrió probar otra forma de Validación al ComboBox y lo pude realizar utilizando el evento Keypress

Publico el código de mi autoría.

Keypress :
DO CASE
     CASE nKeyCode = 13                                                   && '{ENTER}'
       IF EMPTY(Thisform.CboClase.DisplayValue)                                
          NODEFAULT
          WAIT WINDOW "[ Debe Seleccionar una Opcion. ]" NOWAIT
          MESSAGEBOX("Seleccione el Codigo del Articulo.",0+64,"Aviso del Sistema")    
          Thisform.CBOCLASE.GotFocus                                        
      ENDIF
     ENDCASE

 Espero haber contribuido en algo al tema en mencion.

Saludos,

Integral

Lima
(Lima-Perú)

Antonio Meza

unread,
Apr 10, 2023, 3:54:11 PM4/10/23
to Comunidad de Visual Foxpro en Español
En mi caso antes de llamar bug trato de buscar información en la ayuda para ver si es un comportamiento definido que lo mas seguro es que si.

Te comento que eso se resuelve fácilmente en el InteractiveChange() preguntar si la ultima tecla es ESC entonces que no haga nada, es decir que no cambie el valor, para mi ejemplo quedaría así

* InteractiveChange() 

IF LASTKEY() = 27
NODEFAULT
ELSE
thisform.validarcambios = .t.
ENDIF

saludos
Antonio Meza

Antonio Meza

unread,
Apr 10, 2023, 4:04:22 PM4/10/23
to Comunidad de Visual Foxpro en Español
El problema de utilizar el LostFocus para evitar que salga del control es retornar el foco al mismo control ya es algo extraño, esto desencadena nuevamente los eventos When y GoFocus, en mi caso tengo código en el GoFocus que utilizo para cambiar el color del borde del control y la fuente en negritas para que visualmente el usuario sepa que control tiene el foco actualmente y al salir en el evento LostFocus regreso las propiedades a los colores normales.

Pero imagina que tienes otros procesos en el GoFocus que no se deben repetir una segunda vez como comentaron arriba, al utilizar la validación en el LostFocus provocas que se ejecute nuevamente el when y GoFocus por retornar el focus al mismo objeto desde un evento que NO fue diseñado para eso.

saludos
Antonio Meza

Antonio Meza

unread,
Apr 10, 2023, 4:40:58 PM4/10/23
to Comunidad de Visual Foxpro en Español
Miren lo que dice OpenIA.com

Pregunta:  visual fox pro usar el evento valid() o lostfocus

Respuesta:

Visual FoxPro es un lenguaje de programación orientado a objetos que se utiliza para desarrollar aplicaciones de bases de datos y de escritorio. En cuanto a los eventos Valid() y LostFocus(), ambos son eventos comunes en los controles de formulario que pueden ser utilizados para validar datos y proporcionar retroalimentación al usuario.

El evento Valid() se dispara cuando el control pierde el foco después de que se ha ingresado algún valor en él. Este evento se utiliza generalmente para validar el contenido del control, como por ejemplo, asegurarse de que se haya ingresado un número válido, que una fecha tenga un formato adecuado, etc. Si se produce un error de validación, se puede mostrar un mensaje de error al usuario.

El evento LostFocus() se dispara cuando el control pierde el foco, independientemente de si se ha ingresado algún valor en él o no. Este evento se utiliza generalmente para realizar tareas que no están relacionadas con la validación de datos, como actualizar el contenido de otro control en función del valor que se ha ingresado en el control actual.

En resumen, el evento Valid() es adecuado para la validación de datos, mientras que el evento LostFocus() se puede utilizar para realizar tareas adicionales que no están directamente relacionadas con la validación de datos.


saludos
Antonio Meza 

Antonio Meza

unread,
Apr 10, 2023, 4:51:01 PM4/10/23
to Comunidad de Visual Foxpro en Español
Pregunta:  que problemas trae utilizar el lostfocus para validar datos

Respuesta:

El evento LostFocus() no está diseñado específicamente para validar datos, y su uso para este propósito puede llevar a problemas. Algunos de los problemas que pueden surgir son:

  1. Validación tardía: El evento LostFocus() se dispara después de que el control ha perdido el foco, lo que significa que la validación se realiza después de que el usuario ha dejado el control. Si se produce un error de validación, puede ser confuso para el usuario y puede requerir que vuelva a ingresar los datos.

  2. Validación redundante: El evento LostFocus() se dispara cada vez que el control pierde el foco, incluso si el valor del control no ha cambiado. Si se utiliza este evento para validar datos, se puede producir una validación redundante y molesta para el usuario.

  3. Validación inconsistente: Si se utilizan diferentes eventos para validar datos en diferentes controles, se puede producir una validación inconsistente en la aplicación. Por ejemplo, si se utiliza el evento Valid() en algunos controles y el evento LostFocus() en otros, los usuarios pueden encontrar confusa la forma en que se validan los datos.

Por lo tanto, se recomienda utilizar el evento Valid() para la validación de datos, ya que está diseñado específicamente para este propósito y proporciona una validación inmediata y consistente. Si es necesario realizar alguna tarea adicional después de la validación, se puede utilizar el evento LostFocus() u otro evento adecuado.


se nota que no tengo nada hacer y estoy jugando con OpenIA jajajajajaj

saludos
Antonio Meza



Dsan

unread,
Apr 10, 2023, 5:10:57 PM4/10/23
to publice...@googlegroups.com



Casualmente estaba viendo eso de OpenIA, y tiene buenas practicas, no hace todas las validaciones como try catch pero sugiere tomar en cuenta, en un futuro va ser una super ayuda esta IA.

saludos a todos
DS


--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

integral

unread,
Apr 10, 2023, 10:49:56 PM4/10/23
to Comunidad de Visual Foxpro en Español
Siguiendo con mi punto de Vista. Cabe mencionar que en el Combobox existen 2 estilos. 

1) Opcion que permite al usuario crear e ingresar un nuevo Item 

2) Seleccionar un Item de la Lista ya creada en el ComboBox

Esta demás mencionar nuevamente cual es la función del VALID. Esta claro la  definición pero para el caso especifico del ComboBox No hace la validacion correcta y deja pasar y avanzar hasta el final por decirlo de alguna forma.

Para la Opcion 1 : La Validacion se centra en que el campo no este en blanco y ademas si ingresa el usuario un item correctamente.

Par la opcion 2 :  El Usuario tan solo debe eligir un item de los ya creados en la lista del Combobox

Por lo demás una buena estructura en la codificacion y una buena validacion evitara varios problemas a futuro..

* Recordatorio :

 Los eventos When y Valid no aceptan SetFocus.

   Por lo tanto, si necesitamos redirigir el foco a un cuadro llamado .TextTal:

  En lugar de
           Thisform.TextTal.SetFocus
  Usar
           RETURN thisform.TextTal

Hasta la próxima

Atte.,

Integral

Antonio Meza

unread,
Apr 11, 2023, 12:12:26 PM4/11/23
to Comunidad de Visual Foxpro en Español
Uso los dos estilos del Combo que mencionas, aunque debo decir que el primero no me gusta, es decir permitir que el usuario agregue datos a la base de datos desde el combo, para eso programo que si presiona F3 abra el formulario del catalogo para agregar nuevos items.

Entiendo tu rechazo a utilizar las buenas practicas, es normal, yo pase por eso y sufrí mucho jajajajajaja porque estaba acostumbrado al código espagueti con fideos, y solo me importaba que funcionara, pero un buen día que el programa crecía cada vez mas y le movía aquí y tronaba por allá y hasta el mas allá!! me di cuenta que algo estaba haciendo mal y empece a ver concejos de buenas practicas y te repito cuesta mucho pero es justo y necesario como dicen por ahí.

Te di el ejemplo de como mejorar tu código usando el Combo y validando en el Valid, incluso si gustas te ayudo a usar el Valid para que veas que no es difícil solo que hay muy mala información sobre él.

Ahora si prefieres seguir con tu LostFocus y estar en esa lista adelante jejejejejeje 

saludos
Antonio Meza
Reply all
Reply to author
Forward
0 new messages