Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Timer [D7, WinXP]


SergeyM ©   (2004-06-11 11:51:00) 

Ув. мастера у меня такое ощущение что таймер не отключается, при выполнении следующего кода

procedure TForm7.Timer2Timer(Sender: TObject);
begin
inc(time);
Gauge1.Progress:=time;
if Gauge1.Progress = Gauge1.MaxValue then
begin
Gauge1.ForeColor:= clRed;
if RadioGroup1.ItemIndex=0 then
ShowMessage('Неправильно. Правильное слово: '+DataModule1.ADOTable3rword.AsString)
else
ShowMessage('Неправильно. Правильное слово: '+DataModule1.ADOTable3eword.AsString);
//Timer2.Interval:=0;
Timer2.Enabled:=false;
end;
end;

появившееся сообщение начинает маргать и не реагирует на нажатие кнопки ОК. Как видно из кода я пробовал его отключить двумя способами но ни что не помогло. Может вы поймете в чем дело и подскажите.


Sandman25   (2004-06-11 14:00:00) [1]

[18] Anatoly Podgoretsky ©   (11.06.04 13:59)

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


Anatoly Podgoretsky   (2004-06-11 13:59:00) [2]

Неожиданный, но тоже взгляд :-)


Sandman25   (2004-06-11 13:55:00) [3]

[16] Anatoly Podgoretsky ©   (11.06.04 13:21)

По тексту видно, что он их не хотел получать после закрытия модального диалога :)


Anatoly Podgoretsky   (2004-06-11 13:21:00) [4]

Sandman25 ©   (11.06.04 12:25) [11]
Это нарушение логики, по тексту видно, что он хотел больше не иметь событий таймера при достижении MAX, вместо этого он продолжал их получать до закрытия модального диалога.


han_malign   (2004-06-11 13:00:00) [5]

procedure TGauge.SetProgress(Value: Longint);
var
 TempPercent: Longint;
begin
 TempPercent := GetPercentDone;  { remember where we were }
 if Value < FMinValue then
   Value := FMinValue
 else if Value > FMaxValuethen
    Value := FMaxValue;
 if FCurValue <> Value then
 begin
   FCurValue := Value;
   if TempPercent <> GetPercentDone then { only refresh if percentage changed }
     Refresh;
 end;
end;

- т.о. только Sandman25 ©   (11.06.04 11:58) [1]- "спасет отца русской демократии"


Sandman25   (2004-06-11 12:56:00) [6]

Кстати, я обычно иначе делаю

procedure ...OnTimer(..);
begin
 Assert(Sender is TTimer);
 TTimer(Sender).Enabled := False;
 try
 //...
 finally
   TTimer(Sender).Enabled := True;     // можно с if ...
 end;
end;


Sandman25   (2004-06-11 12:54:00) [7]

[12] han_malign ©   (11.06.04 12:52)

Это не нарушение логики. Особенно если интервал таймера равен нескольким часам.


han_malign   (2004-06-11 12:52:00) [8]

> Таймер срабатывал, пока приложение отображало модальный диалог и ждало реакции пользователя - это не нарушение логики ИМХО.
- пока приложение отображало модальный диалог и ждало реакции пользователя - сообщения таймера накапливались в очереди, и пока не закроются все модальные диалоги, возникающие на каждом событии таймера(а чем дольше ждешь тем больше их накопится в очереди), до Timer2.Enabled:=false;не дойдет. А все модальные диалоги закроются только в том случае, если жать на OK, быстрее таймера...


Sandman25   (2004-06-11 12:25:00) [9]

[10] Anatoly Podgoretsky ©   (11.06.04 12:16)

Таймер срабатывал, пока приложение отображало модальный диалог и ждало реакции пользователя - это не нарушение логики ИМХО.


Anatoly Podgoretsky   (2004-06-11 12:16:00) [10]

Я только ошибся, не его а в свой.
Предложение смотри от Sandman25 с моей поправкой, что ты и реализовал сейчас. В твоем же коде было нарушение логики.


SergeyM   (2004-06-11 12:13:00) [11]

Все я все решил надо было отключить таймер
после
if Gauge1.Progress = Gauge1.MaxValue then
begin
Timer2.Enabled:=false;
и все сработало
P.S.
может Анатолий Подгорецкий это и имел в виду.


Anatoly Podgoretsky   (2004-06-11 12:12:00) [12]

SergeyM ©   (11.06.04 12:08) [7]
Ты бы попробовал вникнуть в его код


SergeyM   (2004-06-11 12:08:00) [13]

Если добавить в

ShowMessage('Неправильно. Правильное слово: '+DataModule1.ADOTable3eword.AsString);
//Timer2.Interval:=0;
end;
Timer2.Enabled:=false;
Application.ProcessMessages;
end;

то заполнение gauge прекратиться не начавшись


Sandman25   (2004-06-11 12:06:00) [14]

[4] SergeyM ©   (11.06.04 12:05)

Советы даются, чтобы над ними думать, а не им следовать :)


Sandman25   (2004-06-11 12:06:00) [15]

[3] Anatoly Podgoretsky ©   (11.06.04 12:04)

Согласен. Общая идея состоит в том, чтобы сделать это как можно раньше, чтобы таймер не успел сработать еще раз.


SergeyM   (2004-06-11 12:05:00) [16]

-->Попытайся добавить в конец
-->Application.ProcessMessages;

Если добавить как есть то ничего не получается

-->Должен быть первой строчкой обработчика

Тогда ничто не обработается


Anatoly Podgoretsky   (2004-06-11 12:04:00) [17]

Нет только оба предлодени и конечно не в начло, а после if


kudatsky   (2004-06-11 12:00:00) [18]

Попытайся добавить в конец
Application.ProcessMessages;


Sandman25   (2004-06-11 11:58:00) [19]

Timer2.Enabled:=false;

Должен быть первой строчкой обработчика


Наверх

Титульная страница Поиск, карта сайта Написать письмо