Pregunta

Estoy usando una lista de acciones de Delphi, con teclas de acceso directo para algunas acciones.

Quiero evitar que ciertas acciones se activen varias veces mediante la repetición automática del teclado, pero no quiero afectar la operación de repetición automática a nivel mundial. ¿Cuál es la mejor manera de hacer esto?

Aclaración : todavía necesito manejar múltiples pulsaciones rápidas de teclas; son solo las pulsaciones de teclas generadas por la repetición automática que quiero ignorar.

¿Fue útil?

Solución

Intercepte los mensajes WM_KEYDOWN , y mire en el bit 30 para ver si se repite automáticamente. Si es así, 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.

Otros consejos

Puede soltar TTimer, establecer TTimer.Interval en el valor que desee (1000 = 1seg), luego, en TActionList, haga 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;

Tampoco olvides desactivar el temporizador en Timer.OnTimer .

Puede guardar la última vez que se usa una acción e ignorarla si el tiempo intermedio es demasiado corto. Para una sola acción, puede hacer como:

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 es realmente ambicioso, puede crear una nueva versión de TAction / TActionlist.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top