Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c