Delphi: ¿Cómo detengo las teclas de método abreviado de TAction para que se vuelvan a repetir automáticamente?
keyboard autorepeat (3)
Estoy usando Delphi TActionList, con teclas de acceso directo para algunas acciones.
Quiero evitar que ciertas acciones se desencadenen varias veces mediante la repetición automática del teclado, pero no quiero afectar la operación de repetición automática de forma global. ¿Cuál es la mejor manera de hacer esto?
Aclaración : todavía tengo que manejar múltiples pulsaciones de teclas rápidas; solo quiero presionar las teclas que se generan mediante la repetición automática.
Intercepta los mensajes WM_KEYDOWN y mira el bit 30 para ver si se repite automáticamente. Si lo es, simplemente no pase el mensaje como de costumbre y no se verá.
Es posible que deba habilitar la vista previa de clave de formulario para que esto funcione.
Puede soltar TTimer, establecer TTimer.Interval en el valor que desee (1000 = 1seg), luego en TActionList hacer algo como:
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
Además, no olvide desactivar el temporizador en Timer.OnTimer .
Puede guardar la última vez que se utiliza una acción e ignorarla si el tiempo intermedio es demasiado corto. Para una sola acción, puede hacer lo siguiente:
procedure TForm.FormCreate(const Sender: TObject);
begin
// ...
FLastActionTime := Now; //
end;
proceudure TForm.Action1Execute(const Sender: TObject);
const
cThreshold = 1/(24*60*60*10); // 0.1 sec
begin
if Now-FLastActionTime<cThreshold then
Exit; // Ignore two actions within 0.1 sec
FLastActionTime := Now;
end;
Puede combinar esto con la solución de dmajkic para obtener un enfoque más genérico. Y si eres realmente ambicioso, puedes crear una nueva versión de TAction / TActionlist.