📄 jvtfmanager.pas
字号:
begin
if Assigned(Schedule) then
begin
Schedule.Notify(Self, sncConnectAppt);
SchedID := ScheduleManager.GetScheduleID(Schedule.SchedName, Schedule.SchedDate);
I := FConnections.IndexOf(SchedID);
if I = -1 then
begin
FConnections.AddObject(SchedID, Schedule);
ScheduleManager.RefreshConnections(Schedule);
end;
end;
end;
procedure TJvTFAppt.Disconnect(Schedule: TJvTFSched);
var
I: Integer;
begin
if Assigned(Schedule) then
begin
Schedule.Notify(Self, sncDisconnectAppt);
I := FConnections.IndexOfObject(Schedule);
if I > -1 then
begin
FConnections.Delete(I);
ScheduleManager.RefreshConnections(Schedule);
end;
end;
end;
procedure TJvTFAppt.Change;
begin
// implicit post fix
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing and not Updating then
Post;
ScheduleManager.RefreshConnections(Self);
end;
procedure TJvTFAppt.InternalClearSchedules;
begin
FSchedules.Clear;
CheckConnections;
end;
procedure TJvTFAppt.Assign(Source: TPersistent);
var
I: Integer;
begin
if Source is TJvTFAppt then
begin
for I := 0 to TJvTFAppt(Source).ScheduleCount - 1 do
AddSchedule(TJvTFAppt(Source).Schedules[I]);
ImageMap.Assign(TJvTFAppt(Source).ImageMap);
SetStartEnd(TJvTFAppt(Source).StartDate, TJvTFAppt(Source).StartTime,
TJvTFAppt(Source).EndDate, TJvTFAppt(Source).EndTime);
Description := TJvTFAppt(Source).Description;
AlarmEnabled := TJvTFAppt(Source).AlarmEnabled;
AlarmAdvance := TJvTFAppt(Source).AlarmAdvance;
Data := TJvTFAppt(Source).Data;
end
else
inherited Assign(Source);
end;
procedure TJvTFAppt.SetStartEnd(NewStartDate: TDate; NewStartTime: TTime;
NewEndDate: TDate; NewEndTime: TTime);
begin
// The following avoids time overflow into next day when it is not
// intended. (Add appt to last row of days would cause invalid
// start/end exception.)
if Frac(NewEndTime) <= EncodeTime(0, 0, 0, 999) then
NewEndTime := EncodeTime(23, 59, 59, 0);
if Trunc(NewStartDate) <= Trunc(NewEndDate) then
begin
if Trunc(NewStartDate) = Trunc(NewEndDate) then
if Frac(NewStartTime) >= Frac(NewEndTime) then
raise EJvTFScheduleManagerError.CreateRes(@RsEInvalidStartAndEndTimes);
FStartDate := NewStartDate;
FEndDate := NewEndDate;
FStartTime := NewStartTime;
FEndTime := NewEndTime;
CheckConnections;
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing then
begin
FModified := True;
Change;
end
end
else
raise EJvTFScheduleManagerError.CreateRes(@RsEInvalidStartAndEndDates);
end;
procedure TJvTFAppt.SetModified;
begin
FModified := True;
// implicit post fix
Change;
end;
function TJvTFAppt.Modified: Boolean;
begin
Result := FModified;
end;
function TJvTFAppt.ConnectionCount: Integer;
begin
Result := FConnections.Count;
end;
function TJvTFAppt.ScheduleCount: Integer;
begin
Result := FSchedules.Count;
end;
procedure TJvTFAppt.AddSchedule(const SchedName: string);
var
ADate: TDate;
Schedule: TJvTFSched;
begin
if SchedName = '' then
Exit;
// Add it to the schedules list
if FSchedules.IndexOf(SchedName) = -1 then
begin
FSchedules.Add(SchedName);
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing then
begin
FModified := True;
// implicit post fix
Change;
end;
end;
// Check for needed connections
// (Only connects to currently loaded schedules. Will not load a schedule.)
ADate := StartDate;
while Trunc(ADate) <= Trunc(EndDate) do
begin
Schedule := ScheduleManager.FindSchedule(SchedName, ADate);
if Assigned(Schedule) then
Connect(Schedule);
ADate := ADate + 1;
end;
{ implicit post fix
// To avoid display anomolies we need to post the appt here.
If not FDeleting and not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing Then
Post;
}
end;
procedure TJvTFAppt.RemoveSchedule(const SchedName: string);
var
I: Integer;
ADate: TDate;
Schedule: TJvTFSched;
begin
if SchedName = '' then
Exit;
// Remove it from the schedule list
I := FSchedules.IndexOf(SchedName);
if I > -1 then
begin
FSchedules.Delete(I);
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing then
begin
FModified := True;
// implicit post fix
Change;
end;
end;
// Check for invalid connections and disconnect
ADate := StartDate;
while Trunc(ADate) <= Trunc(EndDate) do
begin
Schedule := ScheduleManager.FindSchedule(SchedName, ADate);
if Assigned(Schedule) then
Disconnect(Schedule);
ADate := ADate + 1;
end;
{ implicit post fix
// To avoid display anomolies we need to post the appt here.
If not FDeleting and not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing Then
Post;
}
end;
procedure TJvTFAppt.AssignSchedules(List: TStrings);
begin
FSchedules.Assign(List);
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing then
begin
FModified := True;
// implicit post fix
Change;
end;
CheckConnections;
end;
procedure TJvTFAppt.ClearSchedules;
begin
FSchedules.Clear;
if not ScheduleManager.LoadingAppts and not ScheduleManager.Refreshing then
begin
FModified := True;
// implicit post fix
Change;
end;
CheckConnections;
end;
function TJvTFAppt.IndexOfSchedule(const SchedName: string): Integer;
begin
Result := FSchedules.IndexOf(SchedName);
end;
function TJvTFAppt.Shared: Boolean;
begin
Result := ScheduleCount > 1;
end;
procedure TJvTFAppt.Post;
begin
ScheduleManager.dbPostAppt(Self);
end;
procedure TJvTFAppt.Refresh;
begin
ScheduleManager.dbRefreshAppt(Self);
end;
procedure TJvTFAppt.Delete;
begin
ScheduleManager.dbDeleteAppt(Self);
end;
procedure TJvTFAppt.RefreshControls;
begin
ScheduleManager.RefreshConnections(Self);
end;
function TJvTFAppt.GetEndDateTime: TDateTime;
begin
Result := Trunc(EndDate) + Frac(EndTime);
end;
function TJvTFAppt.GetStartDateTime: TDateTime;
begin
Result := Trunc(StartDate) + Frac(StartTime);
end;
function TJvTFAppt.GetEndDate: TDate;
begin
Result := Int(FEndDate);
end;
function TJvTFAppt.GetEndTime: TTime;
begin
Result := Frac(FEndTime);
end;
function TJvTFAppt.GetStartDate: TDate;
begin
Result := Int(FStartDate);
end;
function TJvTFAppt.GetStartTime: TTime;
begin
Result := Frac(FStartTime);
end;
procedure TJvTFAppt.DeleteApptNotification;
begin
FDeleting := True;
try
InternalClearSchedules;
finally
FDeleting := False;
end;
end;
procedure TJvTFAppt.PostApptNotification;
begin
FModified := False;
FUpdating := False;
end;
procedure TJvTFAppt.BeginUpdate;
begin
FUpdating := True;
end;
procedure TJvTFAppt.EndUpdate;
begin
if FUpdating then
begin
FUpdating := False;
Change;
end;
end;
procedure TJvTFAppt.SetRefreshed(Value: Boolean);
begin
FRefreshed := Value;
end;
procedure TJvTFAppt.RefreshNotification;
begin
FModified := False;
Refreshed := False;
end;
//=== { TJvTFSched } =========================================================
constructor TJvTFSched.Create(Serv: TJvTFScheduleManager; const AName: string;
ADate: TDate);
begin
inherited Create;
FScheduleManager := Serv;
FSchedName := AName;
FSchedDate := ADate;
FAppts := TStringList.Create;
FConControls := TStringList.Create;
FConControls.OnChange := ConnectionsOnChange;
FConComponents := TStringList.Create;
FConComponents.OnChange := ConnectionsOnChange;
if Assigned(Serv) then
Serv.DoCreateScheduleEvent(Self);
end;
destructor TJvTFSched.Destroy;
var
Ctrl: TJvTFControl;
Comp: TJvTFComponent;
Appt: TJvTFAppt;
begin
FDestroying := True;
if Assigned(ScheduleManager) then
ScheduleManager.DoDestroyScheduleEvent(Self);
while ConControlCount > 0 do
begin
Ctrl := TJvTFControl(FConControls.Objects[0]);
ScheduleManager.ReleaseSchedule(Ctrl, SchedName, SchedDate);
end;
while ConComponentCount > 0 do
begin
Comp := TJvTFComponent(FConComponents.Objects[0]);
ScheduleManager.ReleaseSchedule(Comp, SchedName, SchedDate);
end;
while ApptCount > 0 do
begin
Appt := Appts[0];
Appt.Notify(Self, sncDisconnectAppt);
end;
ScheduleManager.Notify(Self, sncDestroySchedule);
FAppts.Free;
FConControls.Free;
FConComponents.Free;
inherited Destroy;
end;
function TJvTFSched.GetAppt(Index: Integer): TJvTFAppt;
begin
Result := TJvTFAppt(FAppts.Objects[Index]);
end;
procedure TJvTFSched.Notify(Sender: TObject; Code: TJvTFServNotifyCode);
var
I: Integer;
ConList: TStringList;
begin
if Sender is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -