Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tecla presionada continuamente (https://www.clubdelphi.com/foros/showthread.php?t=44326)

tonyluna36 04-06-2007 09:22:27

Tecla presionada continuamente
 
Hola.

Por ejemplo en un memo, cuando dejas presionada una tecla, se generan repeticiones de la misma hasta que la sueltas. ¿ Existe alguna manera de evitar esto ?. Es decir si presionas una tecla, que se escriba una vez, y si sigue pulsada la tecla que no se escriba más.

Gracias
Salu2.

BuenaOnda 04-06-2007 09:47:46

lo que podrias hacer es utilizar una variable "global" de tipo char y preguntar si el valor de esa variable es igual a la tecla pulsada, entonces que el valor de la tecla pulsada sea 0, osea no se escriba nada, todo esto en el evento keypress..

Código Delphi [-]
var
  tecla : char;
 
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
     IF(key=#32)OR(Key=#13) THEN Exit; //Si Quieres que se presionen  
                                                       //espacios o la tecla enter.
     IF tecla= Key THEN
        key:=#0
     ELSE
        tecla:=key;
end;

lo malo es que existen palabras que poseen letreras repetitivas como "coordinación ".. bueno quizas algun compañero nos pueda dar una mejor respuesta.. bueno espero haberte ayudado en algo...:D

Lepe 04-06-2007 16:23:41

Windows tiene esa opción para el teclado en el panel de control, puede que capture esos mensajes antes que tu aplicación, habría que hacer pruebas. Ese valor se rescata desde el registro de windows, las claves interesantes son :

- AutoRepeatDelay: (valor 1000 milisegundos). En el panel de control -> Teclado, se corresponde con "Retraso de la repetición".

- AutoRepeatRate: (valor 500 milisegundos). Corresponde a "Velocidad de repeticion".

No me gustaría modificar el registro de windows, ya que afectaría a todo programa, aunque seria el proceso mas simple, poner a AutoRepeatDelay, por ejemplo a 10.000, de forma que debes mantener presionada la tecla 10 segundos para que empiece a repetirse automaticamente.

Desconozco otro metodo.

Saludos

seoane 04-06-2007 17:33:45

Creo que puedo estar matando moscas a cañonazos, pero podemos usar un hook.
Código Delphi [-]
var
  // Esta es una variable global
  Hook: HHook;

function KeyboardProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall;
begin
  if Code = HC_ACTION then
  begin
    // Aqui comprobamos si es una pulsacion y si ya estaba pulsada antes
    if LParam and $C0000000 = $40000000 then
    begin
      // y si ya estaba pulsada con antes, ignoramos la repeticion 
      Result:= 1;
      Exit;
    end;
  end;
  Result := CallNextHookEx(Hook, Code, WParam, LParam);
end;

Para instalar y desinstalar el hook usamos las siguientes instrucciones:
Código Delphi [-]
// Para instalar. Limitamos el hook al thread actual
  Hook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, 0, GetCurrentThreadId);
// Para desinstalar
  if Hook <> 0 then UnhookWindowsHookEx(Hook);

Coloca esas dos instrucciones en el lugar adecuado, en los eventos OnCreate y OnClose, por ejemplo, o en sección intialization/finalization.
Código Delphi [-]
initialization
  Hook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, 0, GetCurrentThreadId);
finalization
  if Hook <> 0 then UnhookWindowsHookEx(Hook);


La franja horaria es GMT +2. Ahora son las 12:08:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi