连续按键时消除延迟

时间:2016-12-17 14:53:56

标签: lazarus delphi

我想在按下按钮 Up 时移动图像,但有一点延迟:

假设我一直按住 Up ,图像会向上移动,停止约1秒,然后持续上升。

我想删除1s延迟。我读到我可以使用GetAsyncKeyState,但因为我在Linux上这个win32功能不可用。此外,跨平台解决方案更好。

这是我目前的代码:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_LEFT then
      Image1.Left := Image1.Left - 1
  else if Key = VK_RIGHT then
      Image1.Left := Image1.Left + 1;
end;

那么,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您可以使用GetKeyState中包含的获取LCLIntf功能。它在Windows上调用Win32 API函数GetKeyState,并且在其他平台上有自定义实现。所以它是跨平台的。

procedure TForm1.checkKeyboard();
begin
    // When a key is down, the return value of GetKeyState has the high bit set,
    // making the result negative.
    if GetKeyState(VK_LEFT) < 0 then
        moveLeft(); // whatever
    //...
end;

答案 1 :(得分:1)

您可以在首次按键事件中开始独立动作。不要依赖后续的按键事件,只需继续移动图像,直到触发按键事件为止。

您已经找到了一些解决方案,但这也有效:

type
  TMovement = (movNone, movLeft, movRight);

var
  movement: TMovement = movNone;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if movement <> movNone then
    exit;

  case Key of
    VK_LEFT: MoveLeft;
    VK_RIGHT: MoveRight;
  else
    movement := movNone;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  movement := movNone;
end;

procedure TForm1.MoveLeft;
begin
  movement := movLeft;
  repeat
    if Image1.Left > 0 then
      Image1.Left := Image1.Left - 1;
    sleep(1);
    Application.ProcessMessages;
  until movement <> movLeft;
end;

答案 2 :(得分:0)

您需要在代码中添加重绘以刷新图像的新位置。