Wenn du im OnKeyDown den Wert der Verschiebung einfach so veränderst, kann es sein dass zwischen 2x rendern unterschiedlich viele mal das Event aufgerufen wird. Deshalb würd ich im OnKeyDown einen boolean setzen, die festhält, dass die taste gedrückt wurde. In deinem Timer überprüfst du dann, ob die variable gesetzt worden ist. Wenn ja, dann die zu verschiebende Strecke ändern und den boolean wieder auf false setzen, damit sich das Quad nur wieder bewegt, wenn der boolean von dem keydown geändert wird.
Falls das jetzt zu kompliziert formuliert war^^:
Delphi-Quellcode:
var
MoveLeft: Boolean;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_LEFT then
MoveLeft := true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MoveLeft then
begin
dx := dx - 5;
MoveLeft := false;
end;
end;