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

📄 utaskchart.pas

📁 DELPHI 一个可以实现排期的控件 显示排期
💻 PAS
📖 第 1 页 / 共 5 页
字号:
        end;//月循环
    end; //年循环
    //画最后一条线
    self.DrawEndBar(scrbMother);
    //自动调节显示宽度(根据最后一条线的位置)
    TaskChart.pnlAutoSize.Width:= self.iPreLeft - TaskChart.iStartLeft;//+50;
end;


{  TlstMachine }
{******************************************************************************}

//释放机器指针所指所有对象
procedure TlstMachine.ClearPointerList();
var i,j:Integer;
    pTemp:TMachine;
begin
    //清空时间刻度指针
    for  i:=0  to self.Count-1 do
    begin
       pTemp:=TMachine(self.Items[0]);
       //先清空该机器上的所有任务
       for  j:=1  to pTemp.ControlCount do
       begin
           pTemp.Controls[0].Free;
       end;
       self.Remove(pTemp);
       pTemp.Free;
       pTemp:= nil;
    end;
    self.Clear;
 end;

//------------------------------------------------------------------------------
procedure TlstMachine.NewMachineName(pMother: TMachine;machineNme:string);
var pTemp:TPanel; //TLabel;
{如果机器名称用TLabel, 那么它将始终排在该机器的第一位,
 如果用TPael或者TButton的话,那么它将始终排在该机器的最后一位
 这样是为了防止取该机器上所有任务时取机器名称对象.
 注: 在TMachine的Item处取所有任务,
     在TaskChart的RefreshTask, TaskAutoSize调用
 }
               //新机器名称(直接放在机器控件上, 但现不用, 为了修改程序不出错,
               //只将其隐藏, 其它程序就不用修改)
 begin
   pTemp:= TPanel.Create(nil);
   with pTemp do
   begin
      Width:= 50;
       Caption := TMachine(pMother).Name;//machineNme+IntToStr(iTaskNo) ;
       parent:= pMother;
       Align:= alLeft;
       visible:= false;
   end;
   //添加显示机器名称的控件
   pTemp:= nil;
   pTemp:= TPanel.Create(nil);
   with pTemp do
   begin
       Left := 0;
       Top := TaskChart.sbMachineMother.Height;
       Height := pMother.Height  ;//TMachine(pMother).Height  ;
      // width:= TMachine(pMother).Width;
       Align:= alTop;
       parent:= TaskChart.sbTest;
       Caption:= machineNme;
   end;
   pMother.NameControl:= pTemp;
end;
//------------------------------------------------------------------------------
     //将机器对象加入到指针对象中
procedure TlstMachine.AddMachine(Machine:TMachine);
begin

   with Machine do
   begin
       Left := 0;
       Top := TaskChart.sbMachineMother.Height;
       Height := TaskChart.MachineHeight;
       Align:= alTop;
       BevelInner:= bvNone;//bvLowered;
       BevelOuter:= bvNone;//bvRaised;
       Color:= $00DDDDDD;
    //del   BorderStyle:=bsNone;
       parent:= TaskChart.sbMachineMother;//.sbMother;
       //机器名称
    //   MachineName:= machineNme +IntToStr(iMachine);
   end;

   // 添加一个控件用于显示机器名称
   NewMachineName(Machine,Machine.Name);
    self.Add(Machine);

end;
//------------------------------------------------------------------------------
//生成机器对象                      
procedure TlstMachine.NewMachine(machineNme:string;ppMenu:TPopupMenu);    //     pMother:TScrollBox;ppMenu:TPopupMenu
var pTemp:TMachine;
begin                //添加新机器

   iMachine:= iMachine+1;
   pTemp:= TMachine.Create(nil);
   with pTemp do
   begin     
       Left := 0;
       Top := 00 ;
       Height := 40 ;
       Align:= alTop;
       BevelInner:= bvNone;
       BevelOuter:= bvNone;
     //del  BorderStyle:=bsNone;
     //  parent:= TaskChart.sbMother;
       popupMenu:= ppMenu;
       Name:= machineNme+ IntToStr(iMachine);
   end;
   

   AddMachine(pTemp);
   pTemp:=nil;
end;
//-------------- 按机器名称获取最早一个任务 ----------------------------------------------------------------
function TlstMachine.GetFirstTaskByMachine(MachineName:String):TTask;
var firstBeginTime: TDateTime;
    i: Integer;
    pTask: TTask;
    pMachine: TMachine;
