16,748
社区成员
发帖
与我相关
我的任务
分享
//定义部分
//SStrips声明
type SStrip = record
JobType : Integer;
UpDst, DnDst : Double;
MchnID : Integer;
BlksVol : SVolAndSpls;
end;
type TStrips = Array of SStrip;
//SAltern声明
type SAltern = record
BlkObjID : Integer;
MchnGrpID : Integer;
Strips : TStrips;
Tried : ShortInt;
MachEquiped : Boolean;
ValidNow : Boolean;
Wght : Double;
end;
TAlterns = array of SAltern;
//SMatch的声明
type SMatch = record
SN : Integer;
Altns : TAlterns;
AltnsStr : TLongUnicodeString;
SaveTime : TDateTime;
Modified : Boolean;
ObjID, SvdSN : Integer;
end;
PSMatch = ^SMatch;
//相关执行部分
function EquipMchn4Prep(AMtchIdx : Integer; ACurTime : TDateTime) : Integer;
var
ArrCnt, ArrIdx, AvailCnt : Integer;
MchnCnt, MchnIdx : Integer;
IdxArr : TArrInt;
AItem : PSCable;
AMtch : PSMatch;
begin
Result := -1;
AMtch := PrepMtchs.Items[AMtchIdx]; //Items和SavedItems是TList类型,保存着指针.
ArrCnt := Length(AMtch^.Altns); AvailCnt := 0;
for ArrIdx := 0 to ArrCnt - 1 do
if (AMtch^.Altns[ArrIdx].Tried = 0) then
begin
AMtch^.Altns[ArrIdx].MachEquiped := False;
if AMtch^.Altns[ArrIdx].ValidNow then
begin
MchnCnt := CblCrns.Items.Count;
for MchnIdx := 0 to MchnCnt - 1 do
begin
AItem := CblCrns.Items[MchnIdx];
if AItem^.Active
and (not AItem^.B_Using)
and (CblCrns.CanActInBrk(AItem.BrkInfo, 0))
then begin
SetLength(AMtch^.Altns[ArrIdx].Strips, 1);
//FastMM报上面这句造成了内存漏洞(A memory block has been leaked. The size is: 436)
AMtch^.Altns[ArrIdx].Strips[0].MchnID := AItem^.ObjID;
AMtch^.Altns[ArrIdx].MachEquiped := True;
AvailCnt := AvailCnt + 1;
Break;
end;
end;
end;
end;
Result := AvailCnt;
SetLength(IdxArr, 0);
end;
//内存释放部分
procedure CPrepMatches.FreeCmplxVar(ItmIdx : Integer; ItmOrBak : Boolean = True); //复杂对象的内存释放
var
AMtch : PSMatch;
Idx : Integer;
begin
if ItmOrBak then AMtch := Items[ItmIdx]
else AMtch := SavedItems[ItmIdx];
for Idx := 0 to High(AMtch^.Altns) do
SetLength(AMtch^.Altns[Idx].Strips, 0);
SetLength(AMtch^.Altns, 0);
end;