Pergunta

Estou usando uma lista de Taction Delphi, com teclas de atalho para algumas ações.

Quero impedir que certas ações sejam desencadeadas várias vezes por repetição automática do teclado, mas eu faço não Deseja afetar a operação automática de repetição global. Qual é a melhor maneira de fazer isso?

Esclarecimento: Eu ainda preciso lidar com vários tens rápidos - é Os pressáticos de chave gerados por repetição automática que eu quero ignorar.

Foi útil?

Solução

Interceptar o Wm_keydown mensagens e observe o bit 30 para ver se está repetindo automaticamente. Se for, apenas não passe a mensagem como de costume e ela não será vista.

Pode ser necessário ativar a previsão de teclas para fazer isso funcionar.

Outras dicas

Você pode soltar ttimer, definir ttimer.interval como valor que desejar (1000 = 1seg) e, na tactionlist, faça 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;

Também não se esqueça de desativar o cronômetro em Timer.ontimer.

Você pode salvar a última vez que uma ação é usada e ignorá -la se o tempo intermediário for muito curto. Para uma única ação que você pode fazer:

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;

Você pode combinar isso com a solução do DMAJKIC para obter uma abordagem mais genérica. E se você é realmente ambicioso, pode criar uma nova versão do Taction/TactionList.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top