📄 utaskchart.pas
字号:
pMTemp:= self.Items[i];
for j :=0 to pMTemp.Count - 1 do
begin
if pMTemp.Items[j].DataStatus = dsUpdate then
begin
//将数据状态必改为没变化状态
// pMTemp.Items[j].DataStatus:= dsNone;
self.lstUpdateTask.Add(pMTemp.Items[j]);
end;
end;
end;
Result:= lstUpdateTask
end;
//------------------------------------------------------------------------------
//获取已删除的任务集
function TTaskChart.GetDeleteTask():TlstTask;
begin
Result:= self.lstDeleteTask;
end;
//------------------------------------------------------------------------------
constructor TTaskChart.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
TaskChart:= self; //一定要将自己付值给全局变量 TaskChart
//初始化数据
lstTimeBar:= TlstTimeBar.Create;
lstMachine:= TlstMachine.Create;
lstAddTask:= TlstTask.Create;
lstUpdateTask:= TlstTask.Create;
lstDeleteTask:= TlstTask.Create;
iStartLeft:= self.sbMachineName.Width; // 60; //起始位置
// showMessage(pchar(Inttostr(self.sbMachineName.Width)+' '+Inttostr(self.sbMother.left)));
iSpaceVal:= 16; //间距 表时四小时,每一小时为2
iIncreaseVal:= 1; //间距倍数(iSpaceVal的倍数)
pnlTarget.Visible:=false;
// showMessage('Create');
//机器默认高度为40
MachineHeight:= 30;
//生成时间刻度
ShowDateScale();
TaskChart.sbMachineMother.Top:= 10;
//test半分钟触发一次的事件
// FTimer:= TTimer.Create(self);
// FTimer.Enabled:= true;
// FTimer.Interval:= 500;
// FTimer.OnTimer:= FTimerTimer;
end;
//------------------------------------------------------------------------------
//返回当前时间在时间条上所对应的位置
function TTaskChart.getPositionByCutTime:Integer;
begin
if Now < self.dtpStart.DateTime then
Result:= 0
else if Now> self.dtpEnd.DateTime then
Result:= self.lstTimeBar.GetValueByTime(self.dtpEnd.DateTime)
else
Result:= self.lstTimeBar.GetValueByTime(Now) + lstTimeBar.scrbMother.HorzScrollBar.Position;
end;
//test半分钟触发一次的事件
{//------------------------------------------------------------------------------
procedure TTaskChart.FTimerTimer(Sender: TObject);
var DT: TDateTime;
Temp: Word;
begin
DT:= now;
FOldSecond:= FSecond;
DecodeTime(DT, Temp, Temp, FSecond, TEmp);
if FSecond<>FOldSecond then
if ((FSecond= 30)or(FSecond = 0)) then
DoHalfMinute(DT);
end;
//test半分钟触发一次的事件
//------------------------------------------------------------------------------
procedure TTaskChart.DoHalfMinute(TheTime: TDateTime);
begin
if Assigned(FOnHalfMinute) then
FOnHalfMinute(self, TheTime);
end;
}
//------------------------------------------------------------------------------
destructor TTaskChart.Destroy;
begin
//释放内存空间
//释放时间刻度和日期指针所指所有对象
lstTimeBar.ClearPointerList;
lstTimeBar.Free;
//释放机器指针及所指所有对象
lstMachine.ClearPointerList;
lstMachine.Free;
//释放新添任务指针
lstAddTask.Free;
//释放已修改任务指针
lstUpdateTask.Free;
//释放已删除任务指针
lstDeleteTask.Free;
inherited Destroy;
end;
//------------------------------------------------------------------------------
//任务合并之前的事件
procedure TTaskChart.DoOnBeforeMergeTask(Sender: TObject; MainTask: TTask ;Task :TTask; var Action: TMergeAction );
begin
if Assigned(FOnBeforeMergeTask) then
FOnBeforeMergeTask(Sender, MainTask, Task, Action);
end;
//------------------------------------------------------------------------------
//任务合并之后的事件
procedure TTaskChart.DoOnAfterMergeTask(Sender: TObject; MainTask: TTask ;Task :TTask );
begin
if Assigned(FOnAfterMergeTask) then
FOnAfterMergeTask(Sender, MainTask, Task);
end;
//------------------------------------------------------------------------------
//拖动任务前的事件
procedure TTaskChart.DoOnBeforeChangeMachine(Sender: TObject; Machine: TMachine; Task: TTask; var Action : TChangeMachineAction);
begin
if Assigned(FOnBeforeChangeMachine) then
FOnBeforeChangeMachine(Sender, Machine, Task, Action );
end;
//------------------------------------------------------------------------------
//拖动任务后的事件
procedure TTaskChart.DoOnAfterChangeMachine(Sender: TObject; Machine: TMachine; Task: TTask );
begin
if Assigned(FOnAfterChangeMachine) then
FOnAfterChangeMachine(Sender, Machine, Task);
end;
//------------------------------------------------------------------------------
//删除所有已保存的任务, 更新所有任务状态为无
procedure TTaskChart.PostAll();
var lstTask: TlstTask;
i, iCount: Integer;
begin
//获取新添任务并记录已保存后的机器名称.开始结束时间
lstTask:= GetNewTask();
iCount:= lstTask.Count;
for i :=0 to iCount-1 do
begin
lstTask.Items[i].DataStatus:= dsNone;
lstTask.Items[i].OldMachineName:= lstTask.Items[i].MachineName;
lstTask.Items[i].OldBeginTime := lstTask.Items[i].BeginTime;
lstTask.Items[i].OldEndTime := lstTask.Items[i].OldEndTime;
end;
//获取更新任务并记录已更新后的机器名称.开始结束时间
lstTask:= self.GetUpdateTask();
iCount:= lstTask.Count;
for i :=0 to iCount-1 do
begin
lstTask.Items[i].DataStatus:= dsNone;
lstTask.Items[i].OldMachineName:= lstTask.Items[i].MachineName;
lstTask.Items[i].OldBeginTime := lstTask.Items[i].BeginTime;
lstTask.Items[i].OldEndTime := lstTask.Items[i].EndTime;
end;
//获取删除任务
lstTask:= self.GetDeleteTask();
lstTask.Clear;
end;
//------------------------------------------------------------------------------
//显示时间刻度
procedure TTaskChart.ShowDateScale();
begin
lstTimeBar.ShowDateScale(dtpStart.DateTime,dtpEnd.DateTime, sbMother,iIncreaseVal);
//按时间刻度间距调整任务宽度
lstMachine.TaskAutoSize(iIncreaseVal);
end;
//------------------------------------------------------------------------------
//取开始日期
function TTaskChart.GetBeginDate():TDateTime;
begin
// showMessage('GetBeginDate');
Result:= self.dtpStart.DateTime;
end;
//------------------------------------------------------------------------------
//写开始日期
procedure TTaskChart.SetBeginDate(startDate: TDateTime);
begin
//开始时间相同
if (lstTimeBar.StartDate = StartDate) then
exit;
//如果结束时间比开始时间大超过90天
if (dtpEnd.DateTime - startDate)>90 then
dtpEnd.DateTime := startDate +90
//结束时间小于开始时间
else if (dtpEnd.DateTime - startDate)<0 then
dtpEnd.DateTime := startDate;
//记录当前开始时间
self.lstTimeBar.StartDate:= StartDate;
//画时间条
TaskChart.ShowDateScale;
end;
//------------------------------------------------------------------------------
//取结束日期
function TTaskChart.GetEndDate():TDateTime;
begin
// showMessage('GetBeginDate');
Result:= self.dtpEnd.DateTime;
end;
//------------------------------------------------------------------------------
//写结束日期
procedure TTaskChart.SetEndDate(EndDate: TDateTime);
begin
//结束时间相同
if (lstTimeBar.EndDate = EndDate) then
exit;
//如果结束时间比开始时间大超过90天
if (EndDate - dtpStart.DateTime)>90 then
dtpEnd.DateTime := dtpStart.DateTime +90
//结束时间小于开始时间
else if (EndDate - dtpStart.DateTime)<0 then
dtpEnd.DateTime := dtpStart.DateTime;
//记录结束时间
lstTimeBar.EndDate := EndDate;
//画时间条
TaskChart.ShowDateScale;
end;
//------------------------------------------------------------------------------
//添加机器
procedure TTaskChart.AddMachine(newMachine:TMachine);
begin
// lstMachine.AddMachine(MachineName,ppmMachine);
// lstMachine.NewMachine(MachineName,ppmMachine);
lstMachine.AddMachine(newMachine);
end;
//------------------------------------------------------------------------------
//添加任务
procedure TTaskChart.AddTask(newTask:TTask; MachineName: string);
begin
lstMachine.AddTask(newTask, MachineName);
end;
//------------------------------------------------------------------------------
//删除机器
procedure TTaskChart.DeleteMachine(MachineName: string);
begin
lstMachine.DeleteMachine(MachineName);
end;
//------------------------------------------------------------------------------
//删除任务
procedure TTaskChart.DeleteTask(TaskName: string);
var pTemp: TTask;
pMachine: TMachine;
begin
pTemp:= self.FindTaskByName(TaskName);
if pTemp<>nil then
begin
pMachine:= TMachine(pTemp.Parent);
pTemp.Parent:= nil;
pTemp.Visible:= false;
//加入到删除队列
lstDeleteTask.Add(pTemp);
lstMachine.RefreshTask(pMachine,nil);
end
else
Application.MessageBox('找不到相应的任务名称! ','删除失败', MB_OK+MB_ICONHAND);
end;
//------------------------------------------------------------------------------
//合并任务
procedure TTaskChart.MergeTask(MainTask: TTask; SecondTask: TTask);
var pTemp, pMain: TMachine;
maVal: TMergeAction;
begin
if (tempMainTask = nil) or (tempSecondTask = nil) then
exit;
//触发合并前事件
// maVal:= mtaMerge;
TaskChart.DoOnBeforeMergeTask(self, TaskChart.tempMainTask, TaskChart.tempSecondTask , maVal);
//如果取消合并, 退出
if maVal = mtaNone then
begin
tempMainTask.Color:= tempMainTask.OldColor;
tempSecondTask.Color:= tempSecondTask.OldColor;
exit;
end;
//更改任务数据状态
MainTask.DataStatus:= dsUpdate;
MainTask.Width:= MainTask.Width + SecondTask.Width;
MainTask.Value:= MainTask.Value + SecondTask.Value;
// MainTask.EndTime:= lstTimeBar.GetTimeByValue(MainTask.Left + MainTask.Width);
MainTask.Hint:= DateTimeToStr(MainTask.BeginTime)+' ~ '+ DateTimeToStr(MainTask.EndTime);
// MainTask.Width:= lstTimeBar.GetValueByTime(MainTask.EndTime)- MainTask.Left ;
MainTask.Caption:= MainTask.Caption +' + '+ SecondTask.Caption;
SecondTask.DataStatus:= dsDelete;
//记录父窗体
pMain:= TMachine(MainTask.Parent);
pTemp:= TMachine(SecondTask.Parent);
//恢复原来低色
tempMainTask.Color:= tempMainTask.OldColor;
SecondTask.Parent:= nil;
SecondTask.Visible:= false;
//加入到删除队列
lstDeleteTask.Add(SecondTask);
//刷新合并主任务所在机器任务
lstMachine.RefreshTask(pMain,tempMainTask);
//刷新被合并任务所在机器任务
lstMachine.RefreshTask(pTemp,nil);
//触发合并后事件
TaskChart.DoOnAfterMergeTask(self,tempMainTask,nil);
tempMainTask:= nil;
tempSecondTask:= nil;
end;
//------------------------------------------------------------------------------
//按任务名称返回任务指针
function TTaskChart.FindTaskByName(TaskName: string): TTask;
begin
Result:= lstMachine.FindTaskByName(TaskName);
end;
//------------------------------------------------------------------------------
//按机器名称返回机器指针
function TTaskChart.FindMachineByName(MachineName:string):TMachine;
begin
Result:= lstMachine.FindMachine(MachineName);
end;
//------------------------------------------------------------------------------
//刷新指定机器上的任务位置
procedure TTaskChart.RefreshMachine(Machine: TMachine);
begin
self.lstMachine.RefreshTask(Machine, nil);
end;
//------------------------------------------------------------------------------
{ //组件编辑器
procedure TSampleEditor.ExecuVerb(Index: Integer);
begin
case Index of
0: TSampleEditor
1:
end; }
//------------------------------------------------------------------------------
{//组件编辑器
procedure TTaskChart.SayHello;
begin
ShowMessage('Hello, ther!');
end;
}
//------------------------------------------------------------------------------
procedure Register;
begin
RegisterComponents('standard',[TTaskChart]);
//注册组件编辑器
// RegisterComponentEditor( TTaskChart, TSampleEditor);
end;
//==============================================================================
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TTaskChart.dtpStartCloseUp(Sender: TObject);
begin
//设置开始时间
if dtpStart.DateTime <> lstTimeBar.StartDate then
TaskChart.BeginDate:= dtpStart.DateTime;
//设置结束时间
if dtpEnd.DateTime <> lstTimeBar.EndDate then
TaskChart.EndDate:= dtpEnd.DateTime;
//重画
self.Repaint;
end;
//------------------------------------------------------------------------------
procedure TTaskChart.BitBtn2Click(Sender: TObject);
begin
if iIncreaseVal>1 then
iIncreaseVal:= iIncreaseVal-1;
self.ShowDateScale;
end;
procedure TTaskChart.sbMotherCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if lstTimeBar<>nil then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -