2009-02-02 5 views
3

J'utilise une TActionList Delphi, avec des touches de raccourci pour certaines actions.Delphi: Comment arrêter automatiquement les touches de raccourci TAction?

Je veux empêcher certaines actions d'être déclenchées plusieurs fois par l'auto-répétition du clavier, mais je ne veux pas affecter globalement l'opération de répétition automatique. Quelle est la meilleure façon de faire cela?

Précision: Je dois encore gérer plusieurs pressions sur les touches rapides - il est seulement les pressions sur les touches générées par répétition automatique que je veux ignorer.

Répondre

12

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

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

2

Vous pouvez déposer TTimer, définissez TTimer.Interval vous voulez la valeur (1000 = 1sec), puis à TActionList faire quelque chose comme:

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

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

Aussi, ne pas oublier de désactiver la minuterie dans Timer.OnTimer.

+0

Pas tout à fait ce que je veux. Il est toujours important que l'utilisateur puisse appuyer rapidement sur la touche, mais les traits d'auto-traitement doivent être ignorés. – Roddy

0

Vous pouvez enregistrer la dernière utilisation d'une action et l'ignorer si l'intervalle entre les deux est trop court. Pour une seule action que 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 aproche plus générique. Et si vous êtes vraiment ambitieux, vous pouvez créer une nouvelle version de TAction/TActionlist.

Questions connexes