Frage

Ich bin mit einem Delphi TActionList, mit Shortcut-Tasten für einige Aktionen.

Ich möchte von bestimmten Aktionen verhindern, dass sie mehrmals durch Tastatur Auto-Repeat ausgelöst wird, aber ich weiß nicht wollen global Auto-Repeat-Betrieb beeinflussen. Was ist der beste Weg, dies zu tun?

Klarstellung : Ich muß noch mehr schnellen Drücken von Tasten handhaben - es ist nur die erzeugten Drücken von Tasten durch Auto-Repeat, die ich will ignorieren.

War es hilfreich?

Lösung

Intercept WM_KEYDOWN Nachrichten und schauen bei Bit 30, um zu sehen, ob es auto-Wiederholungs ist. Wenn ja, kann passieren einfach nicht auf die Nachricht wie gewohnt, und es wird nicht zu sehen.

Sie können benötigen Form Schlüssel-Vorschau zu aktivieren, um diese Arbeit zu machen.

Andere Tipps

Sie können TTimer fallen, setzen TTimer.Interval zu schätzen Sie wollen (1000 = 1 s), dann in TActionList so etwas wie:

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

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

Vergessen Sie auch nicht Timer in deaktivieren Timer.OnTimer .

Sie können die letzte Zeit sparen eine Aktion verwendet wird, und es ignorieren, wenn die Zeit dazwischen zu kurz ist. Für eine einzelne Aktion können Sie tun:

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;

Sie können dies kombinieren mit der Lösung von dmajkic ein allgemeineres aproach zu bekommen. Und wenn Sie wirklich ehrgeizig sind, können Sie eine neue Version von TAction / TActionList erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top