Problema con formulario de tipo Modal

199 views
Skip to first unread message

integral

unread,
Mar 29, 2023, 11:17:50 AM3/29/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos.

Muy Buenos días :

Hoy temprano quise ingresar unos nuevos artículos y vaya sorpresa...

El formulario secundario creado para tal fin se esconde detrás del formulario principal.

Al invocar por 2da. vez al formulario secundario de tipo Modal con ALT+N aparece el formulario...

Alguno que paso por el mismo problema...

Y cual fue la solución al problema.

Agradezco sus comentarios y sugerencias.

Saludos,

Integral
(Lima-Perú)
FORMULARIO SE PONE DETRAS.jpg

integral

unread,
Mar 29, 2023, 1:35:25 PM3/29/23
to Comunidad de Visual Foxpro en Español
Bueno Amigos :

Buscando información, encontré un link con el mismo problema de hace algunos años...

Y luego de leer el articulo completo. 

PD : Deje de utilizar el evento Setfocus y descarte  el código del evento LostFocus.

Tema solucionado.

Hasta la próxima

Saludos 

Integral

Hitiel Hernández

unread,
Mar 31, 2023, 11:55:44 AM3/31/23
to publice...@googlegroups.com
Integral
 
A mí me ha sucedido cuando utilizo SET FOCUS en el control que invoca al otro formulario. Prueba con eso

--
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/311929db-2fd3-4a59-a4eb-fa07c7b10ecdn%40googlegroups.com.


--
Saludos Cordiales!

integral

unread,
Mar 31, 2023, 12:44:47 PM3/31/23
to Comunidad de Visual Foxpro en Español
Amigo Hitiel :

Efectivamente ocurre algo extraño cuando se utiliza el evento Setfocus en el control que invoca al otro formulario.

En mi caso especifico tenia una validación en el evento Lostfocus del ComboBox y de ahí utilizaba un Setfocus al siguiente control  dentro del formulario.

Quite la Validación del Lostfocus y el Setfocus. Y se resolvió el problema.

PD : Tengo un Formulario que lo llamo "El Triangulo de las Bermudas", porque lo ejecuto y ningun control dentro de dicho formulario funciona, no me marca ningun error, se queda digamos congelado, de un momento a otro sucedió., menos mal por experiencia que a todos mis formularios les hago una copia BAK...

Hasta la próxima

Saludos,

Integral

Antonio Meza

unread,
Mar 31, 2023, 3:12:29 PM3/31/23
to Comunidad de Visual Foxpro en Español
El detalle esta en que no se usan los métodos de los objetos de la forma correcta, es decir el LostFocus es cuando el objeto pierde el focus y la mayoría lo usa porque no sabe controlar el Valid() de los objetos, entonces hacen las validaciones dentro del LostFocus y usan el SetFocus, eso es incorrecto, que funcione es una cosa pero como puedes observar te afecta al llamar a un formulario y tiene otros efectos secundarios que afectan el funcionamiento del objeto y la aplicación.

Dentro del Valid() no se debe usar SetFocus, se usa Return (Objeto).

Hay que entender como funcionan los Objetos y el orden de ejecución de sus métodos y aunque muchos si no es que la mayoría usa el LostFocus para sustituir el valid() quiere decir que es la forma correcta.

Hay que perderle el miedo al Valid() jejejejeje

saludos
Antonio Meza

integral

unread,
Apr 1, 2023, 12:25:34 AM4/1/23
to Comunidad de Visual Foxpro en Español
Amigo Antonio Meza

En el caso de validar el ComboBox, aprendí desde que programaba en VFP 6.0 a utilizar el LostFocus, era la única forma que conocía para hacer la validación

He buscado información de como Validar un ComboBox y Sugieren que se podría utilizar para tal fin el Valid, Interactive Change y el When.

Pero veo que no ha funcionado con ninguno de los 3 eventos, tan solo utilizando el LostFocus

Aquí la Pregunta. Como harías para validar un control ComboBox. 

Entonces que código emplearías en la validación.

Agradezco tus comentarios.

Saludos,

Integral 

Antonio Meza

unread,
Apr 1, 2023, 1:11:22 PM4/1/23
to Comunidad de Visual Foxpro en Español
Hola!!

* El When es cuando un objeto recibe el foco si pasa la validación entonces se ejecuta el GoFocus, No te recomiendo usar el When para negar el focus a un objeto ya que visualmente no es una buena practica.

* El InteractiveChange se ejecuta por cada cambio que realices en los datos del objeto, por ejemplo cada tecla que presiones para cambiar el contenido o cada que seleccionas una opción del listado del ComboBox

* El Valid se ejecuta cuando confirmas los cambios ya sea con Enter, al Seleccionar un opción del listado del combobox, o al perder el foco porque diste click en otro objeto, usaste tab, etc.

* Una vez que se pasa la validación dentro del Valid entonces se ejecuta el LostFocus, por lo tanto si retornas un Cero en el Valid el LostFocus no se ejecuta.
--------------------------------

Para validar tu ComboBox o cualquier otro objeto en VFP todo va depender de la necesidad, pero sabiendo como funciona el orden de ejecución de los objetos es mas fácil saber como resolver esa necesidad.

