Delphi: Comment puis-je arrêter la répétition automatique des touches de raccourci TAction?
-
20-08-2019 - |
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.
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.