Hallo,
ja es ist richtig. Wenn man eine Taste gedrückt hält, dann wird auch das OnKeyDown-Event wiederholt ausgeführt. Das ist aber anders als bei den DXInput.States. Beispiel: Ich halte die Taste "f" ein paar Sekunden fest:
ffffffffffffffffffffffffff
Nach dem ersten Tastendruck ist eine kleine Pause und dann kommen ganz viele "f"s. Bei jedem f würde jetzt das OnKeyDown-Event ausgeführt. Das hat allerdings nichts mit den Frames des Timers zu tun. In den meisten Fällen halte ich diese Umsetzung aber für ausreichend.
Ansonsten eine neue Idee:
Für jede Taste, um die es geht, eine Variable vom Typ boolean an. Für die Taste "Links" zum Beispiel:
Delphi-Quellcode:
var
Form1: TForm1;
GedrLinks: Boolean;
// usw...
implementation
Denn setzt du ganz an den Schluss der Timer-Prozedur folgendes:
GedrLinks:= (isleft in Form1.DxInput1.States);
Nun kannst du irgendwo
vorher in dieser Timer-Prozedur folgendes abfragen:
if (not GedrLinks) and (isleft in Form1.DxInput1.States) then //Code
D.h. in dem vorherigen Frame darf die Taste nicht gedrückt gewesen sein, aber jetzt muss sie es.
So sollte es klappen.
Grüße
Seniman