Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
1-90297
Romul
2002-01-09 09:52
2002.01.28
Удаление непечатных символов из строки


1-90323
Surprising
2002-01-06 17:36
2002.01.28
Сохранить форму как файл графики


4-90435
wHammer
2001-11-30 11:50
2002.01.28
Звук


1-90270
dimonf
2002-01-09 21:24
2002.01.28
Народ, как маштабировать одну ось в графике, например Y?


6-90347
Kyd
2001-11-05 20:16
2002.01.28
Телнет на ClientSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский