На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Таймер обратного отсчета , Хелп
    Помогите плиз найти компонент, типа Timer, который помещается на форму и отображает обратный отчет, после истечения времени однократно выполняет какое-либо действие.
      А неужели так сложно с помощью стандартного сделать подобное? Завести какой-то счетчик и по каждому событию OnTimer отнимать от него пройденный интервал.
        Если такой компонент существует, но имхо оно не надо, т.к. в этом случае придется юзать 2 таймера, 1 таймер сработает через нужное время, а второй будет ежесекундно отнимать
          А мне вариант Smike кажется вполне примелемым. И одного таймера там достаточно.
          Примерчик простой. На форме таймер(интервал 1000 мс) и кнопка.

          ExpandedWrap disabled
            var
              i:integer;
             
            procedure TForm1.Button1Click(Sender: TObject);
            begin
              i:=5; //Допустим надо отсчитать 5 секунд
              Timer1.Enabled:=true; //Запускаем таймер
            end;
             
            procedure TForm1.Timer1Timer(Sender: TObject);
            begin
              i:=i-1; //Отнимаем по секунде
              // Если время закончилось, то останавливаем таймер и показываем сообщение.
              if i=0 then
              begin
                Timer1.Enabled:=false;
                ShowMessage('Время истекло');
              end;
            end;
            мне нужно, чтобы был виден отсчет времени на форме (это таймер, который будет иметь интервал 1000), интервал может быть и многочасовой, т.е. придется ещё постоянно деление целочисленное делать

            А второй таймер уже сделает действие само по истечению времени
              bel1ever, то что ты сказал звучит примерно так: "как написать программу без выполнения команд".
              Переделай пример SeaGirl:
              ExpandedWrap disabled
                var
                  i: Integer;
                 
                procedure TForm1.Button1Click(Sender: TObject);
                begin
                  // <кол. секунд> + 60 * <кол. минут> + 60 * 60 * <кол. часов>
                  // 60 * 60 * 5 = 18000 - 5 часов хватит?
                  i := 18000;
                  Timer1.Enabled := True; //Запускаем таймер
                end;
                 
                function IntToStr2(I, C: Integer): String;
                begin
                  Result := IntToStr(I);
                  while Length(Result) < C do
                    Result := Result + '0';
                end;
                 
                procedure TForm1.Timer1Timer(Sender: TObject);
                var
                  H, M, S: Integer;
                begin
                  i := i - 1; // Отнимаем по секунде
                  // Тут вывод на экран
                  H := I div 360; // часы
                  M := (I - H) div 60; // минуты
                  S := (I - H - M); // секунды
                  Caption := IntToStr2(H, 2) + ':' + IntToStr2(M, 2) + ':' + IntToStr2(S, 2);
                  // Если время закончилось, то останавливаем таймер и показываем сообщение.
                  if i = 0 then
                  begin
                    Timer1.Enabled := False;
                    ShowMessage('Время истекло');
                  end;
                end;


              Непроверял, но приерно так должно работать.
              Сообщение отредактировано: Step -
                А как на основе последнего примера сделать свой компонент "кнопка с обратным отсчетом",по истечении времени кнопка нажимается и соответственно выполняется какое-нибудь действие, тот же показ сообщения "Время истекло". Учитывая то, что таймер в Delphi не совсем точно отсчитывает время, поправить это можно так: (В интернете полно примеров как сделать таймер в Delphi более точным)

                ExpandedWrap disabled
                  {
                  Имя файла: HRTimer.PAS V1.00
                   
                  Оболочка для таймера высокой точности
                   
                  Var
                  HRT : THRTimer
                   
                  HRT := THRTimer.Create;
                  HRT.StartTimer;  Сброс таймера в ноль
                  HRT.ReadTimer;   Возвращает отсчитанное время в миллисекундах
                  начиная со времени старта
                   
                  HRT.Free;
                  }
                   
                  {-----------------Модуль HRTimer-----------------------------}
                   
                  unit HRTimer;
                   
                  {-------------------Объявления-------------------------------}
                   
                  interface
                   
                  uses Windows;
                   
                  type
                   
                    THRTimer = class(TObject)
                      constructor Create;
                      function StartTimer: Boolean;
                      function ReadTimer: Double;
                   
                    private
                      StartTime: Double;
                      ClockRate: Double;
                   
                    public
                      Exists: Boolean;
                   
                    end;
                   
                  {--------------------------Реализация-----------------------------------}
                   
                  implementation
                   
                  {------------------Create-----------------------------------------------}
                   
                  constructor THRTimer.Create;
                   
                  { Получаем точное системное время и сохраняем его для дальнейшего       }
                  { использования.                                                        }
                  {                                                                       }
                  {***********************************************************************}
                  var
                   
                    QW: TLargeInteger;
                   
                  begin
                   
                    inherited Create;
                    Exists := QueryPerformanceFrequency(QW);
                    ClockRate := QW.QuadPart;
                  end;
                   
                  {------------------StartTimer---------------------Jo-------------------}
                   
                  function THRTimer.StartTimer: Boolean;
                   
                  { Получаем точное системное время и сохраняем его для дальнейшего       }
                  { использования.                                                        }
                  {                                                                       }
                  {***********************************************************************}
                  var
                   
                    QW: TLargeInteger;
                   
                  begin
                   
                    Result := QueryPerformanceCounter(QW);
                    StartTime := QW.QuadPart;
                  end;
                   
                  {-------------------ReadTimer-------------------------------------------}
                   
                  function THRTimer.ReadTimer: Double;
                   
                  { Получаем точное системное время и сохраняем его для дальнейшего       }
                  { использования.                                                        }
                  {                                                                       }
                  {***********************************************************************}
                  var
                   
                    ET: TLargeInteger;
                   
                  begin
                   
                    QueryPerformanceCounter(ET);
                    Result := 1000.0 * (ET.QuadPart - StartTime) / ClockRate;
                  end;
                   
                  end.
                  Если это не оформить как поток (програмный) то думаю надо будет добавлять "Application.ProcessMessages", иначе программа будет виснуть.
                    По сути THRTimer - это не таймер ("будильник"), а просто "секундомер"
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0293 ]   [ 16 queries used ]   [ Generated: 3.05.24, 11:11 GMT ]