evitar ejecucion de lost focus al cerrar form

130 views
Skip to first unread message

Jorge

unread,
Mar 29, 2022, 9:11:03 PM3/29/22
to publicesvfoxpro
Hola a todos :

Tengo la siguiente consulta :
En un textbox tengo una validacion que se ejecuta en el lostfocus 
del mismo : 
if empty( this.value )
     messagebox( "ingrese un valor " ) 
    nodefault 
endif 

en ese mismo form , tengo un boton de salida que hace un thisform.release
Lo que necesito hacer es :
si estoy parado en el textbox , no ingrese ningun valor y quiero salir del form por el boton mencionado , que en ese caso no se ejecute el codigo del lostfocus . Si es posible hacer esto necesiatria saber como . Desde ya gracias 


Víctor Hugo Espínola Domínguez

unread,
Mar 29, 2022, 9:47:47 PM3/29/22
to publice...@googlegroups.com
Crea en el form o clase base un método (yo lo llamo SalirSinValidar) y en ese método controlas que no presionó la hot key (caption \<letra) o hizo click en el botón salir en cuyo caso retornas .T. y caso contrario .F.

En el LostFocus:
If Thisform. SalirSinValidar
    NoDefault
    Return .T.
Endif

En el método  SalirSinValidar:
If Lastkey() = 46    && [alt] + C botón Cancelar
    Return .T.
EndIf

Amouseobj(laMouse, 1)

lnMouseX = m.laMouse[3]
lnMouseY = m.laMouse[4]

If Vartype(lnMouseX) == "L"
    lnMouseX = 0
    lnMouseY = 0
Endif

lnCancelarTop = This.cntBotones.Top + This.cntBotones.cmdCancelar.Top
lnCancelarBottom = m.lnCancelarTop + This.cntBotones.cmdCancelar.Height

lnCancelarLeft = This.cntBotones.Left + This.cntBotones.cmdCancelar.Left
lnCancelarRight = m.lnCancelarLeft + This.cntBotones.cmdCancelar.Width

llCancelarClick = Between(m.lnMouseX, m.lnCancelarLeft, m.lnCancelarRight) ;
                     And Between(m.lnMouseY, m.lnCancelarTop, m.lnCancelarBottom) ;

llSalir = m.llCancelarClick

Return m.llSalir

Nota: Tengo el botón Cancelar en el contenedor cntBotones, si lo tienes en el form borra cntBotones. y cambia Cancelar por Salir

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/CAKiZPeGG-45tLe1xufUWM_%2BtfEBPvRCz_ZfsxPPpwsua1QN2XA%40mail.gmail.com.

Cristian Novoa

unread,
Mar 29, 2022, 9:47:49 PM3/29/22
to Comunidad de Visual Foxpro en Español
Yo hago todas las validaciones en el boton, pero lo que puedes hacer es una validación estilo .NET, poniendo un label rojo al lado del textbox "ingrese valor", y así dejas que actúe el botón.

Antonio Meza

unread,
Mar 29, 2022, 9:51:40 PM3/29/22
to Comunidad de Visual Foxpro en Español
Te comento que hay todo un debate sobre que fue primero el huevo o la gallina, no no no ese es otro jejejeje

Hay un debate sobre cual es mejor usar el Valid() o el LostFocus() te pueden contar historia de terror y cuentos chinos, pero los que desarrollaron VFP claramente definieron el Valid() para validar datos de ahí su nombre y el LostFocus() cuando el objeto pierde el foco, aclarado ese punto lo que necesitas es realizar esa validación dentro del valid(), PERO siempre hay un pero!!!

Si trasladas tu instrucción al valid() tendrá el mismo efecto, y tiene lógica, porque lo que haya en el valid se va a ejecutar hagas lo que hagas, pero hay un truco para evitarlo que es el que uso siempre!! 

Hay dos formas, la primera la mas rápida es que creas una propiedad en tu formulario llamada por ejemplo: thisform.validar_datos = .F. recuerda que le puedes poner el nombre que quieras y luego en el InteractiveChange() de tu textbox u objeto que quieres que no se valide nada le pones lo siguiente

Dentro del InteractiveChange()
thisform.validar_datos = .T.

Y luego en el valid() queda así:

IF thisform.validar_datos = .T.
      thisform.validar_datos = .F.
     if empty( this.value )
          messagebox( "ingrese un valor " ) 
          return 0
     endif 
ENDIF

Y la segunda forma que es la correcta es crear una clase para evitar eso pero si no manejas clases pues es mas cuento jejeje

saludos
Antonio Meza

ZeRoberto

unread,
Mar 29, 2022, 10:18:28 PM3/29/22
to publicesvfoxpro
Lo más recomendable es validar al final, cuando haces click en el botón guardar, yo uso el evento valid solo para llenar campos por defecto

Saludos

Ze




Antonio Meza

unread,
Mar 29, 2022, 10:29:48 PM3/29/22
to Comunidad de Visual Foxpro en Español
Si y No!!! jejeje

Que pasa cuando otros campos dependen del valor de uno ?? en ese caso si o si tienes que validar en ese campo!! 

saludos

ZeRoberto

unread,
Mar 29, 2022, 10:34:43 PM3/29/22
to publicesvfoxpro
Por eso digo, solo si necesito llenar otro campo, pero no le pongo un mensaje diciendo "Por favor llene este mensaje"

Saludos

Ze



Jose Antonio Blasco

unread,
Mar 30, 2022, 3:13:40 AM3/30/22
to Comunidad de Visual Foxpro en Español
Jorge, prueba a poner en tu código del Lostfocus del TextBox esto, y mira si te sirve:

if !mdown()
   if empty( this.value )
        messagebox( "ingrese un valor " ) 
        nodefault 
   endif 
Endif

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2



Jorge

unread,
Mar 31, 2022, 7:33:44 AM3/31/22
to publicesvfoxpro
Gracias por la ayuda a todos !! Pude solucionar el tema usando el evento valid combinado con interactivechange 

elkin dario uribe torres

unread,
Mar 31, 2022, 5:39:48 PM3/31/22
to publice...@googlegroups.com


El El jue, mar. 31, 2022 a la(s) 07:33, Jorge <ciclo...@gmail.com> escribió:mi
Reply all
Reply to author
Forward
0 new messages