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

📄 utaskchart.pas

📁 DELPHI 一个可以实现排期的控件 显示排期
💻 PAS
📖 第 1 页 / 共 5 页
字号:

    published

    public
        property DateTime :TDateTime read  ptyDateTime write ptyDateTime;
end;

//机器链
{_______________________________________________________________________________}

 TlstMachine = class(TList)

  private
     //所在容器
     ptyParent: TControl;
    { Private declarations }
    //任务编号  ,机器编号 ,点任务时的鼠标X坐标,Y坐标  ,拖动距离(Y坐标)
     iTaskNo, iMachine, iDownX, iDownY, iMoveVal:Integer;
     //鼠标键按下标志 , 按下后拖动标志
     bDownFlag, bDragFlag:bool;
     //任务所在机器指针,切工作任务拖动前所在机器指针
     pCurMachine, pOldMachine: TMachine;
     //当前任务(选中或拖动中)
     pCurTask:TTask;



     //新添机器名称
     procedure NewMachineName(pMother: TMachine; machineNme: string);
     //在MouseDown事件中设置选中主任务与被合并任务的颜色
     procedure  SetMergeTaskColor(Task: TTask);
     //任务的MouseDowa事件
     procedure TaskMouseDown(Sender: TObject; Button: TMouseButton;
               Shift: TShiftState; X, Y: Integer);
     //任务的MouseMove事件
     procedure TaskMouseMove(Sender: TObject; Shift: TShiftState; X,
              Y: Integer);
     //任务的MouseUp事件
     procedure TaskMouseUp(Sender: TObject; Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
     //拖动后的任务定位
     procedure TaskLocator(Task:TTask);
     //拖动后在新的机器上排序
     procedure RefreshTask(pMachine:TMachine;Task:TTask);

     //删除机器
     procedure DeleteMachine(machineNme:string);
     //按任务名称返回任务指针
     function FindTaskByName(TaskName: string):TTask;
     //按机器名称返回机器指针
    function FindMachine(MachineName:string):TMachine;
    //按机器名称获取最早一个任务
    function GetFirstTaskByMachine(MachineName:String):TTask;
    //按机器名称获取最后一个任务(按时间排)
    function GetLastTaskByMachine(MachineName:String):TTask;
 

  published
     //所在容器
     property Parent: TControl read ptyParent write ptyParent;


  public


     //新添机器(外部接口)
   //  procedure AddMachine(machineName:string;ppMenu:TPopupMenu);
     //新添机器 (生成机器对象)
     procedure NewMachine(machineNme:string;ppMenu:TPopupMenu);
     //将机器对象加入到指针对象中
     procedure AddMachine(Machine:TMachine);


     //新添任务(生成任务对象)
     procedure NewTask(machineNme:string;pMother:Pointer);
     //将一个任务对象加入到机器中
     procedure AddTask(Task:TTask;MachineName:String);       
     //自动按时间刻度比例调整大小
     procedure TaskAutoSize(iIncease:Integer);
     //释放机器指针所指所有对象
     procedure ClearPointerList();
 end;


{_______________________________________________________________________________}
   TlstTask = class
       private
           TaskList: TList;

           function   GetTask(Value: Integer):TTask;
           procedure  Add(Item: Pointer);
           procedure  Clear();
           function   getCount(): Integer;
       protected

       public
             Constructor Create ;  //  override;
             destructor  Destroy;   //  override;

             property Items[Index: Integer]: TTask read GetTask;
       published
             
             property Count : Integer read getCount;
   end;



{_TTaskChart______________________________________________________________________________}
    //test半分钟触发一次的事件
 // TTimeEvent= procedure(Sender: TObject; TheTime: TDateTime) of object;
 // 合并任务动作类型
  TMergeAction = (mtaMerge, mtaNone);
 //拖动任务动作类型
  TChangeMachineAction = (cmChange, cmNone);
  //任务合并前的事件
  TBeforeMergeTaskEvent = procedure(Sender: TObject;  MainTask: TTask ;Task :TTask ; var  Action : TMergeAction ) of object;
  //任务合并后的事件
  TAfterMergeTaskEvent = procedure(Sender: TObject;  MainTask: TTask ;SecondTask :TTask  ) of object;
  //拖动任务前的事件
  TBeforeChangeMachineEvent = procedure(Sender: TObject; Machine: TMachine; Task: TTask; var Action : TChangeMachineAction) of Object;
  //拖动任务后的事件
  TAfterChangeMachineEvent = procedure(Sender: TObject; Machine: TMachine; Task: TTask) of Object;


  TTaskChart = class(TFrame)
    pnlTarget: TPanel;
    pnlEndLine: TPanel;
    pnlStartLine: TPanel;
    pmTask: TPopupMenu;
    NMergeTask: TMenuItem;
    ScrollBox1: TScrollBox;
    pnlTimeBar: TPanel;
    ScrollBox2: TScrollBox;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    cmbZoom: TComboBox;
    dtpStart: TDateTimePicker;
    dtpEnd: TDateTimePicker;
    ScrollBox3: TScrollBox;
    sbMother: TScrollBox;
    pnlAutoSize: TPanel;
    sbMachineMother: TScrollBox;
    sbMachineName: TScrollBox;
    sbTest: TScrollBox;
    Splitter1: TSplitter;



    procedure dtpStartCloseUp(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure sbMotherCanResize(Sender: TObject; var NewWidth,
       NewHeight: Integer; var Resize: Boolean);
    procedure DateTimePicker1CloseUp(Sender: TObject);
    procedure NMergeTaskClick(Sender: TObject);
    procedure cmbZoomClick(Sender: TObject);
    procedure sbMachineNameResize(Sender: TObject);
    procedure Splitter1Moved(Sender: TObject);



  private
  //test半分钟触发一次的事件
   //   FTimer: TTimer;
  //    FOnHalfminute: TTimeEvent;
 //     FOldSecond, FSecond: Word;
       //合并任务之前事件
      FOnBeforeMergeTask : TBeforeMergeTaskEvent;
       //合并任务之后事件
      FOnAfterMergeTask  : TAfterMergeTaskEvent;
      //拖动任务前的事件
      FOnBeforeChangeMachine : TBeforeChangeMachineEvent;
      //拖动任务后的事件
      FOnAfterChangeMachine  : TAfterChangeMachineEvent ;
      //机器
      lstMachine: TlstMachine;
      //时间
      lstTimeBar: TlstTimeBar;
      //已删除的任务
      lstDeleteTask:  TlstTask;
      //新添加任务
      lstAddTask:     TlstTask;
      //已修改的任务
      lstUpdateTask:  TlstTask;

 
      //事件测试
      //机器高度 ,任务高度      , 垂直滚动条位置(用于判断是否拖动了垂直滚动条)
      MachineHeight, TaskHeight, iVerPosition, iHorPosition: Integer;
      //合并任务两指针
      tempMainTask, tempSecondTask: TTask;



      //起始位置 放大倍数(缺省为1,8的倍数) , 两刻度的间距(缺省为8点)
     iStartLeft, iIncreaseVal, iSpaceVal:Integer;
  //test半分钟触发一次的事件
 //     procedure FTimerTimer(Sender: TObject);
 //     procedure DoHalfMinute(TheTime: TDateTime); dynamic;


     //合并任务右键弹出菜单项
      procedure MergeMenuItem(Task: TTask);
      //读开始日期
      function GetBeginDate():TDateTime;
      //写开始日期
      procedure SetBeginDate(startDate: TDateTime);
      //读开始日期
      function GetEndDate():TDateTime;
      //写开始日期
      procedure SetEndDate(EndDate: TDateTime);
      //获取机器数组的一台机器
      function GetMachine(Index: Integer):TMachine;
      //机器数量
      function GetMachineCount():Integer;
      //合并任务
      procedure MergeTask(MainTask: TTask; SecondTask: TTask);
      //返回当前时间在时间条上所对应的位置
      function getPositionByCutTime:Integer;
     //------------------------------------------------------
      //组件编辑器
   //   procedure ExecuVerb(Index: Integer); override;

    property cursor;
    //当前时间在时间条上所对应的位置
    property  NowPosition: Integer read  getPositionByCutTime;

  protected
     //合并任务之前事件
     procedure DoOnBeforeMergeTask(Sender: TObject;  MainTask: TTask ;Task :TTask ; var Action : TMergeAction );dynamic;
     //合并任务之后事件
     procedure DoOnAfterMergeTask(Sender: TObject;  MainTask: TTask ;Task :TTask  );dynamic;
     //拖动任务前的事件
     procedure DoOnBeforeChangeMachine(Sender: TObject; Machine: TMachine; Task: TTask; var Action : TChangeMachineAction); dynamic;
     //拖动任务后的事件
     procedure DoOnAfterChangeMachine(Sender: TObject; Machine: TMachine; Task: TTask ); dynamic;



  public


     //显示时间刻度
     procedure ShowDateScale();
     //添加机器
     procedure AddMachine(newMachine:TMachine );
     //添加任务
     procedure AddTask(newTask:TTask; MachineName: string);
     //删除机器
     procedure DeleteMachine(MachineName: string);
     //删除任务
     procedure DeleteTask(TaskName: string);
     //按任务名称返回任务指针
     function FindTaskByName(TaskName: string): TTask;
     //按机器名称返回机器指针
     function FindMachineByName(MachineName:string):TMachine;
     //刷新指定机器上的任务位置
     procedure RefreshMachine(Machine: TMachine);
    //获取新添加任务集
     function GetNewTask():TlstTask;
     //获取已修改的任务集
     function GetUpdateTask():TlstTask;
     //获取已删除的任务集
     function GetDeleteTask():TlstTask;

     //覆盖构造函数
    constructor Create(AOwner: TComponent); override ;
    //析构函数
    destructor  Destroy;  override;


     //必须放在public 下
     property Items[Index: Integer]: TMachine read GetMachine;
     //删除所有已保存的任务, 更新所有任务状态为无
     procedure PostAll();
  published

    //开始时间
     property BeginDate: TDateTime  read GetBeginDate write SetBeginDate;
     //结束时间
     property EndDate: TDateTime  read GetEndDate write SetEndDate;
     //机器数量
     property Count: Integer read GetMachineCount;

     //test半分钟触发一次的事件
   //  property OnHalfMinute: TTimeEvent read FOnHalfMinute write FOnHalfMinute;
     //合并任务之前事件
     property  OnBeforeMergeTask : TBeforeMergeTaskEvent read FOnBeforeMergeTask  write FOnBeforeMergeTask;
     //合并任务之后事件
     property  OnAfterMergeTask  : TAfterMergeTaskEvent  read FOnAfterMergeTask   write FOnAfterMergeTask;
     //拖动任务前的事件
     property  OnBeforeChangeMachine : TBeforeChangeMachineEvent  read FOnBeforeChangeMachine write  FOnBeforeChangeMachine;
     //拖动任务后的事件
     property  OnAfterChangeMachine  : TAfterChangeMachineEvent   read FOnAfterChangeMachine  write FOnAfterChangeMachine ;


  end;



 var TaskChart:  TTaskChart;
 
procedure Register;
 
implementation
//==============================================================================

     //合并任务右键弹出菜单项
procedure TTaskChart.MergeMenuItem(Task: TTask);
var iCount, i: Integer;
    miTemp: TMenuItem;
begin
    if Task.PopupMenu<>nil then
    begin
        iCount:= self.pmTask.Items.Count;
        for  i:=0  to iCount-1 do
        begin
             miTemp:= self.pmTask.Items.Items[0];
             self.pmTask.Items.Delete(0);
             Task.PopupMenu.Items.Insert(0,miTemp);
        end;
    end
    else
       Task.PopupMenu:= self.pmTask;

end;
//------------------------------------------------------------------------------
      //返回机器数量
function TTaskChart.GetMachineCount():Integer;
begin
    Result:= lstMachine.Count;
end;
//------------------------------------------------------------------------------
      //返回机器数组的一台机器
function TTaskChart.GetMachine(Index: Integer):TMachine;
var  pTemp: TMachine;
     iIndex: Integer;
begin
     iIndex:= lstMachine.Count;
     if (Index<0) or (Index>=iIndex) then
     begin
         Application.MessageBox('参数错误,函数调用失败!       ','系统',MB_OK+MB_ICONERROR);
         Result:= nil;
         exit;
     end;
     Result:= TMachine(lstMachine.Items[Index]);
end;
//------------------------------------------------------------------------------
    //获取新添加任务集
function TTaskChart.GetNewTask():TlstTask;
var iMCount, iTCount, i, j: Integer;
    pMTemp: TMachine;
    pTTemp: TTask;
begin
    //清空原有新添机器队列
    lstAddTask.Clear;
    //所有机器数量
    iMCount:= self.Count;
    //检测每台机器上的任务数据状态为新添的任务(dsAdd)
    for i :=0  to self.Count - 1 do
    begin
        pMTemp:= self.Items[i];
        for j :=0  to pMTemp.Count - 1  do
        begin
            if pMTemp.Items[j].DataStatus = dsAdd then
            begin
               //将数据状态必改为没变化状态
        //       pMTemp.Items[j].DataStatus:= dsNone;
               self.lstAddTask.Add(pMTemp.Items[j]);
            end;
        end;
    end;

    Result:= lstAddTask 

end;
//------------------------------------------------------------------------------
     //获取已修改的任务集
function TTaskChart.GetUpdateTask():TlstTask;
var iMCount, iTCount, i, j: Integer;
    pMTemp: TMachine;
    pTTemp: TTask;
begin
    //清空原有修改机器队列
    lstUpdateTask.Clear;
    //所有机器数量
    iMCount:= self.Count;
    //检测每台机器上的任务数据状态为修改的任务(dsUpdate)
    for i :=0  to self.Count - 1 do
    begin

⌨️ 快捷键说明

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