Que problema tiene el VALID, porque si tiene un detalle y es que se ejecuta si o si, y a veces necesitamos que no lo haga, pero el simple hecho de que un objeto reciba el foco y salga de él entonces el valid se va a ejecutar y es ese el detalle que muchos no saben como resolver y por eso realizan la validación dentro del LostFocus

La forma que realizo no se si es la adecuada pero no he encontrado una propiedad que pueda decirme si dentro de un objeto cuando recibe el focus algo cambio, para que de esta forma decirle al Valid, hey no ha cambiado nada así que no valides nada, pero no la he encontrado, por lo que realizo una forma manual ese proceso.

Hay muchas formas, la forma rápida para explicarte es que crees una propiedad en el formulario, le pones por ejemplo el siguiente nombre y la inicias en Falso: 

validarCambios = .f.

Luego esta propiedad la vas a utilizar dentro del InteractiveChange de cualquier objeto que quieras validar si hubo cambios o no.

thisform.validarCambios = .t.

Y por ultimo dentro del Valid de cualquier objeto vas a preguntar por el valor de esta propiedad, si hubo cambios la regresas a False inmediatamente porque ya se va a realizar la validación y luego escribes tu código.

IF thisform.validarCambios = .t.
     thisform.validarCambios = .f.
     * Aquí tu código que quieras validar y retornar 0 (Cero) para que no pierda el focus, retornar .t. para que salga o   retornar el nombre del objeto a enviar el focus, etc.
ENDIF

Esta es la forma rápida, la que uso es por medio de clases, donde cada objeto de mi clase sea un TextBox, ComboBox, etc ya tiene creada una propiedad validarCambios = .f. y en el interactiveChange ya tiene el this.validarCambios = .t. incluso el Valid ya tiene la condición pero a demás a cada objeto le agregue un método mValid() donde pongo mi código, es decir en la clase Valid de cada objeto tengo un código como este:

IF thisform.validarCambios = .t.
     thisform.validarCambios = .f.
     _valid = this.mValid()
     ... 
     ...
ENDIF

Desde luego hay mas código en el Valid() que uso, por ejemplo para saber si debe perder el focus, si debe enviar a un objeto el focus, o continuar.

Espero que te haya explicado el tema del Valid() y se entienda el motivo porque el que la mayoría no lo usa que es porque siempre se va a ejecutar con entrar y salir de un objeto y el desconocimiento del orden de ejecución de sus los métodos, y apliques cualquier técnica que encuentres que permita saber si realmente se realizaron cambios o no dentro del objeto para que de esta forma puedas evitar que se ejecute el código a validar cuando no es necesario.

Y otra cosa importante dentro del valid no esta permitido el SetFocus y por esa razón también muchos o la mayoría usa el LostFocus, porque no saben que para enviar el focus a un objeto desde el Valid se usa RETURN ya sea con un numero o con el nombre del objeto: Ejemplo:

* Mover hacia atrás como si presionaras shift+tab
Return -1
* Mover hacia delante como si presionaras tab
Return 1
* Mover 3 objetos hacia delante como si presionaras tres veces tab
Return 3
* La que siempre uso indicar el objeto a enviar el focus
Return (thisform.objetoNombre)

Nota: Cualquier corrección será bienvenida!!! y si tienen una mejor forma de realizar la validación seria mucho mejor que la compartieran.

saludos
Antonio Meza

integral

unread,
Apr 1, 2023, 7:52:47 PM4/1/23
to Comunidad de Visual Foxpro en Español
Que tal amigo Antonio Meza :

Luego de hacer varias pruebas con diferentes eventos del ComboBox, puedo decir al fin lo he logrado.

Siempre quise hallar la forma de realizar la Validación en el Combobox y la única forma efectiva que conocía era mediante el Lostfocus.

Desde anoche me puse a leer e investigar sobre el tema y no encontraba una solución.

Hoy en la tarde inclusive antes de encontrar la solución intente poner en practicar tu consejo con la creación de una propiedad, pero tampoco funciono.

Bueno amigo sin mas preámbulos publico el código que funciona para validar un ComboBox

   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

Este código lo he probado en el Keypress y funciona correctamente...

Por experiencia algunos usuarios ahora prefieren la validación al final antes de Grabar, como algunos otros que prefieren que el Sistema les mande alertas de alguna omisión.

En mi caso combino las 2 formas.

Hasta la próxima y gracias por tus comentarios.

Saludos,

Integral  

integral

unread,
Apr 1, 2023, 7:56:48 PM4/1/23
to Comunidad de Visual Foxpro en Español
Amigos.

Me olvidaba...

Publico las imágenes del resultado de la validación realizada. 

Atte.,

Integral
CAMPOS_OBLIGATORIOS.jpg
KEYPRESS_VALIDA_COMBOBOX.jpg

Antonio Meza

unread,
Apr 1, 2023, 9:22:07 PM4/1/23
to Comunidad de Visual Foxpro en Español
El KeyPress()??? uffff mejor regresa al LostFocus jejejejejeje

Les llame OBJETOS pero son CONTROLES y son EVENTOS no MÉTODOS jajajajajajaja

Te paso el link para que descargues un formulario de ejemplo de lo que te comente sobre el uso del Valid.

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