Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Timer   Найти похожие ветки 

 
SergeyM ©   (2004-06-11 11:51) [0]

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

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 11:58) [1]

Timer2.Enabled:=false;

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


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

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


 
Anatoly Podgoretsky ©   (2004-06-11 12:04) [3]

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


 
SergeyM ©   (2004-06-11 12:05) [4]

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

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

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

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


 
Sandman25 ©   (2004-06-11 12:06) [5]

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

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


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

[4] SergeyM ©   (11.06.04 12:05)

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


 
SergeyM ©   (2004-06-11 12:08) [7]

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

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

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


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

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


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

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


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

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


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

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

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


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

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


 
Sandman25 ©   (2004-06-11 12:54) [13]

[12] han_malign ©   (11.06.04 12:52)

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


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

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

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


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

procedure TGauge.SetProgress(Value: Longint);
var
 TempPercent: Longint;
begin
 TempPercent := GetPercentDone;  { remember where we were }
 if Value < FMinValue then
   Value := FMinValue
 else if Value > FMaxValue then
   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] - "спасет отца русской демократии"


 
Anatoly Podgoretsky ©   (2004-06-11 13:21) [16]

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


 
Sandman25 ©   (2004-06-11 13:55) [17]

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

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


 
Anatoly Podgoretsky ©   (2004-06-11 13:59) [18]

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
14-1086930739
Newbe
2004-06-11 09:12
2004.06.27
Народ где можно найти???


14-1086539606
kaif
2004-06-06 20:33
2004.06.27
Натурфилософия третьего тысячелетия


3-1086009625
Jet
2004-05-31 17:20
2004.06.27
Проблемы с фильтром


1-1087007130
Aswert
2004-06-12 06:25
2004.06.27
Как объявить структуру константой ?


14-1086356175
Rouse_
2004-06-04 17:36
2004.06.27
LOL :)