begin
    pTask:= nil;
    //查找机器
    pMachine:= self.FindMachine(MachineName);
    //如果不存在或者该机器上的任务为0,返回空
    if (pMachine=nil) or (pMachine.Count<1) then
    begin
         Result:= nil;
         exit;
    end;
    //取第一个任务
    pTask:= pMachine.Items[0];
    //将该任务结束时间为临时最后结束时间
    firstBeginTime:= pTask.BeginTime ;
    //查找比临时最后结束时间更迟的结束时间
    for i := 0 to pMachine.Count-1 do
    begin
        if (pMachine.Items[i].BeginTime< pTask.BeginTime) then
        begin
            pTask:= pMachine.Items[i];
            firstBeginTime:= pTask.BeginTime;
        end;
    end;
    Result:= pTask;

end;

//---------- 按机器名称获取最后一个任务--------------------------------------------------------------------
function TlstMachine.GetLastTaskByMachine(MachineName:String):TTask;
var lastEndTime: TDateTime;
    i: Integer;
    pTask: TTask;
    pMachine: TMachine;
begin
    pTask:= nil;
    //查找机器
    pMachine:= self.FindMachine(MachineName);
    //如果不存在或者该机器上的任务为0,返回空
    if (pMachine=nil) or (pMachine.Count<1) then
    begin
         Result:= nil;
         exit;
    end;
    //取第一个任务
    pTask:= pMachine.Items[0];
    //将该任务结束时间为临时最后结束时间
    lastEndTime:= pTask.EndTime;
    //查找比临时最后结束时间更迟的结束时间
    for i := 0 to pMachine.Count-1 do
    begin
        if (pMachine.Items[i].EndTime>pTask.EndTime) then
        begin
            pTask:= pMachine.Items[i];
            lastEndTime:= pTask.EndTime;
        end;
    end;
    Result:= pTask;
end;
//------------------------------------------------------------------------------
//将一个任务对象加入到机器中
procedure TlstMachine.AddTask(Task:TTask;MachineName:String);
var pTask: TTask;
    pMachine: TMachine;
    iLeft, iSpaceLeng: Integer;                                

begin
     //获取目标机器
     pMachine:= FindMachine(MachineName);
     if pMachine=nil then
     begin
        Application.MessageBox('找不到相应机器名称!           ','任务添加失败'MB_OK+MB_ICONERROR);
        exit;
     end;
     //取目标机器上的最后一个任务
     pTask:= GetLastTaskByMachine(MachineName);
     //如果目标机器上还没有任务, 则开始时间为当前时间
     if pTask = nil then
     begin

       Task.Left:= TaskChart.lstTimeBar.GetValueByTime(now);//0//TaskChart.iStartLeft
     end
     //  Task.Left:= TaskChart.iStartLeft
     else
     begin
         //获取目标机器 任务间隔实际长度
        iSpaceLeng:= round((pMachine.SetTime)/ 4 * TaskChart.iSpaceVal * TaskChart.iIncreaseVal);
        //计算新任务位置
        iLeft:= pTask.Left+ pTask.Width+ iSpaceLeng;
        Task.Left:= iLeft;
        Task.ShowHint:= true;
     end;
     with Task do
     begin
         Top :=  round((pMachine.Height- Height)/2);
         Visible:= true;
         //zhr(Temp)
         Width:= Round(Value*(TaskChart.iSpaceVal/4)*TaskChart.iIncreaseVal);
         Caption := Name;//+IntToStr(iTaskNo) ;
         if pMachine<>nil then
             parent:= pMachine
         else
             Application.MessageBox('找不到相应的机器名!      ','添加任务失败',MB_OK+MB_ICONHAND);
         OnMouseDown:= TaskMouseDown;
         OnMouseMove:= TaskMouseMove;
         OnMouseUp  := TaskMouseUp;
     end;

     //根据左边位置获取对应时间
     Task.BeginTime:= TaskChart.lstTimeBar.GetTimeByValue(Task.Left) ;
      //开始时间+需要时间天数(小时数必须转换为天数)
    // Task.EndTime:= TaskChart.lstTimeBar.GetTimeByValue(Task.Left+ Task.Width);
     Task.EndTime:= Task.BeginTime + Task.Value / 24;
     Task.Hint:= DateTimeToStr(Task.BeginTime)+' ~ '+ DateTimeToStr(Task.EndTime);
     Task.ShowHint:= true;
     //记录原始数据
     Task.OldMachineName:= Task.MachineName;
     Task.OldBeginTime  := Task.BeginTime;
     Task.OldEndTime    := Task.EndTime;
  //   self.RefreshTask(pMachine,nil);
     //按当前倍数显示, 在放大比例幽数中检测能否显示,并调整显示比例
     self.TaskAutoSize(TaskChart.iIncreaseVal);
