Jak program nie będzie uruchomiony to przypomnieć może o nim tylko inny program :/. Co do wywołania procedury o określonym czasie proponuję zrobić tak:
Podejście a) Sprawdzasz ile milisekund jest od obecnej godziny do wywołania procedury. Jeśli jest mniejsza od zakresu Interval w Timerze, ustawisz wywołanie Timera na ten czas. Timer po upływie czasu powinien się wyłączyć oraz wywołać procedurę. Jeśli czas jest większy od zakresu Interval (wątpię), ustawiasz największy możliwy Interval, aby po jego upływie znów zacząć całość od początku.
Wymaga trochę gimnastyki :D
Delphi'owy timer możesz oczywiście zastąpić tym z WinAPI, jeśli chcesz zużyć odrobinę mniej zasobów.
Podejście b) Co jakiś czas sprawdzasz czy dana godzina już wybiła - dobre jak masz uruchomić program powiedzmy o 15:30 +- 5 minut. Masz wtedy margines 10 minut więc możesz odpalać Timer co 9 minut i sprawdzać. Jeśli jesteś o 5 minut od określonej godziny - wywołujesz procedurkę.
Im mniejszy masz margines czasu wywołania, tym bardziej obciążasz system częściej sprawdzając czas. Za to proste w wykonaniu.
Podejście c) Zatrudniasz do tego systemowy harmonogram zadań.
Proste, ale użytkownik może go nie mieć włączonego (ja nigdy nie mam, na przykład).