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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2016, 12:25   #1
yohohox
 
Регистрация: 21.05.2015
Сообщений: 9
По умолчанию Таймер в массиве и интервал времени

Бодрое время суток Товарищи.
Помогите пожалуйста разобраться.
Есть поле Edit в котором задаю кол-во времени по умолчанию в миллисекундах.
Есть ComboBox в котором заполненны меры времени: мс, сек, мин, час.

Пару вопросов:
1. Как для каждого таймера который в массиве задавать интервал
2. И каким образом менять его в зависимости от выбранного ComboBox.Items
я думал что это будет как то так:

PHP код:
ms  := 10;
sec := 1000;
min := 60000;
hr  := 3600000;

if 
ComboBox1.Text ComboBox1.Items[0then
  TimerPress
.Interval := StrToInt(Edit1.Text) * ms;
if 
ComboBox1.Text ComboBox1.Items[1then
  TimerPress
.Interval := StrToInt(Edit1.Text) * sec;
if 
ComboBox1.Text ComboBox1.Items[2then
  TimerPress
.Interval := StrToInt(Edit1.Text) * min;
if 
ComboBox1.Text ComboBox1.Items[3then
  TimerPress
.Interval := StrToInt(Edit1.Text) * hr
Но тогда всем таймерам будеет задан единый интервал, а не для каждого по отдельности.

Если у таймера по умолчанию поставить интервал = 1, прога работает, но отсчет времени делается неправильно.
1 сек = 1000 мс, но если в Edit ввести 1000, то отсчет будет идти явно не 1 секунду.

Можно как то решить такое?

Ниже привожу код:

PHP код:
 .......................

  
TForm1 = class(TForm)
    
ComboBox1TComboBox
    
ButtonstartTBitBtn;
    
Edit1TEdit;
    
TimerPressTTimer;
    
procedure ButtonstartClick(SenderTObject); 
    
procedure TimerPressTimer(SenderTObject);
  private
    { private 
declarations }
  public
    { public 
declarations }
  
end;

.......................

var
  
Form1TForm1;
  
TimePress: array [1..12of Integer;  

.......................

procedure TForm1.ButtonstartClick(SenderTObject); 
  
begin

  
if TimerPress.Enabled False then
    begin

      TimerPress
.Enabled := True;

      
TimePress[1] := StrToInt(Edit1.Text);

    
end
  
else
    
begin

      TimerPress
.Enabled := False;

    
end;

  
end;

procedure TForm1.TimerPressTimer(SenderTObject);
  
begin

    Dec
(TimePress[1]);

    if 
TimePress[1] = 0 then
      begin
        
        
........

        
TimePress[1] := StrToInt(Edit1.Text);

      
end;

  
end
Спасибо за внимание.
yohohox вне форума Ответить с цитированием
Старый 21.09.2016, 13:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как для каждого таймера который в массиве задавать интервал
один и тот же для всех?


Цитата:
Если у таймера по умолчанию поставить интервал = 1, прога работает, но отсчет времени делается неправильно.
1 сек = 1000 мс, но если в Edit ввести 1000, то отсчет будет идти явно не 1 секунду.
таймеры не гарантируют срабатывание. зависит от целого ряда параметров, загруженности винды.
ну и делать интервал в 1 мс бессмысленно, таймер в винде срабатывает намного реже.


Цитата:
Можно как то решить такое?
Расскажите, какую ИЗНАЧАЛЬНО решаете задачу?
вполне возможно, что Вам достаточно ОДНОГО таймера, в котором будут проверяться некие интервалы времени и производиться нужные действия.
Для чего это всё?


p.s.
Цитата:
Код:
ms  := 10;
не к чему. должно быть ms := 1;

p.p.s. а на второй ваш вопрос ответ такой:
на второй вопрос ответ такой
Код:
const 
   time_measure_units : array[0..3] of integer = (1,1000,60000,3600000);

....
XXXX.Interval := StrToInt(Edit1.Text) * time_measure_units[ ComboBox1.ItemIndex ];

Последний раз редактировалось Serge_Bliznykov; 21.09.2016 в 13:22.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 13:33   #3
yohohox
 
Регистрация: 21.05.2015
Сообщений: 9
По умолчанию

Это клавиатурный кликер.
Привел в пример лишь TimePress[1], Edit1 и ComboBox1, а таких там 12, и все обрабатывает один таймер. Может есть смысл делать 12 отдельных таймеров? На сколько это правильно и быстрее?

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.p.s. а на второй ваш вопрос ответ такой:
на второй вопрос ответ такой
Код:
const 
   time_measure_units : array[0..3] of integer = (1,1000,60000,3600000);

....
XXXX.Interval := StrToInt(Edit1.Text) * time_measure_units[ ComboBox1.ItemIndex ];
Спасибо большое, понятно

Последний раз редактировалось yohohox; 21.09.2016 в 13:43.
yohohox вне форума Ответить с цитированием
Старый 21.09.2016, 16:26   #4
yohohox
 
Регистрация: 21.05.2015
Сообщений: 9
По умолчанию

Вся моя проблема насколько я понимаю находится в процедуре Dec() которая отнимает по 1 из заданного значения в Edit.
Причем отнимает по -1 раз в 1 миллисекунду. И теперь понятно почему расчеты идут не верно.
Исходя из того что в 1 секунде = 1000 миллесекунд, я думал что введя в поле Edit1 значение 1000 и запустив, будет выполняться действие раз в секунду, а не тут то было.
yohohox вне форума Ответить с цитированием
Старый 21.09.2016, 16:44   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё, разобрались? Теперь проблема решена?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.09.2016, 16:53   #6
yohohox
 
Регистрация: 21.05.2015
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
всё, разобрались? Теперь проблема решена?
Нет, нашел корень проблемы, а разобраться с ней еще предстоит. Пока гуглю, может всплывет что.
Может быть можно каким то образом, повлиять на процедуру Dec таким образом, чтобы были правильные расчеты?
Если решение найдется, я его обязательно озвучу, дабы помочь кому либо с подобными проблемами.
yohohox вне форума Ответить с цитированием
Старый 21.09.2016, 17:07   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

где-то при ВКЛЮЧЕНИИ таймера
Код:
start_time:=Now;
t0:=strtoint(EditX.Text);
где-то при срабатывании таймера
Код:
EditX.text:=strtoint(t0- millisecondBetween(Now, start_time));
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.09.2016 в 17:10.
evg_m на форуме Ответить с цитированием
Старый 21.09.2016, 17:42   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, угу, точно так.


Цитата:
Если решение найдется, я его обязательно озвучу, дабы помочь кому либо с подобными проблемами.
уже нашлось!

p.s. кстати, подобный приём нужно использовать и в тех случаях, когда таймер используется для вывода часиков/таймера/оставшегося времени и т.п.
Даже если некоторые срабатывания кода таймера будет пропущено, это никак не повлияет на корректную работу программы.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интервал времени Luchfan12 Помощь студентам 2 14.03.2014 02:39
Программа: Определить число нажатий клавиш Ctrl за заданный интервал времени не больше 20 секунд (asm) reg7 Фриланс 1 07.01.2011 18:48
Определить интервал времени JS stepennwolf JavaScript, Ajax 4 27.12.2010 22:15
Excel 2007 Как расчитать интервал времени за несколько суток Олег SH Помощь студентам 0 29.11.2009 10:47
Как возратить динамическое число в интервал времени Psm Microsoft Office Excel 3 11.06.2009 21:53