Delphi: Come posso interrompere la ripetizione automatica dei tasti di scelta rapida TAction?

StackOverflow https://stackoverflow.com/questions/503538

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top