Como dirían los yanquis: no problemo :-) :-)

Rafael Copquin

El 27/10/2014 10:58, Hernan O. Suligoy escribió:
Buen Dia, disculpame Rafael, recien leo tu respuesta, desde ya Muchas Gracias por tu respuesta. Estoy seguro que es un error mio en la secuencia de Eventos, ya lo leo y te comento...

Saludos...

Hernan Suligoy



El 20/10/2014 02:58 p.m., Rafael Copquin escribió:
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







Responder a