Форум: "Основная";
Текущий архив: 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