end;
//------------------------------------------------------------------------------
//生成任务对象
procedure TlstMachine.NewTask(machineNme:string;pMother:Pointer);
var pTemp:TTask;
begin             //新机器名称
   iTaskNo:= iTaskNo+1;
   pTemp:= TTask.Create(nil);


   with pTemp do
   begin
 
       Left := 100;
       BeginTime:=  StrToDateTime('2004-12-31 00:00:00');
      //  Value:= 35;
        EndTime:= BeginTime+ 35;
       //zhr(Temp)
       Width:= Round(Value*(TaskChart.iSpaceVal/4)*TaskChart.iIncreaseVal);
       Height := 25 ;
   //    Name:= 'task'+ machineNme+IntToStr(iTaskNo) ;
      Caption := machineNme+IntToStr(iTaskNo) ;
   //    parent:= pMother;
    //   popupMenu:= TaskChart.ppmTask;
   //    OnMouseDown:= TaskMouseDown;
   //    OnMouseMove:= TaskMouseMove;
  //     OnMouseUp:= TaskMouseUp;
   end;

   AddTask(pTemp,machineNme);
end;
//------------------------------------------------------------------------------
     //按任务名称返回任务指针
function TlstMachine.FindTaskByName(TaskName: string):TTask;
var  pTemp: TTask;
    i: Integer;
begin
   for   i:=0 to self.Count-1  do
   begin
      pTemp:= TMachine(self.Items[i]).FindTakByName(TaskName);
      if pTemp<>nil then
         break;
   end;
   Result:= pTemp;
end;
//------------------------------------------------------------------------------
     //按机器名称返回机器指针
function TlstMachine.FindMachine(MachineName:string):TMachine;
var pTemp:TMachine;
    i:Integer;
begin
    pTemp:= nil;
    //按名称查找机器
    for i := 0 to self.Count-1 do
    begin
        pTemp:=TMachine(self.Items[i]);
        if (trim(pTemp.Name)= trim(MachineName)) then
            break
        else
            pTemp:= nil;
    end;
    Result:= pTemp;
end;
//------------------------------------------------------------------------------
procedure TlstMachine.DeleteMachine(machineNme:string);
var pTemp:TMachine;
    i:Integer;
begin
    //按名称查找机器
    pTemp:= self.FindMachine(machineNme);
    if (pTemp=nil) then
       exit;
    self.Remove(pTemp);
    //先清空该机器上的所有任务
    for  i:=1  to pTemp.ControlCount do
    begin
        pTemp.Controls[0].Free;
    end;
    //删除显示该机器名称的控件
    pTemp.NameControl.Free;
    pTemp.Free;
end;
//------------------------------------------------------------------------------
//设置主任务与被合并任务的颜色
procedure TlstMachine.SetMergeTaskColor(Task: TTask);
begin
     //如果主任务为空
     if (TaskChart.tempMainTask = nil)    then
     begin
        //如果该任务为原来将被合并任务, 先恢复其底, 再将选中被合并任务设置空值
        if (TaskChart.tempSecondTask = Task)   then
        begin
             TaskChart.tempSecondTask.Color:= TaskChart.tempSecondTask.OldColor;
             TaskChart.tempSecondTask:= nil;
        end;
        TaskChart.tempMainTask:= Task;
        TaskChart.tempMainTask.OldColor:= TaskChart.tempMainTask.Color;
        TaskChart.tempMainTask.Color:= clWhite;
     end   //如果选中任务已为主任务 (主任务不为空)
     else if (TaskChart.tempMainTask = Task) then
     begin
        TaskChart.tempMainTask.Color:= TaskChart.tempMainTask.OldColor;
        TaskChart.tempMainTask:= nil;
     end
     else    //主任务不为空也不为当前选中任务
     begin   //如果被合并任务为空,直接记录任务并记录原来底,改变底色
         if TaskChart.tempSecondTask=nil then
         begin
            TaskChart.tempSecondTask:= Task;
            TaskChart.tempSecondTask.OldColor:= TaskChart.tempSecondTask.Color;
            TaskChart.tempSecondTask.Color:= clBtnFace;//$00DFDFDF;//clGray;
         end
         else
         begin //如果原来已有被合并任务且为当前选中任务, 则取消选中并恢复被合并并任务底色
             if TaskChart.tempSecondTask = Task then
             begin
                 TaskChart.tempSecondTask.Color:= TaskChart.tempSecondTask.OldColor;
                 TaskChart.tempSecondTask:= nil;
             end
             else  //否则取消原来被选中任务,记录当前新选中被合并任务
             begin
                 TaskChart.tempSecondTask.Color:= TaskChart.tempSecondTask.OldColor;
                 TaskChart.tempSecondTask:= Task;
                 TaskChart.tempSecondTask.OldColor:= TaskChart.tempSecondTask.Color;
                 TaskChart.tempSecondTask.Color:= clBtnFace;//$00DFDFDF;//clGray;
             end
         end
     end;
     //合并菜单, 将有合并项菜单并入到新菜单中
     TaskChart.MergeMenuItem(Task);

end;
//------------------------------------------------------------------------------
//任务的MouseDown事件
procedure TlstMachine.TaskMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
begin
       //记

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -