Пятница - 23.04.2021 - 08:20:06
7369
1

Создание собственного таймера.

   Необходимость наличия таймера в компьютере продиктована самой спецификой. И правда, что это за компьютер, если на нем нельзя выполнить такие необходимые операции, как выключение в заданное время, функция сна, будильника. Любой соверменный бытовой прибор обладает этими функциями, а большинство компьютеров так и не снабжены такими элементарными полезностями. Из опыта могу сказать, что это вещь незаменимая, конечно, если вы не «чайник»
   Немного отступлю от темы, и объясню кто такой «чайник», потому что этим термином раскидываются без всякого понимания, пытаясь оскорбить, употребляя его. Лично у меня язык не повернется назвать «чайником» человека, который впервые сел за компьютер. Такой не «чайник», а начинающий. А вот если, человек, который год и больше проработал за компьютером и не может произвести элементарную настройку компьютера, организовать удобный рабочий стол, привести в порядок свои файлы, и даже так и не научился пользоваться «Nero»- вот такой безпорно «чайник»!!!
   Но вернемся к нашему таймеру.
Передо мною стояла задача сойдать независимый таймер, такой, чтобы я мог полностью им управлять. Используя стандартные функции, этого, конечно, сделать невозможно. Ниже можно увидеть на рисунке внешний вид моего таймера. И еще, он должен вести отсчет в обратном направлении.

   Здесь я не буду описывать таких елементарных действий, как создание формы, как поместить на форму компоненты и т.д. Я опишу только функцию таймера, а как ее применять, это уже дело вашей фантазии.
   Последовательность наших действий:
  1. Создаем форму.
  2. Добавляем на форму компонент TTimer и устанавливаем его свойство Enabled в false; еще добавляем TLabel и TButton.
  3. Описываем наши действия и функции.
    //1.Объявление в файле .срр
    #include <vcl.h>
    #pragma hdrstop
    TFormMiniProgrms *FormMiniProgrms;
    int hh=0,m=0,mm=0,s=0,ss=0;
    
    //2.Код в обработчике таймера
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    ss--;
     if(ss<0)
     {ss=9;
      s--;
      if(s<0)
      {s=5;
       mm--;}
      }
     if(mm<0)
     {mm=9;
      m--;
      if(m<0)
      {m=5;
       hh--;}
     }
     if(hh<0)
     {hh=0;m=0;mm=0;s=0;ss=0;}
     Label1->Caption="0"+String(hh)+":"+String(m)+String(mm)+
                                              ":"+String(s)+String(ss);
    }
    
    //3.При нажатии на кнопку, делаем некоторые установки
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //Для тестирования, устанавливаем одну минуту 
    Label1->Caption="00:01:00";
    //устанавливаем начальное значение переменных
     hh=StrToInt(Label1->Caption.SubString(2,1));
     m=StrToInt(Label1->Caption.SubString(4,1));
     mm=StrToInt(Label1->Caption.SubString(5,1));
     s=5;
     ss=9;
     mm--;
     //запускаем таймер 
     Timer1->Enabled=1;
    }
    
Вот и весь наш таймер. Есть идеи, но нет времени для их реализации, если у кого то есть и время и желание, можна их воплотить в жизнь, а потом поделиться со мною.
  1. Доработать функцию и добавить миллисекунды.
  2. Расширить функцию на предмет отсчета как вперед, так и назад (здесь только назад).


    Таймер не был бы полностью функциональным, если бы не было возможности определить колличество секунд. Для этой цели, я написал функцию, которая преобразует строковое значение таймера в число секунд.
    int __fastcall MyTimeToIntHHNN(String time)
    {
     String sh,shh,sm,smm;
     int h,m;
     sh=time.SubString(1,1).Trim();
     shh=time.SubString(2,1).Trim();
     sm=time.SubString(4,1).Trim();
     smm=time.SubString(5,1).Trim();
     if(sh!="0")
     {sh+=shh;}
     else
     {sh=shh;}
     if(sm!="0")
     {sm+=smm;}
     else
     {sm=smm;}
     
     h=StrToInt(sh)*3600;
     m=StrToInt(sm)*60;
     
     return h+m;
    }
   
Пример реализации функции:
ShowMessage(StrToInt(MyTimeToIntHHNN("00:01:00"))+" сек");
выведет на экран "60 сек".


... все. Пользуйтесь, пишите.