2016-12-17 7 views
0

Я хочу, чтобы переместить изображение при нажатии кнопки, Up, но есть небольшая задержка:Удаление задержки при непрерывном нажатии на клавишу

Предполагая, что я постоянно удерживая Up, изображение перемещается вверх , останавливается на ~ 1 с, а затем непрерывно поднимается.

Я хочу удалить эту задержку за 1 секунду. Я читал, что могу использовать 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

@ RyanVincent Я бы предпочел не использовать сторонние библиотеки. Но если нет другого решения, спасибо :) – Rakete1111

ответ

1

Вы можете использовать функцию GetKeyState, включенную в LCLIntf. Он вызывает функцию Win32 API GetKeyState в Windows, и на других платформах реализована пользовательская реализация. И это кросс-платформенный.

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

Вы можете начать независимое движение при первом событии нажатия клавиши. Вместо того, чтобы полагаться на последующие события нажатия клавиш, просто продолжайте перемещать изображение до тех пор, пока не будет запущено событие «вверх».

Вы уже нашли какое-то решение, но это также работает:

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; 
+0

Ничего, не думал об этом! :) – Rakete1111

0

Вам нужно добавить перекрашивать в код, чтобы обновить новое местоположение изображения.

+2

Нет, это не так. Окна красивы правильно, единственной проблемой является задержка нажатия клавиши операционной системой. – Rakete1111

+0

Извините, я не был внимательно прочитан. – Vuio