📄 utaskchart.pas
字号:
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 + -