Delphi: Como faço para interromper o atalho de atalho Taction.
-
20-08-2019 - |
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 - é só Os pressáticos de chave gerados por repetição automática que eu quero ignorar.
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.