Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.168.56] |
|
Сообщ.
#1
,
|
|
|
Помогите плиз найти компонент, типа Timer, который помещается на форму и отображает обратный отчет, после истечения времени однократно выполняет какое-либо действие.
|
Сообщ.
#2
,
|
|
|
А неужели так сложно с помощью стандартного сделать подобное? Завести какой-то счетчик и по каждому событию OnTimer отнимать от него пройденный интервал.
|
Сообщ.
#3
,
|
|
|
Если такой компонент существует, но имхо оно не надо, т.к. в этом случае придется юзать 2 таймера, 1 таймер сработает через нужное время, а второй будет ежесекундно отнимать
|
Сообщ.
#4
,
|
|
|
А мне вариант Smike кажется вполне примелемым. И одного таймера там достаточно.
Примерчик простой. На форме таймер(интервал 1000 мс) и кнопка. 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; |
Сообщ.
#5
,
|
|
|
мне нужно, чтобы был виден отсчет времени на форме (это таймер, который будет иметь интервал 1000), интервал может быть и многочасовой, т.е. придется ещё постоянно деление целочисленное делать
А второй таймер уже сделает действие само по истечению времени |
Сообщ.
#6
,
|
|
|
bel1ever, то что ты сказал звучит примерно так: "как написать программу без выполнения команд".
Переделай пример SeaGirl: 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; Непроверял, но приерно так должно работать. |
Сообщ.
#7
,
|
|
|
А как на основе последнего примера сделать свой компонент "кнопка с обратным отсчетом",по истечении времени кнопка нажимается и соответственно выполняется какое-нибудь действие, тот же показ сообщения "Время истекло". Учитывая то, что таймер в Delphi не совсем точно отсчитывает время, поправить это можно так: (В интернете полно примеров как сделать таймер в Delphi более точным)
{ Имя файла: 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. |
Сообщ.
#8
,
|
|
|
Если это не оформить как поток (програмный) то думаю надо будет добавлять "Application.ProcessMessages", иначе программа будет виснуть.
|
Сообщ.
#9
,
|
|
|
По сути THRTimer - это не таймер ("будильник"), а просто "секундомер"
|