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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2009, 22:37   #1
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
Печаль Timer и Application.ProcessMessages

Здравствуйте. У меня такая проблема. На форме имеется shape9 кот необходимо двигать по этой самой форме. Он доходит до shape1 и останавливается. У меня 2 таймера. 1ый активизирует 2ой, а 2ой выполняет передвижение shape9. Причем после того, как shape9 достигнет shape1 (в коде эт s[id]) то таймер2 останавливается. Используется внутри события OnTimer 1го таймера Application.ProcessMessages. Проблема в том, что после Application.ProcessMessages в событии OnTimer 1го таймера есть еще действия, кот необходимо выполнить, но они не выполняется. Программа просто останавливается и ничего больше не происходит. В чем ошибка?
Код
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin 
...
timer2.Enabled:=true;
while timer2.Enabled do application.ProcessMessages;
if s[id].num>0 then begin
dec(s[id].num);  label17.Caption:=inttostr(s[id].num);
shape10.Visible:=true; ...
 end;

procedure TForm1.Timer2Timer(Sender: TObject);
var xx,yy:integer;
begin
xx:=round(shape9.Left+shape9.Width/2);
if m>0 then begin
    if xx<s[id].x then begin
    shape9.Left:=shape9.Left+4;
    xx:=round(shape9.Left+shape9.Width/2);
    end
    else begin
     if n>0 then begin
     yy:=shape9.Top;
          if yy<s[id].y then begin
          shape9.top:=shape9.top+4;
          yy:=shape9.top; end;
          end
     else begin  yy:=shape9.Top;
                if yy>s[id].y then begin
                shape9.top:=shape9.top-4;
                yy:=shape9.top; end;  
                end; end;
    end
else begin
  if xx>s[id].x then begin
    shape9.Left:=shape9.Left-4;
    xx:=round(shape9.Left+shape9.Width/2);
    end
    else begin
     if n>0 then begin  yy:=shape9.Top;
          if yy<s[id].y then begin
          shape9.top:=shape9.top+4;
          yy:=shape9.top; end; end
     else begin  yy:=shape9.Top;
                if yy>s[id].y then begin
                shape9.top:=shape9.top-4;
                yy:=shape9.top; end; end; end;
    end;
if (shape9.Top=304{s[id].y}) and (shape9.Left=256{s[id].x}) then
timer2.Enabled:=false;
end;
Zerofill вне форума Ответить с цитированием
Старый 20.11.2009, 22:47   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

советую изучить на чем основан таймер.
а он основан на сообщении WM_TIMER
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.11.2009, 23:59   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
В чем ошибка?
В том, что таймер 1 "пилюёт" на активность таймера 2 и все время его запускает.
Вы разве сами этого не видите:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin 
...
timer2.Enabled:=true;
Какие интервалы установлены у таймеров?
mihali4 вне форума Ответить с цитированием
Старый 21.11.2009, 13:02   #4
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
По умолчанию

Но ведь внутри события ontimer 2го таймера идет проверка условия, которое рано или поздно все равно выполнится, а когда выполнится, тогда деактивирует этот самый второй таймер. Интервалы заданы у первого 200 мс, у второго 70 мс
В общем, сейчас в таймере 1 операции, следующие за while timer.enabled do application.processmessages; выполняются. Но! опять встает проблема.
таймер 1 должен срабатывать по условию:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if length(richedit1.Text)>1 then begin
  st:=REGetTextRange(RichEdit1,0,4);//выделяю часть текста длиной 4 символа
  id:=strtoint(st[1]);
  id2:=strtoint(st[3]);
  if (shape9.Left+shape9.width/2)<s[id].x then m:=1 else m:=-1;
  if id in second then n:=1 else n:=-1;
  timer2.Enabled:=true;
  while timer2.Enabled do application.ProcessMessages;

  if s[id].num>0 then begin 
      dec(s[id].num);
      label17.Caption:=inttostr(s[id].num);
      shape10.Visible:=true;
      shape10.Left:=round(s[id].x-shape10.Width/2);
  end; 
  st:=richedit1.Text[length(richedit1.Text)-4];
  richedit1.Text:=st;
end
else
timer1.Enabled:=false;
end;
Но он выполняет и выполняет, т.е. уменьшает s[id].num до нуля (например изначально s[id].num=6, и событие ontimer срабатывает 6 раз, хотя должно 1, потому что строка после первого выполнения события уже содержит всего лишь 1 символ).
Простите, конечно, меня за мой тупизм, но я уже не знаю что делать и за что ухватиться...

Последний раз редактировалось Zerofill; 21.11.2009 в 13:16.
Zerofill вне форума Ответить с цитированием
Старый 21.11.2009, 13:19   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Zerofill Посмотреть сообщение
Но ведь внутри события ontimer 2го таймера идет проверка условия, которое рано или поздно все равно выполнится, а когда выполнится, тогда деактивирует этот самый второй таймер. Интервалы заданы у первого 200 мс, у второго 70 мс
Сделайте первой и последней строкой :
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin 
Timer1.Enabled:=False;
...
Timer1.Enabled:=True;
 end;
mihali4 вне форума Ответить с цитированием
Старый 21.11.2009, 13:29   #6
Zerofill
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 29
По умолчанию

Получилось. Сработал 1 раз. Спасибо Вам огромное!
Zerofill вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что такое application.processMessages? TwiX Общие вопросы Delphi 4 29.07.2009 21:18
application.ProcessMessages; UROKSAN Общие вопросы Delphi 2 10.04.2008 13:32
Аналог Application.ProcessMessages() Alter Общие вопросы Delphi 10 10.02.2008 00:58
Application.ProcessMessages =LeonZone= Общие вопросы Delphi 11 27.01.2008 21:31
Application.ProcessMessages KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.08.2007 23:38