Ustawienia timera wykonującego kod co określoną ilość godzin, minut i sekund

0

Cześć mam mały problem chciałem ustawić wykonanie procedury co określony czas. W 3 Editach podajemy:

  • Edit1 - co ile godzin
  • Edit2 - co ile minut
  • Edit3 - co ile sekund

Wiec zrobiłem tak:

Timer1.Interval:= StrToInt(Edit1.Text)*3600 + StrToInt(Edit2.Text)*60000 + StrToInt(Edit3.Text)*1000;

Czegoś tu nie rozumiem albo liczyć nie umiem. Bo jak zrobiłem tak:

Edit1=0 Edt2=1 Edit3=0
1 minuta = 60 000 milisekund

Kurcze jak to poustawiać by w editach podawać za ile odpowiednio godzin, minut sekund ma się rozpocząć procedura

procedure TForm1Timer1Timer(Sender: TObject);
begin
  Timer1.interval:= Timer1.interval -1;
  Label1.caption:='Czas pozostały: '+ inttostr(Timer1.interval);
 if Timer2.Interval = 0 then
 begin
   SpeedButton1.Click();
 end;
2

Właściwość Timer.Interval zawiera liczbę milisekund, co jaką będzie wykonywał kod zdarzenia OnTimer; Wartość dla tej właściwości należy ustawić raz i czekać aż zadany czas minie; Natomiast w zdarzeniu OnTimer nalezy zapisać kod, który będzie wykonywany po każdorazowym skończeniu odliczania; Przy czym timer sam odmierza czas, więc nie należy mu w tym przeszkadzać;

Poza tym skorzystaj z kontrolek typu TSpinEdit zamiast TEdit - nie będziesz musiał nic konwertować (jest właściwość Value typu Integer), a także zabezpieczać kontrolek przed podaniem nieliczbowych ciągów znaków;

A jeśli już używać komponentów to pasuje im nadać sensowne nazwy, czyli np. dla kontrolek typu TSpinEdit można nadać nazwy pokroju HoursSpin, MinutesSpin i SecondsSpin - od razu wiadomo do czego służą i co zawierają; Dzięki temu obliczenie wartości dla właściwości Timer.Interval mogło by wyglądać tak:

var
  LHours, LMinutes, LSeconds: Integer;
begin
  LHours   := HoursSpin.Value   * 3600000;
  LMinutes := MinutesSpin.Value * 60000;
  LSeconds := SecondsSpin.Value * 1000;

  Timer.Interval := LHours + LMinutes + LSeconds;

Natomiast jeśli masz problem z obliczaniem liczby milisekund dla poszczególnych składowych czasu to zawsze możesz sobie rozbić duże liczby na składowe, które będą dla Ciebie bardziej zrozumiałe:

LHours   := HoursSpin.Value   * 60 * 60 * 1000;
LMinutes := MinutesSpin.Value * 60 * 1000;
LSeconds := SecondsSpin.Value * 1000;
0

To tak chyba zrobiłem?
Na pewno mam tu błąd bo na dzień dobry mi wychodzi start za 01:01:01 (godzin:minut:sekund)

Timer1.Interval:= StrToInt(Edit1.Text)*3600000 + StrToInt(Edit2.Text)*60000 + StrToInt(Edit3.Text)*1000;

jak to poprawnie zapisać by odpowiednio podawać godziny minuty i sekundy ?

0

Dziękuję pisząc nie widziałem odpowiedzi :)

0

To tak chyba zrobiłem?

No nie tak zrobiłeś, bo pomyliłeś mnożniki, poza tym w zdarzeniu OnTimer dekrementowałeś wartość właściwości Interval; Tego się nie robi (przynajmniej nie w tym kontekście), a jeśli już robić takie rzeczy to tylko w przypadku, gdy dokładnie wie się co się robi;

jak to poprawnie zapisać by odpowiednio podawać godziny minuty i sekundy ?

Podałem w poprzednim poście.

0

Wybacz że jeszcze raz zagaduje zrobiłem tak jak radziłeś
i działa
Ustawiłem czas czas rozpoczęcia 20 sekund
i w Labelu Czas do końca pojawia się 20000
ale co 20 sekund zmienia się o -1
i pewnie tu poniżej mam jeszcze błąd

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Timer1.interval:= Timer2.interval -1
  Label1.caption:='Czas pozostały:  ' + inttostr(Timer2.interval);
 if Timer2.Interval = 0 then
 begin
// coś do wykonania
 end;
0

Miałeś racje Dziękuje już poprawiłem swój błąd

0

Wybacz bo szukam rozwiązania dalej.
naprawiłem swoje błędy, przynajmniej tak mi się wydaje :) najważniejsze że działa :)
O co chciałem zapytać;

Jak teraz w Labelu wyświetlić czas pozostały do uruchomienia procedury w taki sposób 00:00:00 (godzin : minut : sekund) odliczany do zera

procedure TForm1.SpeedButtonStartClick(Sender: TObject);
var
  LHours, LMinutes, LSeconds: Integer;
begin
  LHours   := HoursSpin.Value   * 3600000;
  LMinutes := MinutesSpin.Value * 60000;
  LSeconds := SecondsSpin.Value * 1000;
  Form1.ButtonPlay.Click();
  Timer1.Interval := LHours + LMinutes + LSeconds;
  timer1.Enabled := True   ;
 end;

procedure TForm1Timer1Timer(Sender: TObject);
begin
  Label2.caption:='Czas pozostały: '+ inttostr (Timer1.Interval);
  Form1.Next.Click() ;
 timer1.Enabled := False   ;
end;
0
procedure TForm1.SpeedButtonStartClick(Sender: TObject);
var
  LHours, LMinutes, LSeconds: Integer;
begin
  LHours   := HoursSpin.Value   * 3600000;
  LMinutes := MinutesSpin.Value * 60000;
  LSeconds := SecondsSpin.Value * 1000;
  Form1.ButtonPlay.Click();
  Timer1.Interval := LHours + LMinutes + LSeconds;
  TimeToEnd := LHours + LMinutes + LSeconds;
  timer1.Enabled := True   ;
 end;
 
procedure TForm1Timer1Timer(Sender: TObject);
begin
  Label2.caption:='Czas pozostały: '+ inttostr (TimeToEnd);
  Dec(TimeToEnd);
  Form1.Next.Click() ;
  timer1.Enabled := False   ;
end;

Tylko gdzieś musisz sobie zadeklarować zmienną TimeToEnd

Powyżej to tylko przykład bo wyświetli ci tylko ilość milisekund do końca odliczania. Ale używając odpowiednio div sobie możesz to rozbić.

0

Zapisz w Labelu już chyba mam tylko teraz by odliczał

Label1.caption:='Czas pozostały do kolejnego słowa: '+ intToStr(HoursSpin.Value) + ':' +intToStr(MinutesSpin.Value)  + ':' +  intToStr(SecondsSpin.Value);

1 użytkowników online, w tym zalogowanych: 0, gości: 1