Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2010, 10:07   #1
wizard3d3000
Новичок
Джуниор
 
Регистрация: 04.09.2010
Сообщений: 4
По умолчанию FormKeyPress в цикле

Здравствуйте, я навичок в программировании. Помогите пожалуйста.
Мне нужно что бы программа по нажатию какой либо клавиши начинала работу в цикле. По нажатию на другую клавишу выходила из цикла.

вот пример моей "болванки" для программы:

Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
flag,i:integer;
begin
   flag:=1;
    while flag<1000 do
     begin
      if Key in['b']  then  flag:=1500; end;
     end;
end;
Программа начинает работать по нажатию на любую клавишу. Если нажать кнопку 'b' то значение флага станет больше 1000 и программа должна выйти из цикла. ПОЧЕМУ НА НЕ ВЫХОДИТ?
wizard3d3000 вне форума Ответить с цитированием
Старый 04.09.2010, 10:33   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Код:
  if Key in['b']  then  flag:=1500; end;
Лучше напиши
Код:
  if Key = 'b' then  flag:=1500; end;
_-Re@l-_ вне форума Ответить с цитированием
Старый 04.09.2010, 11:18   #3
wizard3d3000
Новичок
Джуниор
 
Регистрация: 04.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Код:
  if Key in['b']  then  flag:=1500; end;
Лучше напиши
Код:
  if Key = 'b' then  flag:=1500; end;
Спасибо, так красивее, но всё равно ничего не работает. Такое чувство как будто програ просто зависает ((
wizard3d3000 вне форума Ответить с цитированием
Старый 04.09.2010, 11:22   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Вставь Application.ProcessMessages сюда:
Код:
 while flag<1000 do
     begin
    Application.ProcessMessages
А вообще я бы сделал по-другому. Объявил flag, как глобальную переменную, а потом:
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    repeat
     begin
       Application.ProcessMessages;
       if Key = 'b' then  flag:=1500;
     end;
    until flag>1000;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  flag:=1;
end;
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 04.09.2010 в 11:39.
DIgorevich вне форума Ответить с цитированием
Старый 04.09.2010, 11:40   #5
wizard3d3000
Новичок
Джуниор
 
Регистрация: 04.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от DIgorevich Посмотреть сообщение
Вставь Application.ProcessMessages сюда:
Код:
 while flag<1000 do
     begin
    Application.ProcessMessages
Спасибо, программа не стала виснуть. Просто почемуто она не заходит в цикл по нажатию клавиши b.

Код:
 flag:=1000; s:=10;

    while flag<1200 do
     begin
        Application.ProcessMessages;
        s:=s+1;
        form1.Label1.Caption:=IntToStr(s);
        if Key = 'b' then flag:=1500;
        form1.Label3.Caption:=IntToStr(flag);
     end;
т.е. Я нажимаю любую клавишу и вижу как переменная s наращивается, а как я нажимаю 'b' флаг должен стать больше чем 1000 и программа должна выйти из этого цикла, но при нажатии на клавишу программа из цикла не выходит. даже если я пропишу вот такой код:
Код:
 if Key = 'b' then begin label1.capion:='123123' flag:=1500; end;
, программы не прописывает это значение label1, т.е. она даже не заходит в цикл по нажатию b.
wizard3d3000 вне форума Ответить с цитированием
Старый 04.09.2010, 11:43   #6
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Важно учитывать, что всякое присвоение значение переменной тут:
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
flag,i:integer;
begin
   flag:=1;
Будет происходить каждый раз при нажатии любой клавиши.


Вот мой рабочий вариант:
Код:
var
  Form1: TForm1;
  flag,s:integer;
implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    repeat
     begin
       s:=s+1;
       Application.ProcessMessages;
       if Key = 'b' then  flag:=1500;
       Form1.Caption:=IntToStr(s);
     end;
    until flag>1000;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  flag:=1;
  s:=10;
end;
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 04.09.2010 в 11:46.
DIgorevich вне форума Ответить с цитированием
Старый 04.09.2010, 11:46   #7
wizard3d3000
Новичок
Джуниор
 
Регистрация: 04.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от DIgorevich Посмотреть сообщение
Вставь Application.ProcessMessages сюда:
Код:
 while flag<1000 do
     begin
    Application.ProcessMessages
А вообще я бы сделал по-другому. Объявил flag, как глобальную переменную, а потом:
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    repeat
     begin
       Application.ProcessMessages;
       if Key = 'b' then  flag:=1500;
     end;
    until flag>1000;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  flag:=1;
end;
Спасибо Вам большое, всё заработало.
wizard3d3000 вне форума Ответить с цитированием
Старый 04.09.2010, 12:10   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну вот, пока делал свой вариант, уже решили вопрос. Ну да ладно. Так даже лучше. На интересный вопрос должно быть много ответов.

Короче, вот мой криатиф: KeyDown в цикле.zip
Два нюанса
Нюанс №1:
Вместо KeyPress использую KeyDown. В KeyPress имеет значение текущая раскладка (язык) и нажатие Shift (заглавные/прописные).
Нюанс №2:
Думаю, Flag типа Boolean подходит гораздо лучше.
Нюанс №3: Считать научись умник (добавлено 6-ой (злой) личностью автора)
Программа не закрывается, пока не остановлен процесс.
Sibedir вне форума Ответить с цитированием
Старый 04.09.2010, 12:31   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

wizard3d3000
Вы изначально неправильно придумали как надо решать Вашу задачу!
Поверьте, цикл внутри процедуры FormKeyPress Вам НЕ НУЖЕН!
Там нужно только включение/выключение какого-нибудь флага(семафора), а возможно и запуск/остановка таймера - чувствую, оттуда у задачи ноги растут...

Расскажите, ЧТО Вы хотите получить от работающей программы, тогда легче будет Вам объяснить КАК этого добиться.


_______________
ДОБАВЛЕНО
пока читал/писал, похоже, уже заставили Ваш цикл работать. Если Вас устраивает такое решение, то тему можно закрыть, хотя я остаюсь при своём мнении — изначальная задача может быть решена по другому, более "красиво"

Последний раз редактировалось Serge_Bliznykov; 04.09.2010 в 12:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.09.2010, 12:34   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да, да. Слушайте Serge_Bliznykov'а.
Это, кстати, нюанс №4.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в цикле Belokuraya Microsoft Office Excel 11 18.08.2009 15:52
Проблема в цикле Fekla Общие вопросы C/C++ 4 28.06.2009 12:50
Ошибка в цикле Alamez Общие вопросы Delphi 2 05.04.2009 15:12