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