Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Добавление к таймеру


Автор: Alkash 15.9.2009, 16:54
Доброго времени суток господа. Возникла проблема с таймером. На форме Комбобокс с обработчиком onselect:
Код

begin
 case atimebox.ItemIndex of
0: begin thistime:= 1*60*60; MinutesLeft:= 1*60*60;end;

1:  begin thistime:= 2*60*60; MinutesLeft:= 2*60*60; end;

 2: begin thistime:= 3*60*60; MinutesLeft:= 3*60*60; end;

3: begin thistime:= 4*60*60; MinutesLeft:= 4*60*60; end;

4: begin thistime:= 5*60*60; MinutesLeft:= 5*60*60; end;

5:  begin thistime:= 6*60*60; MinutesLeft:= 6*60*60; end;

6:  begin thistime:= 12*60*60; MinutesLeft:= 12*60*60; end;
 end;

end;


Срабатывает таймер :
Код

var
hr, mn, sc: Integer;tmp: string;
begin
MinutesLeft := MinutesLeft - 1;
hr := MinutesLeft div 3600;
mn := (MinutesLeft - hr * 3600) div 60;
sc := MinutesLeft - hr * 3600 - mn * 60;


tmp := Format('%2.2d:%2.2d:%2.2d', [hr, mn, sc]);
Label2.Caption:= tmp;

end;


В label выводится результат работы таймера. Собственно проблема в том, что у меня не выходит накинуть сверху времени. Когда уже работает таймер. Тоесть - Код устанавливает время выполнения, и отсчитывает время до окончания. А я не могу увеличить время выполнения в процессе, пробовал увеличивать minutesleft(глобальная переменная) - не корректно. Подскажите - как мне реализовать подобную задачку?

Автор: Romikgy 15.9.2009, 17:25
остановить таймер ,
изменить значения,
запустить таймер

Автор: Alkash 15.9.2009, 19:46
Необходимо на лету изменять...не изменять, а добавлять...Чтобы не начать заново

Автор: Romikgy 15.9.2009, 20:12
более точно опишите задачу,
и более полный код покажите ,
плюс у таймера какой интервал срабатывания

Автор: Alkash 15.9.2009, 20:18
Задача - пишу программу управления небольшим интернет кафе.

Приведёный код - отсчитывает оставшееся время работы удалёного компьютера. Тоесть в боксе выбирают - от часа до 12 часов, и поехал отсчёт работы. В приведёном - всё работает прекрасно. А вот с продлением работы компьютера(допустим пользователь оплатил ещё полчаса) - большие проблемы.

 Интервал таймера 1000.


Автор: Romikgy 15.9.2009, 21:11
Цитата(Alkash @  15.9.2009,  15:54 Найти цитируемый пост)
MinutesLeft 

просто добавить к этой переменой полчаса , что нельзя?

Автор: Alkash 15.9.2009, 22:10
Пробовал, не верно получается. Допусти по таймера - 2:45:39 - при накидывани 30 минут - просто округляется до 3: 00:00

Автор: THandle 15.9.2009, 22:19
Alkash, а почему бы не попробовать работать с TDateTime?

Типа:

Код

procedure TForm2.Button1Click(Sender: TObject);
var
  t1, t2: TDateTime;
begin
  t1 := Now;
  ShowMessage(TimeToStr(t1));
  t2 := t1 + StrToTime('00:20:00');
  ShowMessage(TimeToStr(t2));
end;

Автор: Alkash 15.9.2009, 22:20
А если изменится системное время?) Вот поэтому и бьюсь с внутренним таймером(

Автор: Keeper89 15.9.2009, 22:25
Alkash, вдруг это как? БИОС полетит или пользователи под админом изменят?
Цитата(Alkash @  15.9.2009,  23:10 Найти цитируемый пост)
Пробовал, не верно получается. Допусти по таймера - 2:45:39 - при накидывани 30 минут - просто округляется до 3: 00:00 

Я. честно говоря, не понимаю как это округляет? Может неверное преобразование из числа в чч:мм:сс и обратно?

Автор: Romikgy 15.9.2009, 22:32
Цитата(Alkash @  15.9.2009,  21:10 Найти цитируемый пост)
Допусти по таймера - 2:45:39 - при накидывани 30 минут - просто округляется до 3: 00:00 

покажи как делаешь?

Автор: Alkash 15.9.2009, 22:57
На работе код к сожалению) Но в кратце - беру минуты - и прибавляю их к minutesleft. 

Автор: Romikgy 15.9.2009, 23:00
с работы покажешь код

