Uruchamianie danej komendy o określonym czasie (względnie i bezwzględnie)

0

Witam.

Mam problem z zaimplementowaniem funkcji, która uruchamiała by daną komendę o danym czasie:

  • względnie, np. za 3 godziny 10 minut i 5 sekund
  • bezwględnie, np. 18:30
    Udało mi się odczytać czas z systemu, lecz nie mogę go porównać z czasem wprowadzonym przez użytkownika, ponadto mam problem z komponentem MaskEdit, gdyż nie wiem jak ustalić limit wartości liczby w polu do, np. 23.

Za pomoc z góry dziękuję.

0

StrToData
DataToStr
jak wolisz sprawdzać ...

1
proqix napisał(a)

StrToData
DataToStr

Chyba StrToDate i DateToStr, jest jeszcze TryStrToDate :]

Quincy6 napisał(a)

mam problem z komponentem MaskEdit, gdyż nie wiem jak ustalić limit wartości liczby w polu do, np. 23.

To nie korzystaj z TMaskEdit, tylko z TSpinEdit z zakładki Samples (jeśli o DB7 chodzi) - tym się łatwiej posługiwać, ponadto komponent z tej klasy ma takie właściwości jak Value, MinValue, MaxValue oraz EditorEnabled, które w zupełności wystarczą, by uodpornić program od idiotów, którzy nie wiedzą ile godzin jest w jednej dobie;

0
Quincy6 napisał(a)

Mam problem z zaimplementowaniem funkcji, która uruchamiała by daną komendę o danym czasie:

  • względnie, np. za 3 godziny 10 minut i 5 sekund

Zastosuj TTimer. Wykorzystaj właściwość Enabled. Ustaw Interval=3 godziny 10 minut i 5 sekund

1

W Twoim wypadku TTimer będzie bardzo dobrym rozwiązaniem, ale w przeciwieństwie do kolegi @pelsta poleciłbym Ci zrobić sobie listę zdarzeń, które mają zostać wykonane o określonej godzinie i dniu; Możesz je przechowywać w specjalnie przygotowanej macierzy czy liście - jak tam chcesz - i ustawić interwał tajmera na 1 min ('60 000 ms'); W zdarzeniu OnTimer (jest tylko jedno...) pobierzesz aktualny czas z systemu i przeszukasz macierz czy występuje jakieś zdarzenie, które ma zostać w danej minucue wykonane; Jeżeli tak - wykonujesz je i usuwasz z kolejki; Tu można by napisać klasę do przechowywania kolejki zdarzeń i jej edycji - byłoby bardziej elegancko i profesjonalnie, niż ciągle ręcznie zaśmiecać kod zbędnymi operacjami;

Więc polecam Ci:

  1. napisać klasę zawierającą kolejkę zdarzeń,
  2. oprogramować ją pod kątem edycji zdarzeń, dodawania, usuwania, przenoszenia i przeszukiwania,
  3. stworzyć tajmera (w klasie kolejki) z ustawionym interwałem na 1 min
  4. tworzyć tajmera podczas rozruchu aplikacji i usuwać go podczas zamknięcia
    tyle wystarczy, by program działał bez zarzutu i był na tyle funkcjonalny, by swobodnie z niego korzystać;
    Jeśli nie znasz jeszcze programowania obiektowego to utwórz sobie osobny moduł, w którym zaimplementujesz odpowiednie procedury / funkcje realizujące to, o czym napisałem w punktach; Jednak klasa byłaby lepszym rozwiązaniem;

Jeszcze jedno, jeśli chodzi o czas wykonania zdarzenia:

Quincy6 napisał(a)
  • względnie, np. za 3 godziny 10 minut i 5 sekund

Dodajesz zdarzenie do kolejki, a czas ustawiasz w ten sposób:

  1. pobierasz aktualny czas z systemu
  2. dodajesz do niego 3 godziny, 10 minut i 5 sekund
Quincy6 napisał(a)
  • bezwględnie, np. 18:30

Tak samo, dodajesz zdarzenie do kolejki z określonym czasem;


Podczas operacji dodawania zdarzenia do kolejki przyda się znalezienie odpowiedniego miejsca po to, by zdarzenia były posortowane od tej, która będzie wykonana najwsześniej, do tych najbardziej odległych w czasie;

Dasz radę to zrobić - poczytaj tylko o module DateUtils i jego procedurach / funkcjach oraz o podstawach programowania obiektowego;

0

Dziękuję za pomoc. Spróbuję z TTimer.
Miałem również problem z odejmowaniem czasu, ale znalazłem dobry przykład w internecie.
Zamieszczę ten przykład na wypadek gdyby ktoś miał podobny problem.
W razie nowych problemów będę się kontaktował :-)

 Var
d1, d2 : TDatetime;
Begin
  d1 := StrToTime('09:10');
  d2 := StrToTime('18:05');
  ShowMessage(TimeToStr(d1-d2));
End;

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