Delphi: Come posso interrompere la ripetizione automatica dei tasti di scelta rapida TAction?
-
20-08-2019 - |
Domanda
Sto usando un Delphi TActionList, con tasti di scelta rapida per alcune azioni.
Voglio impedire che determinate azioni vengano attivate più volte dalla ripetizione automatica della tastiera, ma non intendo influenzare l'operazione di ripetizione automatica a livello globale. Qual è il modo migliore per farlo?
Dichiarazione : Devo ancora gestire più pressioni rapide multiple: sono solo le pressioni generate dalla ripetizione automatica che voglio ignorare.
Soluzione
Intercetta i WM_KEYDOWN e guarda al bit 30 per vedere se si sta ripetendo automaticamente. In tal caso, non trasmettere il messaggio come al solito e non verrà visualizzato.
Potrebbe essere necessario abilitare l'anteprima della chiave del modulo per farlo funzionare.
Altri suggerimenti
Puoi rilasciare TTimer, impostare TTimer.Interval sul valore desiderato (1000 = 1sec), quindi in TActionList fai qualcosa del tipo:
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
Inoltre, non dimenticare di disabilitare il timer in Timer.OnTimer .
È possibile salvare l'ultima volta che si utilizza un'azione e ignorarla se l'intervallo di tempo è troppo breve. Per una singola azione puoi fare come:
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;
Puoi combinarlo con la soluzione di dmajkic per ottenere un approccio più generico. E se sei davvero ambizioso, puoi creare una nuova versione di TAction / TActionlist.