ProjGather.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  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. Result.AddMemoStr(ANode.Rec.MemoStr.AsString);
  225. AddProjCalcData(Result.GatherCalc, ANode);
  226. AddProjCalcData(Result.Proj[AProjIndex], ANode);
  227. end;
  228. procedure TProjGather.GatherProj(AProj: TGatherProjInfo; AProjIndex: Integer);
  229. begin
  230. OpenProjectData(AProj);
  231. try
  232. with FProjectData.BillsMeasureData do
  233. GatherBills(TMeasureBillsIDTreeNode(BillsMeasureTree.FirstNode), nil, AProjIndex);
  234. finally
  235. FreeProjectData;
  236. end;
  237. end;
  238. procedure TProjGather.GatherSpecialProj(AProj: TGatherProjInfo);
  239. begin
  240. if (AProj.ProjType > 0) and (AProj.ProjType <= FSpecialProjTypes.Count) then
  241. begin
  242. OpenProjectData(AProj);
  243. try
  244. with FProjectData.BillsMeasureData do
  245. GatherSpecialBills(TMeasureBillsIDTreeNode(BillsMeasureTree.FirstNode), nil, AProj.ProjType);
  246. finally
  247. FreeProjectData;
  248. end;
  249. end;
  250. end;
  251. procedure TProjGather.GatherSpecialBills(ANode: TMeasureBillsIDTreeNode;
  252. AParent: TProjGatherTreeNode; AProjType: Integer);
  253. var
  254. vCur: TProjGatherTreeNode;
  255. begin
  256. if not Assigned(ANode) then Exit;
  257. vCur := GatherSpecialBillsNode(ANode, AParent, AProjType);
  258. GatherSpecialBills(TMeasureBillsIDTreeNode(ANode.FirstChild), vCur, AProjType);
  259. GatherSpecialBills(TMeasureBillsIDTreeNode(ANode.NextSibling), AParent, AProjType );
  260. end;
  261. procedure TProjGather.OpenProjectData(AProj: TGatherProjInfo);
  262. begin
  263. FProjectData := OpenProjectManager.FindProjectData(AProj.ProjectID);
  264. if not Assigned(FProjectData) then
  265. begin
  266. FProjectData := TProjectData.Create;
  267. FProjectData.OpenForReport3(GetMyProjectsFilePath + AProj.FileName);
  268. end;
  269. end;
  270. function TProjGather.GatherSpecialBillsNode(
  271. ANode: TMeasureBillsIDTreeNode; AParent: TProjGatherTreeNode;
  272. AProjType: Integer): TProjGatherTreeNode;
  273. begin
  274. Result := FindBillsNode(ANode, AParent);
  275. if not Assigned(Result) then
  276. Result := CreateBillsNode(ANode, AParent);
  277. AddProjCalcData(Result.SpecialProj[AProjType - 1], ANode);
  278. end;
  279. procedure TProjGather.AddProjMeasureCalcData(AProjCalc: TProjCalc;
  280. ANode: TMeasureBillsIDTreeNode);
  281. var
  282. StageRec: TStageRecord;
  283. begin
  284. StageRec := ANode.StageRec;
  285. if Assigned(StageRec) then
  286. begin
  287. AProjCalc.CurMeasure.Deal.AddQuantity(StageRec.DealQuantity.AsFloat);
  288. AProjCalc.CurMeasure.Deal.AddTotalPrice(StageRec.DealTotalPrice.AsFloat);
  289. AProjCalc.CurMeasure.Qc.AddQuantity(StageRec.QcQuantity.AsFloat);
  290. AProjCalc.CurMeasure.Qc.AddTotalPrice(StageRec.QcTotalPrice.AsFloat);
  291. AProjCalc.CurMeasure.Gather.AddQuantity(StageRec.GatherQuantity.AsFloat);
  292. AProjCalc.CurMeasure.Gather.AddTotalPrice(StageRec.GatherTotalPrice.AsFloat);
  293. AProjCalc.PreMeasure.Deal.AddQuantity(StageRec.PreDealQuantity.AsFloat);
  294. AProjCalc.PreMeasure.Deal.AddTotalPrice(StageRec.PreDealTotalPrice.AsFloat);
  295. AProjCalc.PreMeasure.Qc.AddQuantity(StageRec.PreQcQuantity.AsFloat);
  296. AProjCalc.PreMeasure.Qc.AddTotalPrice(StageRec.PreQcTotalPrice.AsFloat);
  297. AProjCalc.PreMeasure.Gather.AddQuantity(StageRec.PreGatherQuantity.AsFloat);
  298. AProjCalc.PreMeasure.Gather.AddTotalPrice(StageRec.PreGatherTotalPrice.AsFloat);
  299. AProjCalc.EndMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  300. AProjCalc.EndMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  301. AProjCalc.EndMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  302. AProjCalc.EndMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  303. AProjCalc.EndMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  304. AProjCalc.EndMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  305. end;
  306. end;
  307. { TZoneProjGather }
  308. procedure TZoneProjGather.AddProjMeasureCalcData(AProjCalc: TProjCalc;
  309. ANode: TMeasureBillsIDTreeNode);
  310. var
  311. StageRec: TStageRecord;
  312. begin
  313. if Assigned(FEndPhaseData) then
  314. StageRec := FEndPhaseData.StageData.StageRecord(ANode.ID)
  315. else
  316. StageRec := nil;
  317. if Assigned(StageRec) then
  318. begin
  319. AProjCalc.CurMeasure.Deal.AddQuantity(StageRec.DealQuantity.AsFloat);
  320. AProjCalc.CurMeasure.Deal.AddTotalPrice(StageRec.DealTotalPrice.AsFloat);
  321. AProjCalc.CurMeasure.Qc.AddQuantity(StageRec.QcQuantity.AsFloat);
  322. AProjCalc.CurMeasure.Qc.AddTotalPrice(StageRec.QcTotalPrice.AsFloat);
  323. AProjCalc.CurMeasure.Gather.AddQuantity(StageRec.GatherQuantity.AsFloat);
  324. AProjCalc.CurMeasure.Gather.AddTotalPrice(StageRec.GatherTotalPrice.AsFloat);
  325. AProjCalc.PreMeasure.Deal.AddQuantity(StageRec.PreDealQuantity.AsFloat);
  326. AProjCalc.PreMeasure.Deal.AddTotalPrice(StageRec.PreDealTotalPrice.AsFloat);
  327. AProjCalc.PreMeasure.Qc.AddQuantity(StageRec.PreQcQuantity.AsFloat);
  328. AProjCalc.PreMeasure.Qc.AddTotalPrice(StageRec.PreQcTotalPrice.AsFloat);
  329. AProjCalc.PreMeasure.Gather.AddQuantity(StageRec.PreGatherQuantity.AsFloat);
  330. AProjCalc.PreMeasure.Gather.AddTotalPrice(StageRec.PreGatherTotalPrice.AsFloat);
  331. AProjCalc.EndMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  332. AProjCalc.EndMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  333. AProjCalc.EndMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  334. AProjCalc.EndMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  335. AProjCalc.EndMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  336. AProjCalc.EndMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  337. AProjCalc.ZoneMeasure.Deal.AddQuantity(StageRec.EndDealQuantity.AsFloat);
  338. AProjCalc.ZoneMeasure.Deal.AddTotalPrice(StageRec.EndDealTotalPrice.AsFloat);
  339. AProjCalc.ZoneMeasure.Qc.AddQuantity(StageRec.EndQcQuantity.AsFloat);
  340. AProjCalc.ZoneMeasure.Qc.AddTotalPrice(StageRec.EndQcTotalPrice.AsFloat);
  341. AProjCalc.ZoneMeasure.Gather.AddQuantity(StageRec.EndGatherQuantity.AsFloat);
  342. AProjCalc.ZoneMeasure.Gather.AddTotalPrice(StageRec.EndGatherTotalPrice.AsFloat);
  343. end;
  344. if Assigned(FBeginPhaseData) then
  345. StageRec := FBeginPhaseData.StageData.StageRecord(ANode.ID)
  346. else
  347. StageRec := nil;
  348. if Assigned(StageRec) then
  349. begin
  350. AProjCalc.ZoneMeasure.Deal.AddQuantity(-StageRec.PreDealQuantity.AsFloat);
  351. AProjCalc.ZoneMeasure.Deal.AddTotalPrice(-StageRec.PreDealTotalPrice.AsFloat);
  352. AProjCalc.ZoneMeasure.Qc.AddQuantity(-StageRec.PreQcQuantity.AsFloat);
  353. AProjCalc.ZoneMeasure.Qc.AddTotalPrice(-StageRec.PreQcTotalPrice.AsFloat);
  354. AProjCalc.ZoneMeasure.Gather.AddQuantity(-StageRec.PreGatherQuantity.AsFloat);
  355. AProjCalc.ZoneMeasure.Gather.AddTotalPrice(-StageRec.PreGatherTotalPrice.AsFloat);
  356. end;
  357. end;
  358. procedure TZoneProjGather.FreeProjectData;
  359. begin
  360. inherited;
  361. if Assigned(ProjectData) and (ProjectData.PhaseData <> FBeginPhaseData) and Assigned(FBeginPhaseData) then
  362. FBeginPhaseData.Free;
  363. if Assigned(ProjectData) and (ProjectData.PhaseData <> FEndPhaseData) and Assigned(FEndPhaseData) then
  364. FEndPhaseData.Free;
  365. end;
  366. procedure TZoneProjGather.Gather(AProjs: TList; ABeginPhaseIndex,
  367. AEndPhaseIndex: Integer);
  368. var
  369. i: Integer;
  370. begin
  371. FProjs := AProjs;
  372. FCommonProjs.Assign(FProjs);
  373. FBeginPhaseIndex := ABeginPhaseIndex;
  374. FEndPhaseIndex := AEndPhaseIndex;
  375. FTree := TProjGatherTree.Create(FProjs.Count, 0);
  376. FTree.NewNodeID := 101;
  377. try
  378. for i := 0 to FProjs.Count - 1 do
  379. GatherProj(TGatherProjInfo(FProjs.Items[i]), i);
  380. FTree.CalculateAll;
  381. if Assigned(FWriter) then
  382. FWriter(Self);
  383. finally
  384. FTree.Free;
  385. end;
  386. end;
  387. procedure TZoneProjGather.OpenProjectData(AProj: TGatherProjInfo);
  388. function CreatePhaseData(APhaseIndex: Integer): TPhaseData;
  389. begin
  390. Result := TPhaseData.Create(ProjectData);
  391. Result.SimpleOpen2(Format('%sPhase%d.dat', [FProjectData.TempPath, APhaseIndex]));
  392. end;
  393. var
  394. iCurBegin, iCurEnd: Integer;
  395. begin
  396. inherited;
  397. iCurBegin := Min(FBeginPhaseIndex, FProjectData.ProjProperties.PhaseCount);
  398. iCurEnd := Min(FEndPhaseIndex, FProjectData.ProjProperties.PhaseCount);
  399. if iCurBegin = 0 then
  400. FBeginPhaseData := nil
  401. else if iCurBegin = FProjectData.PhaseIndex then
  402. FBeginPhaseData := FProjectData.PhaseData
  403. else
  404. FBeginPhaseData := CreatePhaseData(iCurBegin);
  405. if iCurEnd = 0 then
  406. FEndPhaseData := nil
  407. else if iCurEnd = FProjectData.PhaseIndex then
  408. FEndPhaseData := FProjectData.PhaseData
  409. else if iCurEnd = FBeginPhaseIndex then
  410. FEndPhaseData := FBeginPhaseData
  411. else
  412. FEndPhaseData := CreatePhaseData(iCurEnd);
  413. end;
  414. end.