In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Elimar Buffer del teclado
Elimar Buffer del teclado
De qué manera se puede eliminar el Buffer del Teclado (como el antiguo CLEAR TYPEAHEAD), tengo una situación cuando dan seguidamente click a un botón
se repite la opción que llama varias veces, normalmente sucede aleatoriamente.
Se me ocurre que si logro borrar el buffer al inicio de la función o método llamado podría borrar los click o los enter recursivos,
he intentado :lenabaled:=.f. al botón , pero es tan rápido la repetencion de click que no logra desactivar a tiempo.
Mil gracias por su ayuda.
se repite la opción que llama varias veces, normalmente sucede aleatoriamente.
Se me ocurre que si logro borrar el buffer al inicio de la función o método llamado podría borrar los click o los enter recursivos,
he intentado :lenabaled:=.f. al botón , pero es tan rápido la repetencion de click que no logra desactivar a tiempo.
Mil gracias por su ayuda.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Auditoria y Sistemas Ltda.
Cartagena-Colombia
- ignacio
- Site Admin
- Mensajes: 9319
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Elimar Buffer del teclado
No es normal que ocurra eso a no ser de que esté llamando s la función ProcessMessages(). Si es el caso le aconsejo que deshabilite todo el formulario mientras se está evaluando el código que llama regularmente a esa función y lo vuelva a habilitar cuando termine el proceso.
Es más probable que se dispare el evento de doble-click que un clic doble cuando se hacen dos clicks muy rápidos
Saludos
Es más probable que se dispare el evento de doble-click que un clic doble cuando se hacen dos clicks muy rápidos
Saludos
Re: Elimar Buffer del teclado
Mira que hemos logrado reproducir el error del cliente,
no es cuando da click seguidamente, es cuando toma foco el Boton y da repetidamente ENTER muy rápido sobre el botón,
ahi cuando llama varias veces la función.
En espera de tus comentarios.
no es cuando da click seguidamente, es cuando toma foco el Boton y da repetidamente ENTER muy rápido sobre el botón,
ahi cuando llama varias veces la función.
En espera de tus comentarios.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Auditoria y Sistemas Ltda.
Cartagena-Colombia
- ignacio
- Site Admin
- Mensajes: 9319
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Elimar Buffer del teclado
Buenos días,
Insisto en mi anterior respuesta. Es seguro que en su código llama a ProcessMessages(). En cualquier caso:
1) oButton:lEnabled := .f.
2) Su código .....
3) oButton:lEnabled := .T.
De esa forma da igual lo rápido que pulse a la tecla Intro, ya que el botón estará deshabilitado mientras se ejecute su código.
Saludos
Insisto en mi anterior respuesta. Es seguro que en su código llama a ProcessMessages(). En cualquier caso:
1) oButton:lEnabled := .f.
2) Su código .....
3) oButton:lEnabled := .T.
De esa forma da igual lo rápido que pulse a la tecla Intro, ya que el botón estará deshabilitado mientras se ejecute su código.
Saludos
Re: Elimar Buffer del teclado
Nosotros acabamos sobrecargando xButton para que no permita darle 2 veces
// Sobrecarga a tButton para impedir que el doble Click ejecute 2 veces el metodo Click()
Class tButton From XButton
METHOD OnClick(oSender)
EndClass
//------------------------------------------------------------------------------
METHOD OnClick(oSender) CLASS tButton
Local lOk:=.T.
local oParent := Self:oParent
Self:lEnabled:=.F.
lOk:=Self:Super:OnClick()
Self:lEnabled:=.T.
While !oParent:IsKindOf("TForm")
oParent := oParent:oParent
End
oParent:RequestState()
RETURN lOk
// Sobrecarga a tButton para impedir que el doble Click ejecute 2 veces el metodo Click()
Class tButton From XButton
METHOD OnClick(oSender)
EndClass
//------------------------------------------------------------------------------
METHOD OnClick(oSender) CLASS tButton
Local lOk:=.T.
local oParent := Self:oParent
Self:lEnabled:=.F.
lOk:=Self:Super:OnClick()
Self:lEnabled:=.T.
While !oParent:IsKindOf("TForm")
oParent := oParent:oParent
End
oParent:RequestState()
RETURN lOk
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
Re: Elimar Buffer del teclado
También lo hicimos para los botones de las OptionList
// Sobrecarga a TOptionItem para impedir que el doble Click ejecute 2 veces el metodo Click()
Class tOptionItem From xOptionItem
Method OnClick()
EndClass
//------------------------------------------------------------------------------
METHOD OnClick(oSender) CLASS TOptionItem
Local lOk:=.T.
local oParent := Self:oParent
Self:lEnabled:=.F.
lOk:=Self:Super:OnClick()
Self:lEnabled:=.T.
while !oParent:IsKindOf("TForm")
oParent := oParent:oParent
end
oParent:RequestState()
RETURN lOk
// Sobrecarga a TOptionItem para impedir que el doble Click ejecute 2 veces el metodo Click()
Class tOptionItem From xOptionItem
Method OnClick()
EndClass
//------------------------------------------------------------------------------
METHOD OnClick(oSender) CLASS TOptionItem
Local lOk:=.T.
local oParent := Self:oParent
Self:lEnabled:=.F.
lOk:=Self:Super:OnClick()
Self:lEnabled:=.T.
while !oParent:IsKindOf("TForm")
oParent := oParent:oParent
end
oParent:RequestState()
RETURN lOk
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
Re: Elimar Buffer del teclado
Bingen,
Como siempre, muy oportuno.
Mil y mil Gracias.
Saludos.
Como siempre, muy oportuno.
Mil y mil Gracias.
Saludos.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Auditoria y Sistemas Ltda.
Cartagena-Colombia
- ignacio
- Site Admin
- Mensajes: 9319
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Elimar Buffer del teclado
Buenos días,
Le ruego incluya este UNICO código en cualquiera de sus botones:
Le aseguro, que verá un único logdebug() y el próximo no aparecerá hasta pasados cinco segundo. Incluso aunque destroce el teclado pulsando la tecla Intro de forma convulsiva.
Haga la prueba.
Para que vea que no hay trampa. Usemos un bucle Harbour:
Qué curioso. Paso lo mismo: sólo un LogDebug() cada cinco segundo ¿Alguna conclusión?
Ahora vamos a incluir lo que le he dicho que no debe de hacer:
¡¡¡Ahivá!!!! Ahora si veo múltiples llamadas a LogDebug().
En fin. Espero que ahora quede más claro
Saludos
NOTA: En contadas ocasiones Xailer realiza llamadas a ProcessMessages() y una de ellas es con TDatasource:lAllowProcessMessages a .T.. Mi recomendación es que lo pongo a falso
Le ruego incluya este UNICO código en cualquiera de sus botones:
Código: Seleccionar todo
METHOD Button1Click( oSender ) CLASS TForm1
LogDebug( "Click" )
Sleep(5000)
RETURN Nil
Haga la prueba.
Para que vea que no hay trampa. Usemos un bucle Harbour:
Código: Seleccionar todo
METHOD Button1Click( oSender ) CLASS TForm1
LOCAL nSecs := Seconds() + 5
LogDebug( "Click" )
DO WHILE Seconds() < nSecs
ENDDO
RETURN Nil
Ahora vamos a incluir lo que le he dicho que no debe de hacer:
Código: Seleccionar todo
METHOD Button1Click( oSender ) CLASS TForm1
LOCAL nSecs := Seconds() + 5
LogDebug( "Click" )
DO WHILE Seconds() < nSecs
ProcessMessages() <<<<<<<<<<<<<<<<<<<<<<<<<<<
ENDDO
RETURN Nil
En fin. Espero que ahora quede más claro
Saludos
NOTA: En contadas ocasiones Xailer realiza llamadas a ProcessMessages() y una de ellas es con TDatasource:lAllowProcessMessages a .T.. Mi recomendación es que lo pongo a falso
Re: Elimar Buffer del teclado
Tuve un caso similar hace rato, y me pasó igual que aunque deshabillitara el botón o el Form se generaban varios procesos.
Lo que hice es poner una Dato en la clase inicializado a .f. y cuando entraba a dicho proceso lo pasaba a .t. y lo comparaba, si estaba en .t. interrumpo el proceso.
Method BtnClic( oSender ) Class MiClase
If ( ::lGrabando )
Return ( Nil )
End
::lGrabando := .t.
///Proceso de grabado
::lGrabando := .f.
Return ( Nil )
Espero te sirva y me haya explicado.
Saludos.
Lo que hice es poner una Dato en la clase inicializado a .f. y cuando entraba a dicho proceso lo pasaba a .t. y lo comparaba, si estaba en .t. interrumpo el proceso.
Method BtnClic( oSender ) Class MiClase
If ( ::lGrabando )
Return ( Nil )
End
::lGrabando := .t.
///Proceso de grabado
::lGrabando := .f.
Return ( Nil )
Espero te sirva y me haya explicado.
Saludos.
Re: Elimar Buffer del teclado
Gracias Ramon, aplique algo igual a tu sugerencia.
Lo de Bingen, es ideal, pero me daba problemas con los folders como contenedor del From y
necesitaba hacer algo rápido para el cliente.
Muchas gracias por la sugerencia,
Lo de Bingen, es ideal, pero me daba problemas con los folders como contenedor del From y
necesitaba hacer algo rápido para el cliente.
Muchas gracias por la sugerencia,
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Auditoria y Sistemas Ltda.
Cartagena-Colombia