Автор: Keeper89 16.9.2009, 00:23
Я бы считал все в секундах, а не в минутах, если секунды нужны (судя по коду). Плюс можно перейти на раздельное вычисление часов, минут и секунд заодно убрав некошерные операции деления в таймере.

Ну и ждем код. smile  

Автор: Alkash 16.9.2009, 08:01
Добавляю минуты к минутам
Код

procedure TfmVICAClient.Button2Click(Sender: TObject);
begin
 minutesleft:=minutesleft+ (strtoint(mtimeedit.text)*60);
end;


и обрабатываю во втором таймере с интервалом 1000

Код

var
hr, mn, sc: Integer;tmp: string;
begin
MinutesLeft := MinutesLeft - 1;
hr := MinutesLeft div 3600;
mn := (MinutesLeft - hr * 3600) div 60;
sc := MinutesLeft - hr * 3600 - mn * 60;

//sc:= sc-1;
tmp := Format('%2.2d:%2.2d:%2.2d', [hr, mn, sc]);
Label2.Caption:= tmp;
end;

Автор: Romikgy 16.9.2009, 10:04
Цитата(Alkash @  16.9.2009,  07:01 Найти цитируемый пост)
Добавляю минуты к минутам

по коду похоже что работаешь с секундами ,
да и таймер секундный

Автор: Alkash 16.9.2009, 10:10
Точно, уплю...просто весь день работал с минутами - а под конец уже начал с секундами...Однако - как быть то в этой ситуации? Я уже чё только не перепробовал

Автор: Keeper89 16.9.2009, 10:10
Как можно из MinutesLeft выражать секунды, там из попросту нет.
Судя по коду работа ведется в секундах, а таймер идет в минутах  smile 

Поэтому, чтобы прибавить 30 минут надо выразить это в секундах:
Код

  minutesleft := minutesleft + 30*60;


З.Ы. Я бы советовал привести все у секундам (если уже выбрали этот путь), чтобы код стал читаемым.

Добавлено через 5 минут и 8 секунд
Гы, Romikgy меня опередил  smile 

Автор: Alkash 16.9.2009, 10:18
MinutesLeft - переменная глобальная.
И я как то не понимаю, чем
Код

minutesleft:=minutesleft+ (strtoint(mtimeedit.text)*60)

отличается от 
Код

 minutesleft := minutesleft + 30*60;

Автор: Keeper89 16.9.2009, 10:18
З.Ы. И еще - если не хочется работать с TTime, можно сделать свой маленький класс и считать значения там с функциями декремента и добавления времени.

Добавлено через 43 секунды
Alkash, у меня инкремент в 30 минут работает исправно...

Автор: Alkash 16.9.2009, 10:28
MinutesLeft - переменная глобальная.
И я как то не понимаю, чем
Код

minutesleft:=minutesleft+ (strtoint(mtimeedit.text)*60)

отличается от 
Код

 minutesleft := minutesleft + 30*60;


Добавлено через 43 секунды
Моя конструкция как-то не может этим похвастаться)))

Автор: Keeper89 16.9.2009, 10:33
А так
Код

minutesleft := minutesleft + 30*60;

тоже не работает?

Автор: Alkash 16.9.2009, 10:35
Неа, ни в какую

Автор: Keeper89 16.9.2009, 10:37
У меня в проекте только это:
Код

procedure TForm2.Button1Click(Sender: TObject);
begin
  MinutesLeft := MinutesLeft + 30*60;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  MinutesLeft := 60*60;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
  hr, mn, sc: Integer;tmp: string;
begin
  MinutesLeft := MinutesLeft - 1;
  hr := MinutesLeft div 3600;
  mn := (MinutesLeft - hr * 3600) div 60;
  sc := MinutesLeft - hr * 3600 - mn * 60;
  //sc:= sc-1;
  tmp := Format('%2.2d:%2.2d:%2.2d', [hr, mn, sc]);
  Caption:= tmp;
end;

Автор: Alkash 16.9.2009, 10:43
Вот собрал тестовую конструкцию. Которая не хочет работать)

Автор: Alkash 16.9.2009, 10:46
А-а-а-а, заработало) Всем спасибо) 

Автор: Keeper89 16.9.2009, 11:22
В чем же было дело?

Автор: Romikgy 16.9.2009, 11:28
Цитата(Alkash @  16.9.2009,  09:10 Найти цитируемый пост)
Однако - как быть то в этой ситуации? Я уже чё только не перепробовал 

брекпоинты пробовал ?
Цитата(Alkash @  16.9.2009,  09:43 Найти цитируемый пост)
Вот собрал тестовую конструкцию. Которая не хочет работать) 

полностью тестовое )) даже пас файл девственно чист smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)