Page 1 of 1

when de los gets

PostPosted: Wed Oct 26, 2005 2:54 pm
by Leonor Gonzalez
Hola Amigos: tengo una dialog con muchos gets, cada vez que uno de ellos pierde foco me revisa todas las condiciones when de cada get, esto es normal, es algo de las clases? o me esta pasando algo raro.
Saludos. Gracias.

PostPosted: Thu Oct 27, 2005 12:41 am
by DanielPuente
Leonor:

La condicion when de tus gets se evaluan todas juntas al activar el dialogo que los contiene, por ejemplo si vos tenes en variables locales las condiciones asociadas a cada get al activarse el dialogo los que no cumplan la condicion when estaran deshabilitados. Una vez que el dialogo esta activado si cambia el valor de la condicion when de algun get le tenes que hacer un :refresh().

Saludos,

PostPosted: Thu Oct 27, 2005 2:22 pm
by Leonor Gonzalez
Esta bien lo que me explicas, y así esta trabajando, pero lo que me hace es lo siguiente: ejecuta los when de cada get en el activate del dialog, despues por cada get que pierde foco vuelve a ejecutar los when de cada get, en el dialog veo como se refrescan todos los get por cada uno que pierde foco y me puse carteles y veo como pasa por todos los get en lugar de hacer el valid de ese y el when del proximo a tomar foco unicamente, no hay ningun refresh puesto en ningun lugar, evidentemente estoy armando mal el vector que tiene los when guardados. Gracias. Leonor.

PostPosted: Fri Oct 28, 2005 12:55 am
by DanielPuente
Leonor:

Mostranos el codigo involucrado.

Saludos,

PostPosted: Fri Oct 28, 2005 5:39 am
by Antonio Linares
Leonor,

Todos los WHEN de los GETs tienen que evaluarse, porque en función del cambio que se haya hecho, podría afectarles.

PostPosted: Fri Oct 28, 2005 12:29 pm
by Leonor Gonzalez
Este es el código que estoy utilizando:

// Genero el objeto get, esto esta dentro de un for
ObjGet := TGet():New( (aDefFields[i][1]+1)*GET_CHARPIX_H, aDefFields[i][2]*GET_CHARPIX_W, bBloq,, nWidth*GET_CHARPIX_W, 11.3, cPicture,,,,oFont, .F.,, .T.,, .F.,, .F., .F.,, .F.,,, .F. )
//leo la clausula when para ese get
lcWhen := aDefFields[i][6]
//armo un bloque con la clausula y otra variable
lcWhenBloq := "{||nFormEditPos:= " + STR( i, 3, 0 ) + "," + lcWhen + "}"
// le asigno la evaluacion del bloque al dato bWhen del get
ObjGet:bWhen := &( lcWhenBloq )
// le asigno la lectura del valid al objeto get
ObjGet:bValid := &( aDefFields[i][7] )
Cada vez que un get pierde foco los pasos que realiza son los siguientes:
* pasa por lostfocus de la clase tget
* entra en gotfocus de la clase tget para asignarle el foco al get siguiente
* evalua el valid del get que perdio foco
* realiza todos los when y en las ventanas que tengo mas de 30 get se ve como pasa uno por uno aparte de los mensajes
* le da foco al proximo get
Muchas Gracias. Saludos. Leonor

PostPosted: Fri Oct 28, 2005 12:59 pm
by DanielPuente
Leonor:

Estuve prestando atencion a un dialogo con whens y asi es, se evaluan todos los when, pero es el comportamiento normal y deseable (ademas ya lo confirmo el propio Antonio). En el codigo no se ve que contiene aDefFields[i][6] como condicion de los when, pero de todas maneras porque no queres que se evaluen todos los when de los gets ?. Sino, si queres controlar vos el momento de habilitar o deshabilitar los gets tendrias que hacerlo vos con :Enable() y :Disable() en cada get en el momento que lo necesites.

Saludos,

PostPosted: Fri Oct 28, 2005 5:58 pm
by Leonor Gonzalez
Bien en realidad esto lo encuentro por otro problema relacionado que tengo: cuando un get pierde foco realiza los siguientes pasos:
* entra en lostfocus de la clase tget
* entra en gotfocus de la clase tget para darle foco al proximo get
* realiza la condicion valid del get que perdio foco, cuando esa condicion no se cumple hace que pierda foco el get proximo y le vuelve a colocar el foco al que esta validando. Para hacer que pierda foco el get siguiente verifica tambien la condicion valid del mismo cuando el proximo get no es obligatorio esta todo bien, pero si el proximo get es obligatorio entra en un blucle y no puede salir de el.
Como puedo solucionar ese problema.
Mil Gracias por el tiempo que me estan dedicando. Saludos. Leonor

PostPosted: Fri Oct 28, 2005 7:09 pm
by DanielPuente
Leonor:

A que te referis con "entra en un blucle y no puede salir de el", cuando un get no cumple el valid pasa lo que vos decis, el foco 'rebota' y vuelve al get que no cumple el valid y no podes ir al siguiente hasta que no se cumpla, salvo que tengas especificado por ejemplo la tecla VK_UP para devolver .T. en el valid y en ese caso x ejemplo volver al get anterior.

Saludos,

PostPosted: Fri Oct 28, 2005 8:47 pm
by Leonor Gonzalez
Te explico puntualmente un caso en el que me entra en un bucle y no sale de el. Vamos a suponer que tengo 4 get trabajando en una ventana:

Codigo: primer get con valid verificando que no exista en la tabla y mensaje de codigo existente
Nombre: segundo get con valid que no sea vacio y mensaje tiene que ingresar un dato si o si
Direccion: tercer get no importa con que
Localidad: cuarto get no importa con que

Toma foco codigo, ingreso un codigo existente presiono enter, entra en lostfocus de clase tget, entra en gotfocus de clase tget pasando el foco al segundo get, valida el primer get como existe efectivamente rebota y quiere volver el foco al primer get, entonces entra en lostfocus el segundo get lo valida y como es vacio me muestra simultaneamente los dos msginfo y no para hasta que aborto el programa. Yo tengo una funcion armada que revisa cuando el último get pierde foco guarda todos los gets en la tabla correspondiente, esa funcion esta asignada al dato bLostFocus de cada get pero previamente conte los gets activos en la ventana y lo primero que pregunto es si es el último get lo hace sino sigue. Si en el valid del segundo get no hay ninguna condicion el foco rebota al primer get y queda ahi hasta que coloco un codigo inexistente como corresponde, el problema se presenta cuando el valid del get siguiente tiene una condicion obligatoria. Nuevamente Mil Gracias. Saludos. Leonor.

PostPosted: Fri Oct 28, 2005 9:39 pm
by DanielPuente
Leonor:

Eso no deberia pasar, el valid del segundo get no deberia actuar si no se cumple el del primero. El problema debe estar en el codigo que debes tener asignado a algun :bGotFocus o :bLostFocus que debe hacer que se refresquen los dos gets y actuen ambos valids.

Para no hacerla tan larga por aca hace lo siguiente, mandame un prg reducido ilustrativo del problema que yo pueda compilar, probar y corregir a mi correo.

Saludos,