⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utaskchart.pas

📁 DELPHI 一个可以实现排期的控件 显示排期
💻 PAS
📖 第 1 页 / 共 5 页
字号:
        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 + -