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)
-----
Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 2014.0.4765 / Base de datos de virus: 4040/8421 - Fecha de
la versión: 20/10/2014