Delphi: Comment puis-je arrêter la répétition automatique des touches de raccourci TAction?

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

Question

J'utilise Delphi TActionList, avec des raccourcis clavier pour certaines actions.

Je veux éviter que certaines actions ne soient déclenchées plusieurs fois par la répétition automatique au clavier, mais je ne veux pas affecter le fonctionnement de la répétition automatique de manière globale. Quelle est la meilleure façon de faire cela?

Clarification : je dois encore gérer plusieurs pressions rapides sur les touches. C’est seulement les pressions de touche générées par la répétition automatique que je souhaite ignorer.

Était-ce utile?

La solution

Interceptez les messages WM_KEYDOWN et recherchez au bit 30 pour voir s’il se répète automatiquement. Si tel est le cas, ne transmettez pas le message comme d'habitude, il ne sera pas vu.

Vous devrez peut-être activer l'aperçu de clé de formulaire pour que cela fonctionne.

Autres conseils

Vous pouvez supprimer TTimer, définissez TTimer.Interval sur la valeur souhaitée (1000 = 1 s), puis, dans TActionList, effectuez les opérations suivantes:

procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
  if Timer1.Enabled then 
  begin
    Handled := True;
    Exit;
  end;

  Handled := false; 
  Timer1.Enabled := true;     
end;

N'oubliez pas non plus de désactiver le minuteur dans Minuteur.OnTimer .

Vous pouvez enregistrer la dernière fois qu'une action est utilisée et l'ignorer si la durée entre les deux est trop courte. Pour une seule action, vous pouvez faire comme:

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;

Vous pouvez combiner cela avec la solution de dmajkic pour obtenir une approche plus générique. Et si vous êtes vraiment ambitieux, vous pouvez créer une nouvelle version de TAction / TActionlist.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top