Como bien dices, el Timer lo necesitas, pero en lugar de ponerle un interval de 100 milisegundos, le pones el total que necesites, por ejemplo:
Código Delphi
[-]
var FechaAviso:Tdatetime; miliseg:Word;
begin
milisegundos := MillisecondsBetween(fechaAviso, Now);
if miliseg > 1000 then
begin
Timer1.Interval := miliseg;
Timer1.Enabled := true;
end;
Como miliseg es de tipo Word, creo que permitía almacenar algo así como 9 semanas, es decir, puedes establecer
1 sola vez el timer para que te avise dentro de 9 semanas.
La función compareTime no la necesitas, una fecha y hora se guarda como un número en coma flotante, donde la parte entera corresponde a los dias que han pasado sobre la fecha base del calendario,(creo recordar que la fecha base de los calendarios es 01/01/1900, de hecho si asignas a una fecha el valor cero, te dará 31/12/1899, un día menos

). La parte fraccionaria de ese número es la hora.
Si quieres saber si una fecha es más grande que otra...:
Código Delphi
[-]
if fechaAviso > Now() then
Sumar dias, horas o minutos a fechas:
Código Delphi
[-]
const UnDia = 1;
UnaHora = 1 / 24; UnMinuto = 1 /( 24 *60);
UnSegundo = UnMinuto / 60;
begin
FechaAviso := now() + undia;
saludos