Página 1 de 1

Elimar Buffer del teclado

Publicado: Jue Sep 14, 2023 6:44 pm
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.

Re: Elimar Buffer del teclado

Publicado: Vie Sep 15, 2023 4:33 pm
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

Re: Elimar Buffer del teclado

Publicado: Vie Sep 15, 2023 8:10 pm
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.

Re: Elimar Buffer del teclado

Publicado: Lun Sep 18, 2023 11:07 am
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

Re: Elimar Buffer del teclado

Publicado: Mar Sep 26, 2023 7:55 am
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

Re: Elimar Buffer del teclado

Publicado: Mar Sep 26, 2023 7:56 am
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

Re: Elimar Buffer del teclado

Publicado: Mié Sep 27, 2023 4:47 pm
por gerencia
Bingen,

Como siempre, muy oportuno.

Mil y mil Gracias.

Saludos.

Re: Elimar Buffer del teclado

Publicado: Mié Sep 27, 2023 6:03 pm
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

Re: Elimar Buffer del teclado

Publicado: Lun Oct 16, 2023 8:29 pm
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.

Re: Elimar Buffer del teclado

Publicado: Mar Oct 17, 2023 4:13 am
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,