Ich habe jetzt die Lösung fertig und komplett. Ich musste allerdings aus verschiedenen Gründen noch einige Änderungen vornehmen. Hier mal der Code mit Erklärung...
Delphi-Quellcode:
//Programmstart
procedure TForm1.FormCreate(Sender: TObject);
var
...
begin
...
SetTimer1IntervalEMailStart;//Aufruf in Form.Create oder ähnlichem
end;
//Funktion setzt den Timer.Interval nach dem Programmstart je nach Abhängigkeit der Tageszeit
function TForm1.SetTimer1IntervalEMailStart : Boolean;
var
TimeNow : String;
TimeSend : String;
const
HalfDay = 43200000;//1000ms * 60 Sek * 60 Min * 12 Std
begin
SendEMailTimer1.Enabled := false;
TimeNow := TimeToStr(Now);//Aktuelle Zeit
TimeSend := '20:05:00';//Nächste Startzeit
if TimeSend > TimeNow then //Prüfung ob Sendezeit für aktuellen Tag schon vorbei
begin
//Zeitpunkt für nächsten Step festlegen
SendEMailTimer1.Interval := MilliSecondsBetween(frac(StrToTime(TimeNow)),
frac(StrToTime(TimeSend)));
end
else
begin
//Zeitpunkt festlegen wenn Step für aktuellen Tag vorbei
SendEMailTimer1.Interval := HalfDay - MilliSecondsBetween(frac(StrToTime(TimeNow)),
frac(StrToTime(TimeSend)))+ HalfDay;
end;
SendEMailTimer1.Enabled := true;
end;
//Funktion setzt den Timer.Interval nach erstem TimerOn auf den Tages Step
function TForm1.SetTimer1IntervalEMailTimer : Boolean;
var
TimeStep : 1..24;//Abstand in Stunden
const
Hour = 60000;//1 Stunde in ms
begin
SendEMailTimer1.Enabled := false;
TimeStep := 1;//TimeStep zuweisen z.B. aus Datenbank
SendEMailTimer1.Interval := TimeStep * Hour;//Interval Berechnen
SendEMailTimer1.Tag := 1;//Tag setzen, damit Funktion nur 1 mal ausgeführt wird
SendEMailTimer1.Enabled := true;
end;
//Timer Ereignis
procedure TForm1.SendEMailTimer1Timer(Sender: TObject);
begin
ServiceMemo.Lines.Add(TimeToStr(Time));//Funktion die durch den Timer ausgeführt wird
...
if SendEMailTimer1.Tag <> 1 then //Abfrage ob Tag ungleich 1
SetTimer1IntervalEMailTimer; //Wenn Tag ungleich 1, dann einmal den Interval neu setzen.
end;
Durch die zwei verschiedenen Funktion für das setzten des Timer.Interval, kann realisiert werden, das der Timer nach dem Programmstart um eine bestimmte Uhrzeit ein Ereignis ausführt und anschließend in einen Inteval Modus wechselt.
Somit kann ich in den Behandlungsroutinen festlegen:
Code:
Nächstes Ereignis um: 22:00:00
Abstand: 12 Std
Funktionieren tut es aufjedenfall. Ob es die beste Lösung ist weiß ich nicht. Aber ich hoffe es ist nicht die schlechteste.
Gruß Jens