我想在按下按钮 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;
那么,我该如何解决这个问题?
答案 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)
您需要在代码中添加重绘以刷新图像的新位置。