Conflicto entre evento ON CHANGE y ON ENTER de TEXTBOX
Posted: Wed Oct 26, 2011 2:43 am
Tengo un Textbox en el que se ingresan una serie de 6 números separados por el punto y coma, cada uno de esos números se evaluan con una función (Controlserie() ), para determinar que esten dentro de un rango de 0 a 45.
Si alguno de esos números está fuera de rango aparece un MSGINFO() indicando que el número está fuera del rango especificado, esta evaluación se hace en el evento ON ENTER del TEXTBOX.
Dentro del mismo TextBox hay un evento ON CHANGE que basicamente lo que hace es fijarse si se completó el Textbox, salta al próximo control, en Clipper no había este problema porque cuando se completaba el get lo hacía automáticamente. El problema surge justamente en este evento porque antes de pasar al próximo control debe evaluar que los números ingresados esten dentro del rango anterior, y si no es así despliega el MSGINFO() y al presionar la tecla ENTER para cerrar la ventana de ese MSGINFO() activa el evento ON ENTER del TEXTBOX, por lo cual la ventana del MSGINFO() aparece 2 veces. Un ejemplo:
en el TEXTBOX ingreso 01;02;03;04;05;46
el 46 es un número que esta fuera de rango por lo que activa el MSGINFO():
El número 46
esta fuera del rango especificado
OK
Este MSGINFO aparece 2 veces. Bueno la idea es que este MSGINFO aparezca una sola vez. Abajo describo el TEXTBOX
DEFINE TEXTBOX TxtSerJug
ROW 100
COL 120
WIDTH 120
VALUE serisali->seriejuga
TOOLTIP 'Serie jugada'
INPUTMASK "99;99;99;99;99;99"
ON ENTER {|| if( Empty( strtran( Frm_JueAlta.TxtSerJug.value,";" ) ) .or.;
!Controlserie( Frm_JueAlta.TxtSerJug.value,cTipo ) .or. ;
!NumeroExis( Frm_JueAlta.TxtSerJug.value,Frm_JueAlta.dtpfecha.value ),;
Frm_JueAlta.TxtSerJug.setfocus,Nil ) }
ON CHANGE {|| if( !Empty( right(Frm_JueAlta.TxtSerJug.value,1 ) ) .and. ;
Controlserie( Frm_JueAlta.TxtSerJug.value,cTipo ),Frm_JueAlta.TxtLt.setfocus,Nil ) }
END TEXTBOX
Si alguno de esos números está fuera de rango aparece un MSGINFO() indicando que el número está fuera del rango especificado, esta evaluación se hace en el evento ON ENTER del TEXTBOX.
Dentro del mismo TextBox hay un evento ON CHANGE que basicamente lo que hace es fijarse si se completó el Textbox, salta al próximo control, en Clipper no había este problema porque cuando se completaba el get lo hacía automáticamente. El problema surge justamente en este evento porque antes de pasar al próximo control debe evaluar que los números ingresados esten dentro del rango anterior, y si no es así despliega el MSGINFO() y al presionar la tecla ENTER para cerrar la ventana de ese MSGINFO() activa el evento ON ENTER del TEXTBOX, por lo cual la ventana del MSGINFO() aparece 2 veces. Un ejemplo:
en el TEXTBOX ingreso 01;02;03;04;05;46
el 46 es un número que esta fuera de rango por lo que activa el MSGINFO():
El número 46
esta fuera del rango especificado
OK
Este MSGINFO aparece 2 veces. Bueno la idea es que este MSGINFO aparezca una sola vez. Abajo describo el TEXTBOX
DEFINE TEXTBOX TxtSerJug
ROW 100
COL 120
WIDTH 120
VALUE serisali->seriejuga
TOOLTIP 'Serie jugada'
INPUTMASK "99;99;99;99;99;99"
ON ENTER {|| if( Empty( strtran( Frm_JueAlta.TxtSerJug.value,";" ) ) .or.;
!Controlserie( Frm_JueAlta.TxtSerJug.value,cTipo ) .or. ;
!NumeroExis( Frm_JueAlta.TxtSerJug.value,Frm_JueAlta.dtpfecha.value ),;
Frm_JueAlta.TxtSerJug.setfocus,Nil ) }
ON CHANGE {|| if( !Empty( right(Frm_JueAlta.TxtSerJug.value,1 ) ) .and. ;
Controlserie( Frm_JueAlta.TxtSerJug.value,cTipo ),Frm_JueAlta.TxtLt.setfocus,Nil ) }
END TEXTBOX