Set focus no me funciona

Te agradecería mucho si me puedes ayudar con esta duda: Tengo un formulario que contiene 4 cuadros de texto: código, nit, nombre y dirección. Lo que necesito es que cuando este posicionado en código, los tres cuadros siguientes se desactiven, y que al digitar el código el programa verifique si se ha ingresado un dato correcto o incorrecto, si es correcto el cursor debe pasar al siguiente cuadro que es nit (por lo tanto código, nombre y dirección deben quedar deshabilitados), y si digite un código errado o un espacio el programa no me deje pasar al siguiente cuadro. La verdad es que lo he intentado de muchas formas como por ejemplo con el evento keypress, valid, etc y me funciona a medias o no funciona. El programa esta hecho en vfp 9.

1 Respuesta

Respuesta
2
Bueno suponiendo que tienes 5 cuadros de texto y a los 4 últimos les asignas la propiedad enabled a (Falso) .F. y en el evento valid del primer cuadro de texto escribes un código parecido al siguiente:
If Alias() <> "NOMBRETABLA"
  Select NombreTabla
Endif
Locate For Alltrim(Codigo) = Alltrim(This.Value) && si los datos son de tipo caracter.
If Found()
  Thisform.Text2.Enabled = .T.
  Thisform.Text2.SetFocus()
  Else
     This.SetFocus()
Endif
Gracias por responder.
Te quiero comentar que el ejemplo no me funciona porque me salio un mensaje que dice que "setfocus no funciona en el evento valid". Esto ya me había ocurrido anteriormente por eso opte por reemplazarlo por la instrucción return thisform.text1. esta solución me funciono a medias porque por alguna razón que desconozco me genera un conflicto en las siguientes instrucciones que se encargan de deshabilitar o habilitar los otros cuadros de texto, en otras palabras es como si no las estuviera leyendo. A continuación voy a escribir el código de un cuadro de texto en el evento valid (me seria de mucha ayuda si me podrías decir donde esta el error):
if empty (thisform.text1.value)
  wait windows ("el campo codigo no puede estar vacio") no wait
  return thisform.text1
else
  thisform.text2.enabled=.t.
  return thisform.text2
  thisform.text3.enabled=.f.
  thisform.text4.enabled=.f.
  thisform.text5.enabled=.f.
Endif
Si tienes algún ejemplo o programa de lo agradecería muchísimo.
El error está en que estás utilizando la línea de comando return en medio, en Cualquier lenguaje de programación un programa sigue ejecutándose hasta donde encuentre esta linea de comando, las demás las ignora, en este orden de ideas la solución sería la siguiente:
Escribir este código en el evento Valid del control cuadro de texto:
if empty (thisform.text1.value) Then
  wait windows ("el campo codigo no puede estar vacio") no wait
 else
  thisform.text2.enabled=.t.
  thisform.text3.enabled=.f.
  thisform.text4.enabled=.f.
  thisform.text5.enabled=.f.
Endif && Esto debería solucionar el problema.
return thisform.text1 && No entiendo para qué qué tienes que devolver un ojeto por valor, en mi concepto esto está mal.
Disculpa tanta molestia, pero creo que ya encontré donde esta fallando el programa aunque todavía no se como puedo solucionarlo.
Esta es la situación : cada texto tiene un código en el evento keypress, que al presionar la tecla escape debería de devolverse al cuadro texto anterior, "pero no lo hace". Si ud recuerda cada cuadro de texto también tiene asignado un evento valid, que se encarga de validar los datos ingresados y según sea el caso habilita e inhabilita algunos cuadros de texto.
Por ejemplo si el foco esta en el text3, (donde el text1 y text2 esta inhabilitados por el evento valid), y al presionar la tecla escape (en el vento keypress), no se devuelve al text2 ni tampoco la habilita, entonces uno podria concluir que hay un conflicto entre el valid y el keypress que no permite devolver el foco a un campo que esta inhabilitado, asi trate de habilitarlo con textn.enabled=.t. en el evento keypress, no lo permite.
¿Usted sabe como podría solucionar esto?
Gracias
Ojo nuevamente estás trabajando mal, la tecla escape se utiliza para para interceptar eventos con la rutina On Escape la cual es la que te genera el conflicto con el evento keypress, considera la posibilidad de utilizar otro recurso, por ejemplo el método lostfocus del control de texto ejemplo:
Escribir en el evento LostFocus del control para inhabilitar otros controles:
With Thisform
    Store .F. To .Text2.Enabled, .Text3.Enabled, .Text4.Enabled
