Помощь - Поиск - Пользователи - Календарь
Полная версия: If Keypressed Then Ch:=readkey;
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Morfey85
Перешёл из паскаля в делфи

столкнулся с проблемой:

в паскале при нажатии кнопки считывал символ так: if KeyPressed then ch:=ReadKey;
В делфи такое что то не катит пишет Undeclared identifier...
Как мне реализовать это в Делфях подскажите.
volvo
Здесь глянь:
Crt в дельфи
Morfey85
Спасибо, но я бы хотел узнать как в делфи реализовано перехват кода клавиатуры в программу.
volvo
Ну, это смотря чем ты пользуешься. Если используешь VCL - то есть событие OnKeyPress. Если WinAPI - то немного по-другому...
Morfey85
VCL я думаю, в WinAPI лезть пока боюсь.

OnKeyPress это событие.

Что мне делать если в бесконечном цикле , я должен при нажатии калвиши либо выйти из цикла либо изминить какие то переменные?

Чесно говоря пишу игру.
Грубо говоря у меня идет процесс падения какогото "шарика".
В процесс падения я хочу поменять фон (использую TImage) при нажатии стрелочек на клавиатуре.
мисс_граффити
я в змейке писала так:

procedure TForm1.KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
vk_down: if napravl<>nup then
napravl:=ndown;
vk_up: if napravl<>ndown then
napravl:=nup;
vk_left: if napravl<>nright then
napravl:=nleft;
vk_right: if napravl<>nleft then
napravl:=nright;
end;
end;


то есть при нажатии стрелки менялось направление змейки.
мне кажется, тебя что-то подобное должно устроить... но это все равно обработчик события.
Morfey85
procedure TForm1.KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
vk_down: if napravl<>nup then
napravl:=ndown;
vk_up: if napravl<>ndown then
napravl:=nup;
vk_left: if napravl<>nright then
napravl:=nleft;
vk_right: if napravl<>nleft then
napravl:=nright;
end;
end;


это меня утраивает есть только одно НО.

У меня в прецессе игры идет бесконечный цикл падения "шариков" и в процессе его выполнения я не могу обработать событие KeyDown.

Подскажите либо как мне обработку клвиатуры сделать внутри цикла либо как сделать так чтобы шарики падали сами по себе, в то время как я мог бы выполнять другие действия.
volvo
Добавь Application.ProcessMessages в цикле, и ты сможешь реагировать на нажатия клавиш тоже...
мисс_граффити
а как цикл реализован? может, сделать привязку к таймеру?
Morfey85
Application.ProcessMessages помогло. Только я теперь из цикла выйти не могу и из програмы тоже пока не нажму Еsc(k:=5) и только потом могу выйти.

procedure TForm1.N2Click(Sender: TObject);
var
i,g:word; //откуда падают яйца и жизни
begin
randomize;
o:=0;k:=1;g:=3;
Image1.Picture.LoadFromFile(FonFile(k));

repeat
i:=random(3)+1;
repeat

Image1.Picture.LoadFromFile(FonFile(k));
нарисовать яйцо
преместить его координаты
Application.ProcessMessages;
until яйцо дошло доконца;
if i=k then inc(o) else dec(g);
until g=0;
end;


Что там нащет Таймера?.

Кому интересно что я вообще намучил можете скачать посмотреть тут может что посоветуете.
Morfey85
Всем спасибо за помощь. Везде разобрался, игру дописал.
Если хотите окончательный вариант можно скачать тут
мисс_граффити
что НЕ понравилось:
момент первый - принципиальный. мерзкое мерцание.
сделай так:
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:=true;<-----добавь эту строку
k:=0;
Image1.Picture.LoadFromFile(FonFile(k));
end;

и будет замечательно

момент второй - менее значительный. пользователю незаметный....
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if GameOver=false then
begin
case Key of
39: if (k<>2)and(k<>4) then k:=k+1;
37: if (k<>1)and(k<>3)and(k<>0) then k:=k-1;
38: if (k<>4)and(k<>3) then k:=k+2;
40: if (k<>1)and(k<>2)and(k<>0) then k:=k-2;
end;
Image1.Picture.LoadFromFile(FonFile(k));
Image1.Canvas.Ellipse(x-5,y-5,x+5,y+5);
end;
end;

немножко смущает выбор по кодам (39, 40...). может, это я дура, но коды всех клавиш не помню. напиши лучше vk_down, vk_up... имхо, будет лучше читаться. или у твоего варианта есть преимущества, просто я не знаю?

Таймеров, я так понимаю, уже сам понапихал, на вопрос ("Что там нащет Таймера?") можно не отвечать?

вообще игра порадовала... воспоминания из раннего-раннего детства smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.