Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.28;
Скачать: CL | DM;

Вниз

Подскажите, в чем ошибка: задаю цикл   Найти похожие ветки 

 
Vacheslav ©   (2002-01-09 19:49) [0]

while (not keypressed)or(i=50) do
bedin
...
end;
а по нажатию клавиши цикл не прерывается


 
Андрей Сенченко ©   (2002-01-09 19:57) [1]

А как Ты определяешь что он не прерывается ?


 
-=gene green=-   (2002-01-09 19:58) [2]

Попробуй так:


Repeat

...

...

Until Keypressed or (I=50);



 
Vacheslav ©   (2002-01-09 19:59) [3]

У меня змейка должна полти до стенки либо до нажатия клавиши. На нажатия не реагирует.


 
Vacheslav ©   (2002-01-09 19:59) [4]

У меня змейка должна ползти до стенки либо до нажатия клавиши. На нажатия не реагирует.


 
Андрей Сенченко ©   (2002-01-09 20:07) [5]

Я правильно понимаю, что речь идет о DOS-овской программе на Паскале ?


 
Юрий Зотов ©   (2002-01-09 20:18) [6]

Вероятно I - это позиция змейки, а 50 - это позиция границы?

Тогда нужно, например, так:

while not KeyPressed and (i <= 50) do
begin
...
Inc(I) { Чтобы могло сработать второе условие }
end;

И, конечно, это для TP под DOS - в Delphi KeyPressed нет.


 
Vacheslav ©   (2002-01-09 20:36) [7]

Нет, в Дельфи. Я использую модуль crt. Подскажите тогда аналог лун keypressed для дельфи.
Вариант от Юрий Зотов © (09.01.02 20:18) не работает (я его и использовал). Та же история при использовании процедуры OnKeyPressed: Цикл не прирывается при изменении key
ch:=key;
while (key<>ch)or(i=50) do
...
inc(i);
В чем дело?


 
Андрей Сенченко ©   (2002-01-09 20:46) [8]

1. Можно поинтересоваться - как Ты подключаешь CRT к Delphi ?
2. Зачем Ты это делаешь ?
...
Собственно реализация в WIN-дах должна строиться иначе. Не знаю как мастера Delph-ей, но я в таких случаях ставлю обработчик
Application.ProcessMessage.


 
Андрей Сенченко ©   (2002-01-09 20:50) [9]

Хотя в Твоем случае, возможно, будет достаточно описать событие
TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);


 
Vacheslav ©   (2002-01-09 22:20) [10]

Тогда попробуй набрать
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var ch:word;
begin
ch:=key;
while ch=key do
Label1.Caption:=Label1.Caption+chr(ch);
end;
Зацикливается.


 
Андрей Сенченко ©   (2002-01-09 22:28) [11]

Ну естественно, потому что его никто ( KEY:Word ) не обнулял в отличии от DOS-овской процедуры Readkey например.

Повторяю : не видя Твоего кода могу предположить, что Тебе можно сделать следующее:
1. При входе в цикл "движения змейки" передать фокус любому объекту, которрый ловит событие KeyDown
2. При проходе в теле цикла проверять состояние какой-нибудь логической переменной, например
IsKeyPressed : boolean
и если оно True - делать BREAK на цикл.
3. В обработчике KeyDown написать
IsKeyPressed := true;


По-моему так, но это решение безусловно не оптимально. Если есть время - дождись появления ( завтра ) действительно мастеров. Нои предложат более изящный вариант


 
vacheslav ©   (2002-01-10 21:21) [12]

Нифига. Сделал так
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawGrid1.setfocus;
repeat
if IsKeyPressed then begin
run(i,j);
inc(i);
DrawGrid1.setfocus
end
else break;
until i=20
end;
procedure TForm1.DrawGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
IsKeyPressed:=false;
end;
Нифига. Мастера, где вы?


 
Sail ©   (2002-01-11 04:11) [13]

Ежели змейка должна ползти по формочке, то у этой самой формы надо поставить сво-во KeyPreview в true,
затем в цикле: Application.ProcessMessages; (чтобы приложение получило из очереди нажатую клавишу)
Ну а по OnKeyDown - присваивать значение флагу ("глобальной" логической переменной), или хотя бы тот же Key
примерно так:
ch := 0;
i := 0
while ch = 0 and i < 3000000 do begin //такое значение для i - просто в целях отладки
inc(i);
Application.ProcessMessages;
end;
ShowMessage(...);

тут выводишь значение i (просто для проверки)..
А когда убедишься, что осуществляется выход из цикла по нажатию клавиши, то добавишь проверку на конкретное значение нужной тебе переменной
:-)


 
Наталья ©   (2002-01-11 10:49) [14]

Если что-то должно ползти по форме, и останавливатся по нажатию на клавишу(кнопку), то можно использовать TTimer.
Примитивный пример вращения TImage по спирали:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Interval := 100;
if Alpha<=4*pi
then
begin
Image1.Left := Image1.Left +trunc(cos(Alpha)*R);
Image1.top := Image1.top +trunc(sin(Alpha)*R);
Alpha:=Alpha+DeltaAlpha;
r:=r+0.5;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
KeyPreview:=true;
R:=1;
DeltaAlpha:=2*pi/36;
Alpha:=DeltaAlpha;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Timer1.Enabled:=not Timer1.Enabled;
end;




Страницы: 1 вся ветка

Текущий архив: 2002.01.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
4-90419
bob green
2001-11-29 08:57
2002.01.28
WinAPI


3-90212
VovaKomarov
2001-12-24 11:35
2002.01.28
BLOB


3-90219
Oleg_K
2001-12-17 21:03
2002.01.28
DBEdit в фокусе


3-90224
EternalWonderer
2001-12-24 17:20
2002.01.28
Проблема с count(*) в joined запросе


14-90353
DR
2001-12-03 12:52
2002.01.28
Подскажите на чем написан этот исходник