Endwith
Esto se desencadena cuando el control pierde el foco o cuando el usuario presiona la tebla Tab.
Gracias por tu ayuda pero no me funciona como quiero. Yo quiero aclararte que no tengo mucha experiencia en programación orientada a objetos y apenas me estoy familiarizando con estos conceptos.
Te cuento que me siento un poco frustrado por algo que aparentemente debería de ser sencillo se complica mucho, o no se si me he hecho entender. Lo que que yo necesito es un código que me permita validar un dato de un cuadro de texto, si es correcto que me deje avanzar al siguiente campo y si no cumple que se quede allí hasta que el usuario le de el dato correcto, y por lógica en algún momento el usuario a de querer devolverse a otros campos presionando la tecla escape (aquí ya deseche la idea de activar o inactivar los controles para hacerlo más sencillo). Supuestamente esto debería de funcionar con los eventos keypress, valid, lostfocus etc. ya los he probado pero me quedan funcionando a medias.
Por eso le pido el favor, si puedes, de enviarme algún ejemplo de un código real y completo a mi correo : [email protected].
Gracias por su ayuda y tiempo.
En mi concepto te has complicado demasiado en la validación de datos, si el usuario quisiera devolverse bastaría utilizar las teclas de direccionamiento para moverse a través de los cuadros de texto, pero teniendo en cuenta que no tienes mucha experiencia en programación orientada a objetos ahí te envío a tu correo un ejemplo completo de un programa de facturación de pedidos para que lo examines, este te va a servir de mucha ayuda.
Don alonso, le cuento que anoche estaba inspirado y encontré una solución un poco arcaica pero me sirvió: Deje de utilizar el evento valid, y todo lo programe en el evento keypress (cuando se presiona entrar o esc), utilizando el viejo truco de activar o inactivar los controles según la necesidades, permitiendo cumplir con estos objetivos:
1.Si el campo esta vacío no deja avanzar al siguiente campo porque esta inactivo.
2.Permite devolverse con la tecla escape
3.Al tener los campos activos o inactivos según sea la situación, permite controlar el orden de digitación y mejora la apariencia del formulario.
... Lo malo (Aquí requiero de su ayuda)...: Por alguna razón que no entiendo, el programa me falla al final, cuando el usuario termina de capturar toda la información de los 6 campos, el saca un cuadro de dialogo (messagebox) que pregunta si quiero guardar s/n:?.....si le digo si, el guarda la información, si dígito no, pues no lo guarda y el enfoque se queda en el campo que quiero (ultimo)... el problema es que al decir que si, debería de ubicar el foco en el campo 1, desafortunadamente no lo hace y me lo pone en el campo 2, y ya revise el setfocus y esta apuntando al campo1... entonces no entiendo que hice mal.
Me podrías ayudar a descifrar este problemita ...
¿Es posible de que me puedas enviar una copia de tu programa para ver cuál es el inconveniente?
Ya detecte el problema y lo solucione, por fin el programa me esta funcionando como quiero, ahora tengo que ponerme a estructurar un código que me permita hacer una consulta que es vital en las aplicaciones y si todo me sale bien, este sera la base para replicar otros formularios. Nuevamente le agradezco toda su colaboración y de todas formas le estaré enviando el programa para que lo mires y si tienes alguna sugerencia o critica constructiva bienvenida sea.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas