Najprościej będzie, jak zadeklarujesz sobie kilka zmiennych do przechowywania danych początkowych. Czyli przyda się kilka zmiennych (lub pól klasy) dla:
- liczby sekund trwania treningu,
- liczby sekund trwania przerwy,
- liczby sekund, dla której ma być odegrany dźwięk.
Wartości tych trzech zmiennych powinny być inicjowane po kliknięciu w przycisk rozpoczynający odliczanie. Dla liczby sekund dla odegrania dźwięku wystarczy jeden komponent, np. klasy TSpinEdit
. Natomiast dla czasu trwania treningu i dla czasu trwania przerwy przydadzą się po dwa komponenty (też mogą być TSpinEdit
) - jeden dla sekund, drugi dla minut. Czas trwania treningu nie trudno policzyć - liczbę minut pomnożyć razy 60
i dodać liczbę sekund. To samo wykonać dla czasu trwania przerwy.
Zmienne wylistowane wyżej posłużą jedynie do przechowywania danych. Teraz przyda się jeszcze kilka zmiennych, ale takich, których wartości będą modyfikowane. Dlatego też przydadzą się zmienne dla:
- pozostałej liczby powtórzeń treningu,
- pozostałej liczby sekund trwania akcji (treningu albo przerwy),
- wartości wyliczeniowej (enum), określającej czy w danej chwili trwa trening czy przerwa.
Wartości tych zmiennych też należy zainicjować po kliknięciu w przycisk, przy czym czas trwania treningu można przepisać ze zmiennej służącej tylko do odczytu (coby drugi raz nie liczyć tego samego). Po ustawieniu wszystkich wartości należy odpalić timer, aby rozpocząć odliczanie.
Hipotetyczna inicjalizacja wartości zmiennych (bo nie mam czasu odpalać IDE i bawić się z kontrolkami):
type
TActionKind = (akTraining, akBreak);
type
TMainForm = class(TForm)
{..}
private
{ read only }
FTrainingTime: Integer;
FBreakTime: Integer;
FTimeToSound: Integer;
private
{ read and write }
FAction: TActionKind;
FActionTime: Integer;
FRepetitions: Integer;
end;
procedure TMainForm.StartButtonClick(Sender: TObject);
begin
{ read only }
FTrainingTime := TrainingMinutesSpin.Value * 60 + TrainingSecondsSpin.Value;
FBreakTime := BreakMinutesSpin.Value * 60 + BreakSecondsSpin.Value;
FTimeToSound := TimeToSoundSpin.Value;
{ read and write }
FAction := akTraining;
FActionTime := FTrainingTime;
FRepetitions := RepetitionsSpin.Value;
{ timer }
FActionTimer.Enabled := True;
end;
Tak mniej więcej powinna wyglądać inicjalizacja danych i odpalenie timera. Timer powinien wywoływać handler OnTimer
co sekundę, więc jego właściwość Interval
należy ustawić na 1000
. Dzięki temu będzie możliwe wykonanie jakiejś akcji w każdym ticku zegara (czyli np. raz na sekundę zaktualizować etykietę służącą do wyświetlania pozostałego czasu).
Teraz czas na zdarzenie OnTimer
zegara:
procedure TMainForm.ActionTimerTimer(Sender: TObject);
begin
FActionTime -= 1;
if FActionTime = FTimeToSound then
PlaySound({..})
else
if FActionTime = 0 then
case FAction of
akTraining:
begin
FRepetitions -= 1;
if FRepetitions = 0 then
ActionTimer.Enabled := False
else
begin
FAction := akBreak;
FActionTime := FBreakTime;
end;
end;
akBreak:
begin
FAction := akTraining;
FActionTime := FTrainingTime;
end;
end;
UpdateTimerLabel();
end;
To tak z grubsza, bo pisane z palca - nie testowałem, ale powinno działać. Ostatnim krokiem jest napisanie metody, która to będzie umożliwiała aktualizację etykiety wyświetlającej czas, na podstawie stanu zegara i wartości zmiennych. Przykładowy kod takiej metody poniżej:
procedure TMainForm.UpdateTimerLabel();
begin
if ActionTimer.Enabled then
begin
case FAction of
akTraining: TimerLabel.Font.Color := IfThen(FActionTime > FTimeToSound, clRed, clBlue);
akBreak: TimerLabel.Font.Color := IfThen(FActionTime > FTimeToSound, clRed, clGreen);
end;
TimerLabel.Caption := FormatTime('NN:SS', EncodeTime(0, FActionTime div 60, FActionTime mod 60));
end
else
begin
TimerLabel.Font.Color := clLtGray;
TimerLabel.Caption := '00:00';
end;
end;
Powyższy kod zmienia kolor etykiety oraz ustawia w Caption
aktualny czas akcji (treningu lub przerwy).
To w sumie tyle - teraz musisz sobie ten kod przeczytać, zrozumieć, a następnie przenieść do swojego projektu. Nie da się go ot tak przekopiować i skompilować, bo nie wiem jakie nazwy posiadają kontrolki w Twoim projekcie, ale to już pozostawiam Tobie.