ProjGather.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. unit ProjGather;
  2. interface
  3. uses
  4. Classes, ProjGatherTree, GatherProjInfo, ProjectData, BillsTree, CalcData,
  5. PhaseData;
  6. type
  7. TProjGather = class;
  8. TWriteGatherData = procedure (AGather: TProjGather) of Object;
  9. TProjGather = class
  10. private
  11. FWriter: TWriteGatherData;
  12. FXmjCompare: Integer;
  13. FGclCompare: Integer;
  14. FTree: TProjGatherTree;
  15. FProjs: TList;
  16. FCommonProjs: TList;
  17. FSpecialProjs: TList;
  18. FSpecialProjTypes: TStrings;
  19. FProjectData: TProjectData;
  20. function FindBillsNode(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  21. function CreateBillsNode(ANode: TBillsIDTreeNode; AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  22. procedure AddProjCalcData(AProjCalc: TProjCalc; ANode: TMeasureBillsIDTreeNode);
  23. function GatherBillsNode(ANode: TMeasureBillsIDTreeNode; AParent: TProjGatherTreeNode;
  24. AProjIndex: Integer): TProjGatherTreeNode;
  25. procedure GatherBills(ANode: TMeasureBillsIDTreeNode; AParent: TProjGatherTreeNode; AProjIndex: Integer);
  26. function GatherSpecialBillsNode(ANode: TMeasureBillsIDTreeNode;
  27. AParent: TProjGatherTreeNode; AProjType: Integer): TProjGatherTreeNode;
  28. procedure GatherSpecialBills(ANode: TMeasureBillsIDTreeNode;
  29. AParent: TProjGatherTreeNode; AProjType: Integer);
  30. procedure GatherSpecialProj(AProj: TGatherProjInfo);
  31. procedure FilterProjs;
  32. protected
  33. procedure OpenProjectData(AProj: TGatherProjInfo); virtual;
  34. procedure FreeProjectData; virtual;
  35. procedure GatherProj(AProj: TGatherProjInfo; AProjIndex: Integer);
  36. procedure AddProjMeasureCalcData(AProjCalc: TProjCalc; ANode: TMeasureBillsIDTreeNode); virtual;
  37. public
  38. constructor Create(AWriter: TWriteGatherData; AXmjCompare, AGclCompare: Integer);
  39. destructor Destroy; override;
  40. procedure Gather(AProjs: TList; ASpecialProjTypes: TStrings);
  41. property ProjectData: TProjectData read FProjectData;
  42. property Tree: TProjGatherTree read FTree;
  43. property Projs: TList read FProjs;
  44. property CommonProj: TList read FCommonProjs;
  45. property SpecialProj: TList read FSpecialProjs;
  46. property SpecialProjTypes: TStrings read FSpecialProjTypes;
  47. end;
  48. TZoneProjGather = class(TProjGather)
  49. private
  50. FBeginPhaseIndex: Integer;
  51. FEndPhaseIndex: Integer;
  52. FBeginPhaseData: TPhaseData;
  53. FEndPhaseData: TPhaseData;
  54. protected
  55. procedure OpenProjectData(AProj: TGatherProjInfo); override;
  56. procedure FreeProjectData; override;
  57. procedure AddProjMeasureCalcData(AProjCalc: TProjCalc; ANode: TMeasureBillsIDTreeNode); override;
  58. public
  59. procedure Gather(AProjs: TList; ABeginPhaseIndex, AEndPhaseIndex: Integer); overload;
  60. end;
  61. implementation
  62. uses
  63. Globals, UtilMethods, sdIDTree, sdDB, mDataRecord, BillsMeasureDm, SysUtils,
  64. Math;
  65. { TProjGather }
  66. procedure TProjGather.AddProjCalcData(AProjCalc: TProjCalc;
  67. ANode: TMeasureBillsIDTreeNode);
  68. begin
  69. AProjCalc.Compile.Org.AddQuantity(ANode.Rec.OrgQuantity.AsFloat);
  70. AProjCalc.Compile.Org.AddTotalPrice(ANode.Rec.OrgTotalPrice.AsFloat);
  71. AProjCalc.Compile.Mis.AddQuantity(ANode.Rec.MisQuantity.AsFloat);
  72. AProjCalc.Compile.Mis.AddTotalPrice(ANode.Rec.MisTotalPrice.AsFloat);
  73. AProjCalc.Compile.Oth.AddQuantity(ANode.Rec.OthQuantity.AsFloat);
  74. AProjCalc.Compile.Oth.AddTotalPrice(ANode.Rec.OthTotalPrice.AsFloat);
  75. AProjCalc.Compile.SubTotal.AddQuantity(ANode.Rec.Quantity.AsFloat);
  76. AProjCalc.Compile.SubTotal.AddTotalPrice(ANode.Rec.TotalPrice.AsFloat);
  77. AProjCalc.AddMeasure.Deal.AddQuantity(ANode.Rec.AddDealQuantity.AsFloat);
  78. AProjCalc.AddMeasure.Deal.AddTotalPrice(ANode.Rec.AddDealTotalPrice.AsFloat);
  79. AProjCalc.AddMeasure.Qc.AddQuantity(ANode.Rec.AddQcQuantity.AsFloat);
  80. AProjCalc.AddMeasure.Qc.AddTotalPrice(ANode.Rec.AddQcTotalPrice.AsFloat);
  81. AProjCalc.AddMeasure.Gather.AddQuantity(ANode.Rec.AddGatherQuantity.AsFloat);
  82. AProjCalc.AddMeasure.Gather.AddTotalPrice(ANode.Rec.AddGatherTotalPrice.AsFloat);
  83. AProjCalc.DgnQuantity1 := AProjCalc.DgnQuantity1 + ANode.Rec.DgnQuantity1.AsFloat;
  84. AProjCalc.DgnQuantity2 := AProjCalc.DgnQuantity2 + ANode.Rec.DgnQuantity2.AsFloat;
  85. AProjCalc.DealDgnQuantity1 := AProjCalc.DealDgnQuantity1 + ANode.Rec.DealDgnQuantity1.AsFloat;
  86. AProjCalc.DealDgnQuantity2 := AProjCalc.DealDgnQuantity2 + ANode.Rec.DealDgnQuantity2.AsFloat;
  87. AProjCalc.CDgnQuantity1 := AProjCalc.CDgnQuantity1 + ANode.Rec.CDgnQuantity1.AsFloat;
  88. AProjCalc.CDgnQuantity2 := AProjCalc.CDgnQuantity2 + ANode.Rec.CDgnQuantity2.AsFloat;
  89. AddProjMeasureCalcData(AProjCalc, ANode);
  90. end;
  91. constructor TProjGather.Create(AWriter: TWriteGatherData;
  92. AXmjCompare, AGclCompare: Integer);
  93. begin
  94. FWriter := AWriter;
  95. FXmjCompare := AXmjCompare;
  96. FGclCompare := AGclCompare;
  97. FCommonProjs := TList.Create;
  98. FSpecialProjs := TList.Create;
  99. end;
  100. function TProjGather.CreateBillsNode(ANode: TBillsIDTreeNode;
  101. AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  102. function GetB_CodeChapter(const AB_Code: string): Integer;
  103. var
  104. iValue, iError: Integer;
  105. begin
  106. Result := -1;
  107. Val(AB_Code, iValue, iError);
  108. if iValue > 0 then
  109. Result := iValue div 100;
  110. end;
  111. var
  112. vNextSibling: TProjGatherTreeNode;
  113. begin
  114. vNextSibling := FTree.FindNextSibling(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString);
  115. if ANode.ID < 100 then
  116. Result := FTree.AddNode(AParent, vNextSibling, ANode.ID)
  117. else
  118. Result := FTree.AddNode(AParent, vNextSibling);
  119. Result.Code := ANode.Rec.Code.AsString;
  120. Result.B_Code := ANode.Rec.B_Code.AsString;
  121. Result.Name := ANode.Rec.Name.AsString;
  122. Result.Units := ANode.Rec.Units.AsString;
  123. Result.Price := ANode.Rec.Price.AsFloat;
  124. Result.XiangCode := ANode.Rec.XiangCode.AsString;
  125. Result.MuCode := ANode.Rec.MuCode.AsString;
  126. Result.JieCode := ANode.Rec.JieCode.AsString;
  127. Result.XiMuCode := ANode.Rec.XimuCode.AsString;
  128. Result.IndexCode := ANode.Rec.IndexCode.AsString;
  129. Result.B_CodeChapter := GetB_CodeChapter(Result.B_Code);
  130. end;
  131. destructor TProjGather.Destroy;
  132. begin
  133. FCommonProjs.Free;
  134. FSpecialProjs.Free;
  135. inherited;
  136. end;
  137. procedure TProjGather.FilterProjs;
  138. var
  139. i: Integer;
  140. vProjInfo: TGatherProjInfo;
  141. begin
  142. FCommonProjs.Clear;
  143. FSpecialProjs.Clear;
  144. for i := 0 to FProjs.Count - 1 do
  145. begin
  146. vProjInfo := TGatherProjInfo(FProjs.Items[i]);
  147. if vProjInfo.ProjType = 0 then
  148. FCommonProjs.Add(vProjInfo)
  149. else
  150. FSpecialProjs.Add(vProjInfo);
  151. end;
  152. end;
  153. function TProjGather.FindBillsNode(ANode: TBillsIDTreeNode;
  154. AParent: TProjGatherTreeNode): TProjGatherTreeNode;
  155. var
  156. iCompareType: Integer;
  157. begin
  158. if ANode.ID > 100 then
  159. begin
  160. if ANode.Rec.B_Code.AsString <> '' then
  161. iCompareType := FGclCompare
  162. else
  163. iCompareType := FXmjCompare;
  164. case iCompareType of
  165. // °´±àºÅ
  166. 0: if (ANode.Rec.Code.AsString <> '') or (ANode.Rec.B_Code.asString <> '') then
  167. Result := FTree.FindNode(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Price.AsFloat)
  168. else
  169. Result := FTree.FindNode(AParent, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  170. // °´Ãû³Æ
  171. 1: Result := FTree.FindNode(AParent, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  172. // °´±àºÅ+Ãû³Æ
  173. 2: Result := FTree.FindNode(AParent, ANode.Rec.Code.AsString, ANode.Rec.B_Code.AsString, ANode.Rec.Name.AsString, ANode.Rec.Price.AsFloat);
  174. end;
  175. end
  176. else
  177. Result := FTree.FindNode(ANode.ID);
  178. end;
  179. procedure TProjGather.FreeProjectData;
  180. begin
  181. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  182. FProjectData.Free;
  183. end;
  184. procedure TProjGather.Gather(AProjs: TList; ASpecialProjTypes: TStrings);
  185. var
  186. i: Integer;
  187. begin
  188. FProjs := AProjs;
  189. FilterProjs;
  190. FSpecialProjTypes := ASpecialProjTypes;
  191. if Assigned(ASpecialProjTypes) then
  192. FTree := TProjGatherTree.Create(FCommonProjs.Count, ASpecialProjTypes.Count)
  193. else
  194. FTree := TProjGatherTree.Create(FCommonProjs.Count, 0);
  195. FTree.NewNodeID := 101;
  196. try
  197. for i := 0 to FCommonProjs.Count - 1 do
  198. GatherProj(TGatherProjInfo(FCommonProjs.Items[i]), i);
  199. for i := 0 to FSpecialProjs.Count - 1 do
  200. GatherSpecialProj(TGatherProjInfo(FSpecialProjs.Items[i]));
  201. FTree.CalculateAll;
  202. if Assigned(FWriter) then
  203. FWriter(Self);
  204. finally
  205. FTree.Free;
  206. end;
  207. end;
  208. procedure TProjGather.GatherBills(ANode: TMeasureBillsIDTreeNode;
  209. AParent: TProjGatherTreeNode; AProjIndex: Integer);
  210. var
  211. vCur: TProjGatherTreeNode;
  212. begin
  213. if not Assigned(ANode) then Exit;
  214. vCur := GatherBillsNode(ANode, AParent, AProjIndex);
  215. GatherBills(TMeasureBillsIDTreeNode(ANode.FirstChild), vCur, AProjIndex);
  216. GatherBills(TMeasureBillsIDTreeNode(ANode.NextSibling), AParent, AProjIndex );
  217. end;
  218. function TProjGather.GatherBillsNode(ANode: TMeasureBillsIDTreeNode;
  219. AParent: TProjGatherTreeNode; AProjIndex: Integer): TProjGatherTreeNode;
  220. begin
  221. Result := FindBillsNode(ANode, AParent);
  222. if not Assigned(Result) then
  223. Result := CreateBillsNode(ANode, AParent);
  224. AddProjCalcData(Result.GatherCalc, ANode);
  225. AddProjCalcData(Result.Proj[AProjIndex], ANode);
  226. end;
  227. procedure TProjGather.GatherProj(AProj: TGatherProjInfo; AProjIndex: Integer);
  228. begin
  229. OpenProjectData(AProj);
  230. try
  231. with FProjectData.BillsMeasureData do
  232. GatherBills(TMeasureBillsIDTreeNode(BillsMeasureTree.FirstNode), nil, AProjIndex);
  233. finally
  234. FreeProjectData;
  235. end;
  236. end;
  237. procedure TProjGather.GatherSpecialProj(AProj: TGatherProjInfo);
  238. begin
  239. if (AProj.ProjType > 0) and (AProj.ProjType <= FSpecialProjTypes.Count) then
  240. begin
  241. OpenProjectData(AProj);
  242. try
  243. with FProjectData.BillsMeasureData do
  244. GatherSpecialBills(TMeasureBillsIDTreeNode(BillsMeasureTree.FirstNode), nil, AProj.ProjType);
  245. finally
  246. FreeProjectData;
  247. end;
  248. end;
  249. end;
  250. procedure TProjGather.GatherSpecialBills(ANode: TMeasureBillsIDTreeNode;
  251. AParent: TProjGatherTreeNode; AProjType: Integer);
  252. var
  253. vCur: TProjGatherTreeNode;
  254. begin
  255. if not Assigned(ANode) then Exit;
  256. vCur := GatherSpecialBillsNode(ANode, AParent, AProjType);
  257. GatherSpecialBills(TMeasureBillsIDTreeNode(ANode.FirstChild), vCur, AProjType);
  258. GatherSpecialBills(TMeasureBillsIDTreeNode(ANode.NextSibling), AParent, AProjType );
  259. end;
  260. procedure TProjGather.OpenProjectData(AProj: TGatherProjInfo);
  261. begin
  262. FProjectData := OpenProjectManager.FindProjectData(AProj.ProjectID);
  263. if not Assigned(FProjectData) then
  264. begin
  265. FProjectData := TProjectData.Create;
  266. FProjectData.OpenForReport3(GetMyProjectsFilePath + AProj.FileName);
  267. end;
  268. end;
  269. function TProjGather.GatherSpecialBillsNode(
  270. ANode: TMeasureBillsIDTreeNode; AParent: TProjGatherTreeNode;
  271. AProjType: Integer): TProjGatherTreeNode;
  272. begin
  273. Result := FindBillsNode(ANode, AParent);
  274. if not Assigned(Result) then
  275. Result := CreateBillsNode(ANode, AParent);
  276. AddProjCalcData(Result.SpecialProj[AProjType - 1], ANode);
  277. end;
  278. procedure TProjGather.AddProjMeasureCalcData(AProjCalc: TProjCalc;
  279. ANode: TMeasureBillsIDTreeNode);
  280. var
  281. StageRec: TStageRecord;
  282. begin
  283. StageRec := ANode.StageRec;
  284. if Assigned(StageRec) then
  285. begin
  286. AProjCalc.CurMeasure.Deal.AddQuantity(StageRec.DealQuantity.AsFloat);
  287. AProjCalc.CurMeasure.Deal.AddTotalPrice(StageRec.DealTotalPrice.AsFloat);
  288. AProjCalc.CurMeasure.Qc.AddQuantity(StageRec.QcQuantity.AsFloat);
  289. AProjCalc.CurMeasure.Qc.AddTotalPrice(StageRec.QcTotalPrice.AsFloat);
  290. AProjCalc.CurMeasure.Gather.AddQuantity(StageRec.GatherQuantity.AsFloat);
  291. AProjCalc.CurMeasure.Gather.AddTotalPrice(StageRec.GatherTotalPrice.AsFloat);
  292. AProjCalc.PreMeasure.Deal.AddQuantity(StageRec.PreDealQuantity.AsFloat);
  293. AProjCalc.PreMeasure.Deal.AddTotalPrice(StageRec.PreDealTotalPrice.AsFloat);
  294. AProjCalc.PreMeasure.Qc.AddQuantity(StageRec.PreQcQuantity.AsFloat);
  295. AProjCalc.PreMeasure.Qc.AddTotalPrice(StageRec.PreQcTotalPrice.AsFloat);
  296. AProjCalc.PreMeasure.Gather.AddQuantity(StageRec.PreGatherQuantity.AsFloat);
  297. AProjCalc.PreMeasure.Gather.AddTotalPrice(StageRec.PreGatherTotalPrice.AsFloat);
  298. AProjCalc.EndMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  299. AProjCalc.EndMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  300. AProjCalc.EndMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  301. AProjCalc.EndMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  302. AProjCalc.EndMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  303. AProjCalc.EndMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  304. end;
  305. end;
  306. { TZoneProjGather }
  307. procedure TZoneProjGather.AddProjMeasureCalcData(AProjCalc: TProjCalc;
  308. ANode: TMeasureBillsIDTreeNode);
  309. var
  310. StageRec: TStageRecord;
  311. begin
  312. if Assigned(FEndPhaseData) then
  313. StageRec := FEndPhaseData.StageData.StageRecord(ANode.ID)
  314. else
  315. StageRec := nil;
  316. if Assigned(StageRec) then
  317. begin
  318. AProjCalc.CurMeasure.Deal.AddQuantity(StageRec.DealQuantity.AsFloat);
  319. AProjCalc.CurMeasure.Deal.AddTotalPrice(StageRec.DealTotalPrice.AsFloat);
  320. AProjCalc.CurMeasure.Qc.AddQuantity(StageRec.QcQuantity.AsFloat);
  321. AProjCalc.CurMeasure.Qc.AddTotalPrice(StageRec.QcTotalPrice.AsFloat);
  322. AProjCalc.CurMeasure.Gather.AddQuantity(StageRec.GatherQuantity.AsFloat);
  323. AProjCalc.CurMeasure.Gather.AddTotalPrice(StageRec.GatherTotalPrice.AsFloat);
  324. AProjCalc.PreMeasure.Deal.AddQuantity(StageRec.PreDealQuantity.AsFloat);
  325. AProjCalc.PreMeasure.Deal.AddTotalPrice(StageRec.PreDealTotalPrice.AsFloat);
  326. AProjCalc.PreMeasure.Qc.AddQuantity(StageRec.PreQcQuantity.AsFloat);
  327. AProjCalc.PreMeasure.Qc.AddTotalPrice(StageRec.PreQcTotalPrice.AsFloat);
  328. AProjCalc.PreMeasure.Gather.AddQuantity(StageRec.PreGatherQuantity.AsFloat);
  329. AProjCalc.PreMeasure.Gather.AddTotalPrice(StageRec.PreGatherTotalPrice.AsFloat);
  330. AProjCalc.EndMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  331. AProjCalc.EndMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  332. AProjCalc.EndMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  333. AProjCalc.EndMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  334. AProjCalc.EndMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  335. AProjCalc.EndMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  336. AProjCalc.ZoneMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  337. AProjCalc.ZoneMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  338. AProjCalc.ZoneMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  339. AProjCalc.ZoneMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  340. AProjCalc.ZoneMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  341. AProjCalc.ZoneMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  342. end;
  343. if Assigned(FBeginPhaseData) then
  344. StageRec := FBeginPhaseData.StageData.StageRecord(ANode.ID)
  345. else
  346. StageRec := nil;
  347. if Assigned(StageRec) then
  348. begin
  349. AProjCalc.ZoneMeasure.Deal.AddQuantity(-StageRec.PreDealQuantity.AsFloat);
  350. AProjCalc.ZoneMeasure.Deal.AddTotalPrice(-StageRec.PreDealTotalPrice.AsFloat);
  351. AProjCalc.ZoneMeasure.Qc.AddQuantity(-StageRec.PreQcQuantity.AsFloat);
  352. AProjCalc.ZoneMeasure.Qc.AddTotalPrice(-StageRec.PreQcTotalPrice.AsFloat);
  353. AProjCalc.ZoneMeasure.Gather.AddQuantity(-StageRec.PreGatherQuantity.AsFloat);
  354. AProjCalc.ZoneMeasure.Gather.AddTotalPrice(-StageRec.PreGatherTotalPrice.AsFloat);
  355. end;
  356. end;
  357. procedure TZoneProjGather.FreeProjectData;
  358. begin
  359. inherited;
  360. if Assigned(ProjectData) and (ProjectData.PhaseData <> FBeginPhaseData) and Assigned(FBeginPhaseData) then
  361. FBeginPhaseData.Free;
  362. if Assigned(ProjectData) and (ProjectData.PhaseData <> FEndPhaseData) and Assigned(FEndPhaseData) then
  363. FEndPhaseData.Free;
  364. end;
  365. procedure TZoneProjGather.Gather(AProjs: TList; ABeginPhaseIndex,
  366. AEndPhaseIndex: Integer);
  367. var
  368. i: Integer;
  369. begin
  370. FProjs := AProjs;
  371. FCommonProjs.Assign(FProjs);
  372. FBeginPhaseIndex := ABeginPhaseIndex;
  373. FEndPhaseIndex := AEndPhaseIndex;
  374. FTree := TProjGatherTree.Create(FProjs.Count, 0);
  375. FTree.NewNodeID := 101;
  376. try
  377. for i := 0 to FProjs.Count - 1 do
  378. GatherProj(TGatherProjInfo(FProjs.Items[i]), i);
  379. FTree.CalculateAll;
  380. if Assigned(FWriter) then
  381. FWriter(Self);
  382. finally
  383. FTree.Free;
  384. end;
  385. end;
  386. procedure TZoneProjGather.OpenProjectData(AProj: TGatherProjInfo);
  387. function CreatePhaseData(APhaseIndex: Integer): TPhaseData;
  388. begin
  389. Result := TPhaseData.Create(ProjectData);
  390. Result.SimpleOpen2(Format('%sPhase%d.dat', [FProjectData.TempPath, APhaseIndex]));
  391. end;
  392. var
  393. iCurBegin, iCurEnd: Integer;
  394. begin
  395. inherited;
  396. iCurBegin := Min(FBeginPhaseIndex, FProjectData.ProjProperties.PhaseCount);
  397. iCurEnd := Min(FEndPhaseIndex, FProjectData.ProjProperties.PhaseCount);
  398. if iCurBegin = 0 then
  399. FBeginPhaseData := nil
  400. else if iCurBegin = FProjectData.PhaseIndex then
  401. FBeginPhaseData := FProjectData.PhaseData
  402. else
  403. FBeginPhaseData := CreatePhaseData(iCurBegin);
  404. if iCurEnd = 0 then
  405. FEndPhaseData := nil
  406. else if iCurEnd = FProjectData.PhaseIndex then
  407. FEndPhaseData := FProjectData.PhaseData
  408. else if iCurEnd = FBeginPhaseIndex then
  409. FEndPhaseData := FBeginPhaseData
  410. else
  411. FEndPhaseData := CreatePhaseData(iCurEnd);
  412. end;
  413. end.