📄 jvscheduledevents.pas
字号:
Result := FSnoozeFire;
end;
procedure TJvEventCollectionItem.Execute;
var
IsSnoozeFire: Boolean;
begin
if State <> sesTriggered then
Exit; // Ignore this message, something is wrong.
FActualTriggerTime := DateTimeToTimeStamp(Now);
IsSnoozeFire := CompareTimeStamps(FActualTriggerTime, FSnoozeFire) >= 0;
if IsSnoozeFire and (CompareTimeStamps(FActualTriggerTime, FScheduleFire) >= 0) then
begin
{ We can't have both, the schedule will win (other possibility: generate two succesive events
from this method, one as a snooze, the other as a schedule) }
FSnoozeFire := NullStamp;
IsSnoozeFire := False;
end;
FState := sesExecuting;
try
FReqTriggerTime := NextFire;
if not IsSnoozeFire then
FScheduleFire := Schedule.NextEventFromNow(CountMissedEvents);
FSnoozeFire := NullStamp;
DoExecute(IsSnoozeFire);
finally
if IsNullTimeStamp(NextFire) then
FState := sesEnded
else
FState := sesWaiting;
end;
end;
procedure TJvEventCollectionItem.PropDateRead(Reader: TReader; var Stamp: TTimeStamp);
var
Str: string;
Y: Integer;
M: Integer;
D: Integer;
H: Integer;
Min: Integer;
MSecs: Integer;
begin
Str := Reader.ReadString;
Y := StrToInt(Copy(Str, 1, 4));
M := StrToInt(Copy(Str, 6, 2));
D := StrToInt(Copy(Str, 9, 2));
H := StrToInt(Copy(Str, 12, 2));
Min := StrToInt(Copy(Str, 15, 2));
MSecs := StrToInt(Copy(Str, 18, 2)) * 1000 + StrToInt(Copy(Str, 21, 3));
Stamp := DateTimeToTimeStamp(EncodeDate(Y, M, D));
Stamp.Time := H * 3600000 + Min * 60000 + MSecs;
end;
procedure TJvEventCollectionItem.PropDateWrite(Writer: TWriter; const Stamp: TTimeStamp);
var
TmpDate: TDateTime;
Y: Word;
M: Word;
D: Word;
MSecs: Integer;
begin
TmpDate := TimeStampToDateTime(Stamp);
DecodeDate(TmpDate, Y, M, D);
MSecs := Stamp.Time;
Writer.WriteString(Format('%.4d/%.2d/%.2d %.2d:%.2d:%.2d.%.3d',
[Y, M, D, (MSecs div 3600000) mod 24, (MSecs div 60000) mod 60,
(MSecs div 1000) mod 60, MSecs mod 1000]));
end;
procedure TJvEventCollectionItem.PropDailyEveryWeekDayRead(Reader: TReader);
begin
(Schedule as IJclDailySchedule).EveryWeekDay := Reader.ReadBoolean;
end;
procedure TJvEventCollectionItem.PropDailyEveryWeekDayWrite(Writer: TWriter);
begin
Writer.WriteBoolean((Schedule as IJclDailySchedule).EveryWeekDay);
end;
procedure TJvEventCollectionItem.PropDailyIntervalRead(Reader: TReader);
begin
(Schedule as IJclDailySchedule).Interval := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropDailyIntervalWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclDailySchedule).Interval);
end;
procedure TJvEventCollectionItem.PropEndCountRead(Reader: TReader);
begin
Schedule.EndCount := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropEndCountWrite(Writer: TWriter);
begin
Writer.WriteInteger(Schedule.EndCount);
end;
procedure TJvEventCollectionItem.PropEndDateRead(Reader: TReader);
var
TmpStamp: TTimeStamp;
begin
PropDateRead(Reader, TmpStamp);
Schedule.EndDate := TmpStamp;
end;
procedure TJvEventCollectionItem.PropEndDateWrite(Writer: TWriter);
begin
PropDateWrite(Writer, Schedule.EndDate);
end;
procedure TJvEventCollectionItem.PropEndTypeRead(Reader: TReader);
begin
Schedule.EndType := TScheduleEndKind(GetEnumValue(TypeInfo(TScheduleEndKind), Reader.ReadIdent));
end;
procedure TJvEventCollectionItem.PropEndTypeWrite(Writer: TWriter);
begin
Writer.WriteIdent(GetEnumName(TypeInfo(TScheduleEndKind), Ord(Schedule.EndType)));
end;
procedure TJvEventCollectionItem.PropFreqEndTimeRead(Reader: TReader);
begin
(Schedule as IJclScheduleDayFrequency).EndTime := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropFreqEndTimeWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclScheduleDayFrequency).EndTime);
end;
procedure TJvEventCollectionItem.PropFreqIntervalRead(Reader: TReader);
begin
(Schedule as IJclScheduleDayFrequency).Interval := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropFreqIntervalWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclScheduleDayFrequency).Interval);
end;
procedure TJvEventCollectionItem.PropFreqStartTimeRead(Reader: TReader);
begin
(Schedule as IJclScheduleDayFrequency).StartTime := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropFreqStartTimeWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclScheduleDayFrequency).StartTime);
end;
procedure TJvEventCollectionItem.PropMonthlyDayRead(Reader: TReader);
begin
(Schedule as IJclMonthlySchedule).Day := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropMonthlyDayWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclMonthlySchedule).Day);
end;
procedure TJvEventCollectionItem.PropMonthlyIndexKindRead(Reader: TReader);
begin
(Schedule as IJclMonthlySchedule).IndexKind :=
TScheduleIndexKind(GetEnumValue(TypeInfo(TScheduleIndexKind), Reader.ReadIdent));
end;
procedure TJvEventCollectionItem.PropMonthlyIndexKindWrite(Writer: TWriter);
begin
Writer.WriteIdent(GetEnumName(TypeInfo(TScheduleIndexKind),
Ord((Schedule as IJclMonthlySchedule).IndexKind)));
end;
procedure TJvEventCollectionItem.PropMonthlyIndexValueRead(Reader: TReader);
begin
(Schedule as IJclMonthlySchedule).IndexValue := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropMonthlyIndexValueWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclMonthlySchedule).IndexValue);
end;
procedure TJvEventCollectionItem.PropMonthlyIntervalRead(Reader: TReader);
begin
(Schedule as IJclMonthlySchedule).Interval := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropMonthlyIntervalWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclMonthlySchedule).Interval);
end;
procedure TJvEventCollectionItem.PropRecurringTypeRead(Reader: TReader);
begin
Schedule.RecurringType :=
TScheduleRecurringKind(GetEnumValue(TypeInfo(TScheduleRecurringKind), Reader.ReadIdent));
end;
procedure TJvEventCollectionItem.PropRecurringTypeWrite(Writer: TWriter);
begin
Writer.WriteIdent(GetEnumName(TypeInfo(TScheduleRecurringKind), Ord(Schedule.RecurringType)));
end;
procedure TJvEventCollectionItem.PropStartDateRead(Reader: TReader);
var
TmpStamp: TTimeStamp;
begin
PropDateRead(Reader, TmpStamp);
Schedule.StartDate := TmpStamp;
end;
procedure TJvEventCollectionItem.PropStartDateWrite(Writer: TWriter);
begin
PropDateWrite(Writer, Schedule.StartDate);
end;
procedure TJvEventCollectionItem.PropWeeklyDaysOfWeekRead(Reader: TReader);
var
TempVal: TScheduleWeekDays;
begin
JclIntToSet(TypeInfo(TScheduleWeekDays), TempVal,
TReaderAccessProtected(Reader).ReadSet(TypeInfo(TScheduleWeekDays)));
(Schedule as IJclWeeklySchedule).DaysOfWeek := TempVal;
end;
procedure TJvEventCollectionItem.PropWeeklyDaysOfWeekWrite(Writer: TWriter);
var
TempVar: TScheduleWeekDays;
begin
TempVar := (Schedule as IJclWeeklySchedule).DaysOfWeek;
THackWriter(Writer).WriteSet(TypeInfo(TScheduleWeekDays),
JclSetToInt(TypeInfo(TScheduleWeekDays), TempVar));
end;
procedure TJvEventCollectionItem.PropWeeklyIntervalRead(Reader: TReader);
begin
(Schedule as IJclWeeklySchedule).Interval := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropWeeklyIntervalWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclWeeklySchedule).Interval);
end;
procedure TJvEventCollectionItem.PropYearlyDayRead(Reader: TReader);
begin
(Schedule as IJclYearlySchedule).Day := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropYearlyDayWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclYearlySchedule).Day);
end;
procedure TJvEventCollectionItem.PropYearlyIndexKindRead(Reader: TReader);
begin
(Schedule as IJclYearlySchedule).IndexKind :=
TScheduleIndexKind(GetEnumValue(TypeInfo(TScheduleIndexKind), Reader.ReadIdent));
end;
procedure TJvEventCollectionItem.PropYearlyIndexKindWrite(Writer: TWriter);
begin
Writer.WriteIdent(GetEnumName(TypeInfo(TScheduleIndexKind),
Ord((Schedule as IJclYearlySchedule).IndexKind)));
end;
procedure TJvEventCollectionItem.PropYearlyIndexValueRead(Reader: TReader);
begin
(Schedule as IJclYearlySchedule).IndexValue := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropYearlyIndexValueWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclYearlySchedule).IndexValue);
end;
procedure TJvEventCollectionItem.PropYearlyIntervalRead(Reader: TReader);
begin
(Schedule as IJclYearlySchedule).Interval := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropYearlyIntervalWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclYearlySchedule).Interval);
end;
procedure TJvEventCollectionItem.PropYearlyMonthRead(Reader: TReader);
begin
(Schedule as IJclYearlySchedule).Month := Reader.ReadInteger;
end;
procedure TJvEventCollectionItem.PropYearlyMonthWrite(Writer: TWriter);
begin
Writer.WriteInteger((Schedule as IJclYearlySchedule).Month);
end;
procedure TJvEventCollectionItem.SetName(Value: string);
begin
if FName <> Value then
begin
FName := Value;
Changed(False);
end;
end;
procedure TJvEventCollectionItem.LoadState(const TriggerStamp: TTimeStamp; const TriggerCount,
DayCount: Integer; const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime);
begin
Schedule.InitToSavedState(TriggerStamp, TriggerCount, DayCount);
FScheduleFire := TriggerStamp;
FSnoozeFire := SnoozeStamp;
FLastSnoozeInterval := ALastSnoozeInterval;
if IsNullTimeStamp(NextFire) or
(CompareTimeStamps(NextFire, DateTimeToTimeStamp(Now)) < 0) then
Schedule.NextEventFromNow(CountMissedEvents);
if IsNullTimeStamp(NextFire) then
FState := sesEnded
else
FState := sesWaiting;
end;
procedure TJvEventCollectionItem.Pause;
begin
if FState = sesWaiting then
FState := sesPaused;
end;
procedure TJvEventCollectionItem.SaveState(out TriggerStamp: TTimeStamp; out TriggerCount,
DayCount: Integer; out SnoozeStamp: TTimeStamp; out ALastSnoozeInterval: TSystemTime);
begin
TriggerStamp := FScheduleFire;
TriggerCount := Schedule.TriggerCount;
DayCount := Schedule.DayCount;
SnoozeStamp := FSnoozeFire;
ALastSnoozeInterval := LastSnoozeInterval;
end;
procedure TJvEventCollectionItem.Snooze(const MSecs: Word; const Secs: Word = 0;
const Mins: Word = 0; const Hrs: Word = 0; const Days: Word = 0);
var
IntervalMSecs: Integer;
SnoozeStamp: TTimeStamp;
begin
// Update last snooze interval
FLastSnoozeInterval.wDay := Days;
FLastSnoozeInterval.wHour := Hrs;
FLastSnoozeInterval.wMinute := Mins;
FLastSnoozeInterval.wSecond := Secs;
FLastSnoozeInterval.wMilliseconds := MSecs;
// Calculate next event
IntervalMSecs := MSecs + 1000 * (Secs + 60 * Mins + 1440 * Hrs);
SnoozeStamp := DateTimeToTimeStamp(Now);
SnoozeStamp.Time := SnoozeStamp.Time + IntervalMSecs;
if SnoozeStamp.Time >= HoursToMSecs(24) then
begin
SnoozeStamp.Date := SnoozeStamp.Date + (SnoozeStamp.Time div HoursToMSecs(24));
SnoozeStamp.Time := SnoozeStamp.Time mod HoursToMSecs(24);
end;
Inc(SnoozeStamp.Date, Days);
FSnoozeFire := SnoozeStamp;
end;
procedure TJvEventCollectionItem.Start;
begin
if FState in [sesTriggered, sesExecuting] then
raise EJVCLException.CreateRes(@RsECannotRestart);
if State = sesPaused then
begin
FScheduleFire := Schedule.NextEventFromNow(CountMissedEvents);
if IsNullTimeStamp(NextFire) then
FState := sesEnded
else
FState := sesWaiting;
end
else
begin
FState := sesNotInitialized;
Schedule.Reset;
FScheduleFire := Schedule.NextEventFromNow(CountMissedEvents);
if IsNullTimeStamp(NextFire) then
FState := sesEnded
else
FState := sesWaiting;
end;
end;
procedure TJvEventCollectionItem.Stop;
begin
if State <> sesNotInitialized then
FState := sesNotInitialized;
end;
(*
procedure TJvEventCollectionItem.LoadFromStreamBin(const S: TStream);
begin
ScheduledEventStore_Stream(S, True, False).LoadSchedule(Self);
end;
procedure TJvEventCollectionItem.SaveToStreamBin(const S: TStream);
begin
ScheduledEventStore_Stream(S, True, False).SaveSchedule(Self);
end;
*)
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
finalization
FinalizeScheduleThread;
{$IFDEF UNITVERSIONING}
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -