Hola, estuve fuera de BsAs por un tiempo y recién hoy retomo y mirando
los mails veo este.
Te dieron varias soluciones, pero creo que tu problema se debe a un
manejo erróneo de la secuencia de eventos.
Sería más o menos así (no va la secuencia completa, pero te muestro las
más importantes para tu problema):
FORM.LOAD()
DE INIT
TEXT1.INIT()
FORM.INIT()
FORM.SHOW()
FORM.ACTIVATE()
TEXT1.WHEN()
FORM.GOTFOCUS()
TEXT1.GOTFOCUS()
TEXT1.INTERACTIVECHANGE() && por cada caracter que tipeas dentro del
textbox
TEXT1.KEYPRESS
TEXT1.VALID()
TEXT1.LOSTFOCUS()
FORM.LOSTFOCUS()
FORM.DEACTIVATE()
FORM.QUERYUNLOAD
FORM.DESTROY()
TEXT1.DESTROY()
FORM.UNLOAD()
Entonces se trata de poner las cosas en los métodos apropiados para el
correcto funcionamiento del form.
** init del texbox
this.Value = '' && suponiendo que el
número de cuenta sea de tipo character
this.AddProperty('lValidar',.t.) && esta propiedad es muy útil para
la validación como verás más abajo
En el textbox del primer form debés usar el gotfocus para cosas tales
como limpiar el código del cliente y el nombre del mismo que se supone
que tenés en una label, cada vez que entrás al textbox:
** gotfocus del textbox
this.value = ''
thisform.lblEmpresa.caption = ''
thisform.cCuenta = ''
** keypress del textbox
LPARAMETERS nKeyCode, nShiftAltCtrl
If nKeyCode = 27 && tecla esc
Release thisform
EndIf
if nKeyCode = 28 && tecla F1
thisform.consultas()
endif
En el valid del form es donde ponés el código del cliente para buscar el
nombre:
** ante todo se inicializa la propiedad lValidar según el tipo de input
** si el usuario aprieta escape o F1 o simplemente da click con el mouse
en otro control
** lValidar se pone en falso y no valida nada. Con esto evitás el
cartelito de 'Código inexistente'
If Lastkey() = 27 or ;
lastkey() = 28 or ;
Empty(this.Value)
this.lValidar = .f.
Return 1
EndIf
If this.lValidar = .t.
if seek(this.value,'clientes','numerocta') && buscás en la
tabla por orden de número de cuenta
thisform.cCuenta = clientes.cuenta
thisform.lblEmpresa.caption = clientes.empresa
return 1
&& pasa directamente al próximo control
else
messagebox('Código inexistente',48,'Atención',2000)
this.value = ''
thisform.cCuenta = ''
return 0
endif
endif
Si en cambio el valor de lValidar es verdadero, ejecuta el código de
validación. Si encuentra el cliente con la función seek pone el nombre
del cliente y retorna 1, si no, pone el cartelito de error, reinicializa
el textbox y retorna 0.
Si retorna 1 pasa directamente al próximo control, según el orden de los
controles en tu form. Previamente ejecuta el evento lostfocus del textbox
Si retorna 0 se queda en el textbox hasta que ingreses un valor válido o
aprietes escape o F1
Fijate en el código del evento keypress. Si el usuario apretó escape,
cierra el form (si esa es tu intención). Si el usuario aprieta F1, llama
al método del formulario que hace aparecer el segundo form (método
consultas).
** método consultas
Local oCliente
Do form busca_clientes name oCliente linked
With oCliente
thisform.cCuenta = .cCuenta
thisform.text1.value = .cCuenta
thisform.lblEmpresa.caption = .cEmpresa
EndWith
oCliente.release()
oCliente = NULL
El form busca_clientes tiene sesión privada de datos, windowtype modal y
cuando elegís un cliente en él, no se cierra sino que se oculta
(thisform.hide() ). Antes de ocultarse inicializa sus propiedades
cCuenta y cEmpresa, que luego son capturadas por el objeto oCliente del
primer formulario.
De esta manera queda en foco para que opere la cláusula linked de más
arriba y el objecto oCliente lo "engancha", permitiendo leer las
propiedades cCuenta y cEmpresa de dicho form.
Una vez que se leyeron las propiedades que enganchó el objeto oCliente,
se llama a su método release para cerrar definitivamente el formulario
busca_clientes y luego, para limpiar la memoria sacando lo que ya no
usamos, se mata el objeto oCliente con NULL ( a pesar de que está
definido al principio del método como propiedad local)
Revisá la secuencia de eventos que te muestro al principio, de donde
aislo los eventos del textbox:
TEXT1.GOTFOCUS()
TEXT1.INTERACTIVECHANGE() && por cada caracter que tipeas dentro del
textbox
TEXT1.KEYPRESS
TEXT1.VALID()
TEXT1.LOSTFOCUS()
El usuario entra con el gotfocus con lo que inicializa las propiedades y
los textboxes y empieza a apretar las teclas, una a una poniendo el
código del cliente. Con cada tecla que aprieta se dispara el
interactivechange.
El keypress controla qué tecla apretó el usuario, escape, F1 o cualquier
otra y reacciona en consecuencia. Si no apretó ni escape ni F1 pasa al
método valid y si el retorno del valid es 1, pasa al lostfocus, en donde
podés llamar a otro método cualquiera o no llamar a nada y seguir adelante.
Los valores de las teclas que se ven en el evento keypress se sacan del
help de la función inkey()
Probalo, vas a ver cómo te funciona
Rafael Copquin
El 09/10/2014 11:18, Hernan O. Suligoy escribió:
Hola Gente, me encuentro con este problema, que no le encuentro la
vuelta..
Desde un Formulario de facturacion, llamo a otro donde elijo el
cliente, en el evento GotFocus del primer
formulario proceso los datos seleccionados en el segundo, todo bien la
primera vez, si vuelvo a acceder
al segundo form eligiendo otro cliente, esta vez el 1er form me ignora
el gotfocus, pero si funciona si lo
vuelvo a realizar, o sea, ese evento me funciona bien 1 vez, y 1 vez
no, la proxima bien otra vez, y asi
sucesivamente.. Estoy usando Vfp9
Alguna Idea de que me esta pasando???
Muchas Gracias
Hernan Suligoy
Reconquista (Santa Fe)