Umieść na formularzu obiekt Timer1 typu TTimer, w którym będzie sprawdzany czas. Ustaw jego właściwość Enabled na false, i Interval = 1000, gdzie 1000 to jedna sekunda. Utworz zdarzenie OnTimer dla tego obiektu. Umieść przycisk Button1 w którego zdarzeniu OnClick zegar będzie uruchamiany, no i pozostał prosty kod:
/* Funkcja TimeTest nie jest przypisana do klasy, więc musi znajdować się
nad funkcjami i zdarzeniami w których jest wywoływana */
BOOL __fastcall TimeTest(USHORT thour, USHORT tmin)
{
USHORT chour, cmin, csec, cmsec;
Now().DecodeTime(&chour, &cmin, &csec, &cmsec); // pobiera aktualny czas
/* porównanie czasu aktualnego z zadanym z dokładnością do minuty */
if(thour == chour)
{
if(csec <= 1 && tmin == cmin) return true;
}
return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = true; // włącza zegar Timer
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if( TimeTest(8, 15) == true )
{
Timer1->Enabled = false; /* Ztrzymanie zegara - koniecznie przed wywołaniem komunikatu lub okna modalnego */
ShowMessage("Godzina: 8:15");
Timer1->Enabled = true; /*- można wznowić pracę zegara jeżeli zachodzi taka potrzeba */
}
}
Mała uwaga odnoście tego fragmentu kodu:
if(csec <= 1 && tmin == cmin)
Ten kod znaczy tyle co:
jeżeli aktualna sekunda czasy jest mniejsza lub równa 1 i aktualna minuta jest równa z minutą zadaną. To oznacza, że funkcja zwraca wartość true tylko gdy mierzona sekunda jest równa 0 lub 1. Występuje tutaj ryzyko, że test przeskoczy, jeżeli system będzie czymś zajęty i test nie będzie mógł być przeprowadzony przy aktualnej sekundzie równej 0 lub 1. Można zrezygnować z mierzenia sekundy, ale wtedy trzeba koniecznie zatrzymać zegar co najmniej na minutę, w przeciwnym razie co interwał zegara będzie wyskakiwał komunikat lub okno.
Jeżeli pomiarów ma być więcej można oczywiście zrezygnować z zatrzymywania zegara, ale trzeba dodać zmienne, które będą blokowały zbędne pomiary, czyli coś w tym stylu:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static bool stop1 = true, stop2 = true;
if( TimeTest(8, 33) == true && stop1 == true)
{
stop1 = false;
ShowMessage("Godzina: 8:33");
}
if( TimeTest(8, 34) == true && stop2 == true)
{
stop2 = false;
ShowMessage("Godzina: 8:34");
}
}
To jak pobierzesz czas z bazy zależy już oczywiście od tego jaką masz bazę. Zasada się nie zmienia wystarczy funkcji TimeTest przekazać dwie wartości, pierwszy argument to zadana godzina, a drugi to zadana minuta. Tutaj przekazałem te wartości jawnie, ale równie dobrze może się to odbywać przez zmienne.