Ok... also es ist folgendes, es geht um einen Wecker. Dieser soll nach mehreren (Hunderte, oder Tausende) Terminen "Ausschau" halten, und bei angegebener Zeit Alarm schlagen. Das heißt, dass ich jede Sekunde die aktuelle Uhrzeit mit der in der
DB vergleichen muss. Nun suche ich wie ich das am besten mache. Eine binäre Suche wäre schon sinnvoll, oder?
In meiner Terminverwaltung mache ich das so, daß ich im Datenmodul eine Public-Methode bereitstelle. Beim Programmstart wird der nächste Termin in einer Variablen gespeichert:
Delphi-Quellcode:
Function DatMod.GetNextAlarmDate : TDateTime;
Begin
Query.Active := False;
Query.SQL.Clear;
Query.SQL.Append('
select TERMINDATUM, ALARM from TERMINE');
Query.SQL.Append('
where ALARM = 1');
// Boolsche Variablen werden z.B. in Firebird als 0 und 1 gespeichert
Query.SQL.Append('
order by TERMINDATUM');
// das "kleiste" Datum steht am Anfang
Query.Open;
Query.Last;
// an das "größte" Datum springen
Result :=
Query.FieldByName('
TERMINDATUM').AsDateTime;
Query.Active := False;
Query.SQL.Clear;
End;
Dieses Resultat speichere ich nun in einer Variablen, die in der Ereignisbehandlung vom Timer mit der aktuellen Uhrzeit verglichen wird. Ist das Datum erreicht, klingelts und in der Alarm-Methode wird dann wieder der nächste Termin in diese Variable gesetzt. Empfehlenswert ist auch eine Spalte, die angibt, wieviele Sekunden oder Minuten vor dem eigentlichen Termin der Alarm losgehen soll oder auch eine Variable, die diese Zeit für alle Termine gleich behandelt.