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.

Elimar Buffer del teclado

Foro de Xailer profesional en español
Responder
Avatar de Usuario
gerencia
Mensajes: 286
Registrado: Sab Jun 20, 2009 6:01 pm

Elimar Buffer del teclado

Mensaje por gerencia »

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.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9319
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Elimar Buffer del teclado

Mensaje por ignacio »

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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
gerencia
Mensajes: 286
Registrado: Sab Jun 20, 2009 6:01 pm

Re: Elimar Buffer del teclado

Mensaje por gerencia »

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.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9319
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Elimar Buffer del teclado

Mensaje por ignacio »

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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Elimar Buffer del teclado

Mensaje por bingen »

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
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 581
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Re: Elimar Buffer del teclado

Mensaje por bingen »

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
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
gerencia
Mensajes: 286
Registrado: Sab Jun 20, 2009 6:01 pm

Re: Elimar Buffer del teclado

Mensaje por gerencia »

Bingen,

Como siempre, muy oportuno.

Mil y mil Gracias.

Saludos.
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9319
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Elimar Buffer del teclado

Mensaje por ignacio »

Buenos días,

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
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:

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TForm1
   LOCAL nSecs := Seconds() + 5
   LogDebug( "Click" )
   DO WHILE Seconds() < nSecs
   ENDDO
RETURN Nil
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:

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TForm1
   LOCAL nSecs := Seconds() + 5
   LogDebug( "Click" )
   DO WHILE Seconds() < nSecs
     ProcessMessages() <<<<<<<<<<<<<<<<<<<<<<<<<<<
   ENDDO
RETURN Nil
¡¡¡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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ramonzea
Mensajes: 131
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: Usa
Contactar:

Re: Elimar Buffer del teclado

Mensaje por ramonzea »

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.
Avatar de Usuario
gerencia
Mensajes: 286
Registrado: Sab Jun 20, 2009 6:01 pm

Re: Elimar Buffer del teclado

Mensaje por gerencia »

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,
Jose David Angulo Urzola
Auditoria y Sistemas Ltda.
Cartagena-Colombia
Responder