![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
Должен быть первой строчкой обработчика