Mejor forma de evitar el valid para activar un boton salir

539 views
Skip to first unread message

Fox Friend

unread,
Feb 4, 2013, 11:55:54 PM2/4/13
to Comunidad de Visual Foxpro en Español
Tengo un form donde el usuario debe teclear un numero a buscar en el primer text para cambiar datos.

Los demas controles son todos texts o editbox y 3 botones.

Al activarse el form todos los controles se inhabilitan excepto el primer text donde se hace la busqueda.

Debo evitar que el usuario dé un enter cuando el text está vacío, lo cual soluciono así:

Evento Valid()

IF Thisform.ReleaseType>0 && Esto me deja escapar del valid haciendo click en la X del form.
        Thisform.Release 
     ENDIF 
     
IF EMPTY(THIS.Value)
MESSAGEBOX("NO ESPECIFICO NINGUN DATO",0+64, "Error",2000)
RETURN 0
ELSE
Thisform.cmdcambiar.Enabled= .T.
ENDIF

El problema es que si el usuario hace click sobre el boton salir del form, se activa el evento valid del text y no deja salir, a menos que haga click en la X.

Aun al hacer click en la X se ve el mensaje del valid antes de que salga y luego sale.

Qué forma hay de solucionar esto, sabiendo que todos los demas controles estan desabilitados y el único control que puede recibir el enfoque es el mismo text y el boton salir?...

Si intento enviar el enfoque al boton salir desde el valid del text, no se puede porque me manda el tipico mensaje de que no se puede utilizar al setfocus desde un valid y ademas no se ve muy ortodoxo enviar el enfoque al boton salir para que el usuario tenga que manualmente hacer click para volver a poner sobre el text.

Cómo podria burlar al valid() del text para que el usuario pueda hacer click en el boton salir?..

Este valid no me termina de simpatizar jeje..

Saludos!

Guillermo MDQ

unread,
Feb 5, 2013, 7:14:31 AM2/5/13
to publice...@googlegroups.com
Suponiendo que tenes el boton de salir llamado "cmdSalir" poniendo este codigo en el valid del textbox  lo solucionas:

IF Mdown()
   loObj=SYS(1270)
   IF Vartype(loObj)='O' AND loObj.Name="cmdSalir"
      loObj = NULL
      Thisform.Release
   ENDIF
ENDIF

Saludos
Guillermo

Claudio Luna

unread,
Feb 5, 2013, 7:36:11 AM2/5/13
to Comunidad de Visual Foxpro en Español
Suponiendo que tienes el boton cmdSalir con la propiedad Cancel = .t.
podes hacer algo como esto en el valid del textbox
if lastkey() <> 27 &&& cancel



endif
espero que te sirva
Saludos
Claudio

FidelJ

unread,
Feb 5, 2013, 7:38:51 AM2/5/13
to publice...@googlegroups.com
Este es un ejemplo donde se busca un cliente en una tabla nativa que tiene un índice por ID.
En el evento valid, puedes ver si el código ingresado tiene un valor correcto. La tarea la resuelves en LostFocus, si es que no es vacío. Si el valor ingresado no es aceptado, Valid debe limpiar el campo para permitir la salida.

Evento Valid
this.Value=ALLTRIM(this.Value)
IF !EMPTY(this.Value)
IF !INDEXSEEK(this.Value,.f.,"CLIENTES","CODIND")
MESSAGEBOX("No existe")
this.Value=""
RETURN 0
ENDIF
ENDIF
Evento lostFocus
IF EMPTY(this.Value)
NODEFAULT     && impide que pierda el foco
ELSE
INDEXSEEK(this.Value,.t.,"CLIENTES","CODIND")
MESSAGEBOX("Cliente="+clientes.nombre)
ENDIF



El martes, 5 de febrero de 2013 01:55:54 UTC-3, Amigo de Fox escribió:

Fox Friend

unread,
Feb 5, 2013, 11:04:14 AM2/5/13
to publice...@googlegroups.com
Gracias amigos!

Interesante lo del MDown y lo del sys(1270), tambien lo del lastkey() <> 27 y lo del INDEXSEEK.

Saludos!


Antonio Meza

unread,
Feb 5, 2013, 3:37:40 PM2/5/13
to publice...@googlegroups.com
Lo mas fácil es usar clases, pero si en tu caso no las usas, entonces crea un propiedad en el formulario llamada por ejemplo

CambioTextBox = .F.

Luego en el evento InteractiveChange del TextBox agregas la misma propiedad que creaste así

thisform.CambioTextBox = .T.

Y en el evento VALID del texbox agregas las siguientes lineas a tu codigo

If thisform.CambioTextBox = .T.
     thisform.CambioTextBox = .F.
     * De aquí en adelante todo tu codigo
     ...
     ...
ENDIF


NOTA: Lo que hace simplemente es que si el usuario cambia el valor del TextBox se activa en evento interactiveChage cambiando de FALSO a VERDADERO la propiedad CambioTextBox, por lo tanto si el usuario no cambia ningun valor pues siempre sera FALSO y de esta forma si presionas ENTER, ESC, CLICK sobre otro objeto no se ejecuta el VALID de tu codigo.

En mi caso tengo una clase textBox que ya tiene incluida una propiedad llamada pCambio y no la genero en el formulario principal pero el uso es el mismo para ambos casos.

saludos
Antonio Meza

Víctor Hugo Espínola Domínguez

unread,
Feb 5, 2013, 4:11:20 PM2/5/13
to publicesvfoxpro
Hola Antonio

Muy interesante tu idea, yo acostumbro algo parecido: tengo una propiedad ThisForm.uDatoAnterior que asigno con This.Value en el evento WHEN y en el VALID hago la comparación del dato anterior con el actual.

La lógica que me gusta implementar cuando un textbox recibe un identificador de tabla es la siguiente: Si está vacío y presionó <Enter> convoca a un form buscador. Si tiene algo tipeado accede a la tabla usando los índices que correspondan, por ejemplo busca el código de barra, si no encuentra busca la clave primaria, si no encuentra busca por si esté contenida en la descripción o el código de barra si es numérico. Es decir el VALID siempre retornará .T.

Saludos,
Víctor.


Fox Friend

unread,
Feb 5, 2013, 5:03:17 PM2/5/13
to publice...@googlegroups.com
Interesantes técnicas. Apenas y empiezo a usar los métodos y propiedades, aunque sigo leyendo sobre oop tratando de captar..

No suelo usar lo que no entiendo bien ya que puede ser riesgoso, pero en cuanto lo capto, trato de implementarlo.

Gracias por compartir su experiencia.

Saludos!


Antonio Meza

unread,
Feb 5, 2013, 6:16:39 PM2/5/13
to publice...@googlegroups.com
Hola!!

Para hacer lo mismo que tu, si el usuario presiona ENTER y el textbox esta vacio para llamar un formulario eso lo programa en el evento KEYPRESS del textbox, validando de igual forma la propiedad para saber si hay algun cambio

dentro del keypress

If thisform.CambioTextBox = .T.
     * Nada
ELSE
      do form busqueda.scx 
ENDIF

HernanCano

unread,
Feb 5, 2013, 11:46:08 PM2/5/13
to publice...@googlegroups.com
Guillermo:
Muy interesante tu propuesta.
Ya conocía sys(1270), pero no lo he combinado con MDown.

El hecho de que lo tengas en el Valid me hace pensar..... La instrucción "loObj = NULL" me da miedo... Verificaré.
Reply all
Reply to author
Forward
0 new messages