Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Аналог keypressed в Delphi


Автор: new_ 8.3.2005, 02:33
Помогите кто нибудь!! smile smile
В TP7 цикл
REPEAT
....
....
Until keypressed;

выполняется до нажатия любой кнопки на клавиатуре.
Есть ли что-нибудь аналогичное в Delphi? Очень надо!!
Заранее СПАСИБО!!

Автор: Poseidon 8.3.2005, 04:45
Не знаю что такое TP7, но в Delphi можно так (мне кажется не самый лучший вариант, но работающий):

Значит так.
1. Обьявляешь глобальную переменную типа boolean; Что то вроде этого:
Код
unit Unit1;

interface

uses
 ...


var
 Form1: TForm1;

 keypress: boolean;// это наша переменная

implementation

{$R *.dfm}

...  // тут твои процедуры, в одной из каторых цикл

end.


2. В нужной процедуре пишим вот что
Код
begin
keypress:= False;
Repeat
...// операторы цикла
until not keypress;
end;


3. И наконец в событии OnKeyPress
Код
begin
keypress:= true;
end;



Только есть определенные проблемы (я же говорю, не самый лучший вариант).
Во первых нужно еще знать в OnKeyPress чего это засунуть (формы, кнопки или еще чего), а во-вторых, лучше засунуть цикл в отдельный поток, а то вся прога "повиснет" и никакое нажатие ее не спасет.

PS. Код дан для примера, чтобы была понятна суть того, как это сделать. Использовать же такой способ (именно в случае, когда надо остановить цикл) я не рекомендую.

Автор: p0s0l 8.3.2005, 11:21
Можно использовать функцию GetKeyboardState. Она возвращает массив из 256 байт, каждому элементу соответствует определенная кнопка:
Цитата(MSDN)
When the function returns, each member of the array pointed to by the lpKeyState parameter contains status data for a virtual key. If the high-order bit is 1, the key is down; otherwise, it is up.

Тогда KeyPressed будет выглядеть примерно так:
Код
function KeyPressed : boolean;
var
 ks : TKeyboardState;
 i : integer;

begin
 Result := False;
 GetKeyboardState (ks);
 for i := Low(ks) to High(ks) do
// это чтобы клики мыши не мешались:
   if not (i in [VK_LBUTTON, VK_RBUTTON, VK_MBUTTON,]) then
     if (ks[i] and $80) <> 0 then
     begin
       Result := True;
       Break;
     end;
end;

По смыслу, возможно, нужно не все кнопки проверять, к примеру, если не надо учитывать Control, Alt, Shift, CapsLock, NumLock, ScrollLock, то будет так:
Код
function KeyPressed : boolean;
var
 ks : TKeyboardState;
 i : integer;

begin
 Result := False;
 GetKeyboardState (ks);
 for i := Low(ks) to High(ks) do
// это чтобы клики мыши не мешались:
   if not (i in [VK_LBUTTON, VK_RBUTTON, VK_MBUTTON,
                 VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
                 VK_SHIFT, VK_LSHIFT, VK_RSHIFT,
                 VK_MENU, VK_LMENU, VK_RMENU,
                 VK_NUMLOCK, VK_SCROLL, VK_CAPITAL]) then
     if (ks[i] and $80) <> 0 then
     begin
       Result := True;
       Break;
     end;
end;


Автор: new_ 9.3.2005, 21:16
Большущее спасибо Poseidon и p0s0l за предоставленные примеры, обязательно проверю, а в OnKeyPress не заходит ни разу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)