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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 16:27   #1
fezilk25
Форумчанин
 
Регистрация: 01.08.2010
Сообщений: 124
По умолчанию Сделать таймер из Label и Timer

Необходимо из Label1 сделать что-то вроде обратного отсчёта.
На форме есть Timer1, в котором случайно задаётся интервал.
Необходимо, чтобы в Label1 показывался обратный отсчёт этого интервала.

Т.е., если в Timer1 интервал равено 120000 (это 2 минуты), в Label1 должно отсчитываться: 1:59, через секунду 1:58 и т.д.

Понимаю, что нужен еще и Timer2 с интервалом в 1000 (1 сек). Но как перевести милисекунды в формат mm:ss не знаю, да и как потом это "анимировать" плохо понимаю.

PS. пытался сделать, получается в формате ssss только...
fezilk25 вне форума Ответить с цитированием
Старый 19.11.2010, 17:06   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Глупость какая...
Берем таймер с секундным интервалом, глобальную переменную с начальным значением 120 и еще одну, с начальным значением 1.
Запускаем таймер (и выводим на Label начальное значение первой = 120), по событию OnTimer которого выводим на Label разницу между первой и второй глобальными переменными, инкрементируем вторую, проверяем, не стала ли она больше, чем первая. Если стала - выключаем таймер...
mihali4 вне форума Ответить с цитированием
Старый 19.11.2010, 17:25   #3
fezilk25
Форумчанин
 
Регистрация: 01.08.2010
Сообщений: 124
По умолчанию

Не совсем понял, что вы написали
Нужен обратный отсчет (например, от 128000мсек), обновляемый в режиме реального времени. Разобрался с переводом милисек в формат mm:ss :
Код:
var
n,sec:integer;
...
n:=128000;
sec := n div 1000; // переводим в секунды
label7.Caption := format('%.2d:%.2d',[sec div 60, sec mod 60]); // выведется 02:08
но как всё это в обратный отсчет превратить?
fezilk25 вне форума Ответить с цитированием
Старый 19.11.2010, 17:26   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
но как всё это в обратный отсчет превратить?
Уменьшать n?
BOBAH13 вне форума Ответить с цитированием
Старый 19.11.2010, 17:46   #5
fezilk25
Форумчанин
 
Регистрация: 01.08.2010
Сообщений: 124
По умолчанию

именно. но код толковый написать не могу, программа либо виснет, либо выдается 00:00, помогите с кодом, пожалуйста.
Код:
procedure TForm3.Timer1Timer(Sender: TObject);
var m, N, sec : integer;
begin
  N:=Form1.Timer1.Interval;
   while n>0 do
   begin
     n:=n-1;
     sec := N div 1000;
     label7.Caption := format('%.2d:%.2d',[sec div 60, sec mod 60]);
     if n=1 then
     n:=Form1.Timer1.Interval;
   end;
end;
вот так пытался, и еще по-всякому )

вам раз плюнуть, а мне приятно )
fezilk25 вне форума Ответить с цитированием
Старый 19.11.2010, 17:49   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Глупость какая...
Берем таймер с секундным интервалом, глобальную переменную с начальным значением 120 и еще одну, с начальным значением 1.
Запускаем таймер (и выводим на Label начальное значение первой = 120), по событию OnTimer которого выводим на Label разницу между первой и второй глобальными переменными, инкрементируем вторую, проверяем, не стала ли она больше, чем первая. Если стала - выключаем таймер...
И что ? Непонятно, что это и будет уменьшающаяся исходная величина ???
mihali4 вне форума Ответить с цитированием
Старый 19.11.2010, 18:01   #7
fezilk25
Форумчанин
 
Регистрация: 01.08.2010
Сообщений: 124
По умолчанию

Код:
procedure TForm3.Timer1Timer(Sender: TObject);
var N, sec : integer;
begin
  N:=128000;
   while n>0 do
   begin
     sec := n div 1000;
     label7.Caption := format('%.2d:%.2d',[sec div 60, sec mod 60]);
     n:=n-1;
   end;
end;
не понимаю, почему выдает 00:00
fezilk25 вне форума Ответить с цитированием
Старый 19.11.2010, 18:21   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

потому что Вы не понимаете.
в процедуре обработки, которая висит на таймере
НЕ ДОЛЖНО БЫТЬ ЦИКЛОВ!!!!

т.е. объявите переменную N где-нибудь глобально
и на FormCreate сделайте N:=128000;

в в процедуре обработки таймера (интервал 1000 мс == 1 сек)
напишите:
Код:
procedure TForm3.Timer1Timer(Sender: TObject);
var sec : integer;
begin
   Dec(N);
   if n>=0 then 
   begin
     sec := n div 1000;
     label7.Caption := format('%.2d:%.2d',[sec div 60, sec mod 60]);
   end
   else Timer1.Enable := false; {выключаем таймер, если N стало меньше нуля...}
end;
и всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.11.2010, 18:23   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var int: string;
begin
int:=InputBox('Интервал времени','Введите интервал в секундах','1');
inti:=StrToInt(int);
sec:=1;
Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption:= format('%.2d:%.2d',[(inti-sec) div 60, (inti-sec) mod 60]);
Application.ProcessMessages;
Inc(sec);
if sec>inti then
Timer1.Enabled:=False;
end;
Красные - глобальные.
mihali4 вне форума Ответить с цитированием
Старый 20.11.2010, 00:09   #10
fezilk25
Форумчанин
 
Регистрация: 01.08.2010
Сообщений: 124
По умолчанию

Serge_Bliznykov, ваш способ не работает..
mihali4, работает, огромное спасибо!

теперь бы синхронизировать два таймера..
fezilk25 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать таймер bookkc Помощь студентам 4 16.10.2010 19:57
Как сделать все процессы на одном Timer Sanek777 Общие вопросы Delphi 5 26.09.2008 17:56
Как сделать Label/StaticText в MFC? Ceprey Visual C++ 5 11.03.2008 23:28
Вопрос по label. Как сделать так чтобы label была прозрачной. Lonix Компоненты Delphi 2 01.04.2007 06:23
Как сделать что-бы Таймер срабатывал только один раз? Greg Компоненты Delphi 11 16.12.2006 01:25