ProjGatherSelectFme.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. unit ProjGatherSelectFme;
  2. interface
  3. uses
  4. sdIDTree, sdDB,
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls, ExtCtrls, sdGridDBA, sdGridTreeDBA, ZJGrid, ZJCells;
  7. type
  8. TAfterSelectEvent = procedure of Object;
  9. TProjGatherSelectFrame = class(TFrame)
  10. zgSelectProject: TZJGrid;
  11. stdSelectProject: TsdGridTreeDBA;
  12. pnlProjects: TPanel;
  13. pnlProjectsTitle: TPanel;
  14. lblProjectList: TLabel;
  15. pnlProjLeft: TPanel;
  16. pnlProjRight: TPanel;
  17. pnlProjBottom: TPanel;
  18. pnlResults: TPanel;
  19. pnlResultTitle: TPanel;
  20. lblResult: TLabel;
  21. zgResult: TZJGrid;
  22. pnlResultLeft: TPanel;
  23. pnlResultBottom: TPanel;
  24. pnlResultRight: TPanel;
  25. procedure zgSelectProjectGetCellText(Sender: TObject;
  26. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  27. procedure zgSelectProjectSetCellText(Sender: TObject;
  28. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  29. procedure zgSelectProjectCellTextChanged(Sender: TObject; Col,
  30. Row: Integer);
  31. procedure zgSelectProjectDrawCellText(ACanvas: TCanvas;
  32. const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
  33. const Text: String; var ADefaultDraw: Boolean);
  34. procedure zgResultGetCellText(Sender: TObject; const ACoord: TPoint;
  35. var Value: String; DisplayText: Boolean);
  36. procedure zgResultSetCellText(Sender: TObject; const ACoord: TPoint;
  37. var Value: String; DisplayText: Boolean);
  38. procedure zgSelectProjectCellGetColor(Sender: TObject; ACoord: TPoint;
  39. var AColor: TColor);
  40. private
  41. FProjectID: Integer;
  42. FValidProjs: TList;
  43. FSelectProjs: TList;
  44. FSpecialProjTypes: TStrings;
  45. FSpecialProjIDs: array of Integer;
  46. FMarkedProjs: TList;
  47. FAfterSelectProject: TAfterSelectEvent;
  48. function HasSelect(AProjectID: Integer): Boolean;
  49. procedure AddProjs(ANode: TsdIDTreeNode);
  50. procedure RemoveProjs(ANode: TsdIDTreeNode);
  51. procedure AssignSelectTenders;
  52. function GetTopParent: TsdIDTreeNode;
  53. procedure AddValidProject(ANode: TsdIDTreeNode);
  54. procedure FilterValidProject;
  55. function IsValidProj(AID: Integer): Boolean;
  56. procedure DoOnFilterRecord(ARecord: TsdDataRecord; var AAllow: Boolean);
  57. public
  58. constructor Create(AProjectID: Integer; ASpecialProjTypes: TStrings);
  59. destructor Destroy; override;
  60. procedure LoadHistorySelects(AProjs: TList);
  61. procedure AssignResult(AProjs: TList);
  62. procedure ClearMarkedProj;
  63. function CheckProjPhaseValid(APhaseIndex: Integer): Boolean;
  64. property AfterSelectProject: TAfterSelectEvent read FAfterSelectProject write FAfterSelectProject;
  65. end;
  66. implementation
  67. uses
  68. Globals, GatherProjInfo, MainFrm, Math, ZhAPI;
  69. {$R *.dfm}
  70. { TProjGatherSelectFrame }
  71. procedure TProjGatherSelectFrame.AddProjs(ANode: TsdIDTreeNode);
  72. var
  73. iChild: Integer;
  74. begin
  75. if FSelectProjs.IndexOf(Pointer(ANode.ID)) = -1 then
  76. FSelectProjs.Add(Pointer(ANode.id));
  77. for iChild := 0 to ANode.ChildCount - 1 do
  78. AddProjs(ANode.ChildNodes[iChild]);
  79. end;
  80. procedure TProjGatherSelectFrame.AddValidProject(ANode: TsdIDTreeNode);
  81. var
  82. iChild: Integer;
  83. begin
  84. FValidProjs.Add(ANode);
  85. for iChild := 0 to ANode.ChildCount - 1 do
  86. AddValidProject(ANode.ChildNodes[iChild]);
  87. end;
  88. procedure TProjGatherSelectFrame.AssignSelectTenders;
  89. procedure InitResultGrid;
  90. var
  91. i: Integer;
  92. begin
  93. zgResult.ColCount := 2;
  94. zgResult.RowCount := 1;
  95. zgResult.Cells[1, 0].Text := 'ËùÑ¡ÏîÄ¿';
  96. zgResult.ColWidths[1] := 308;
  97. if Assigned(FSpecialProjTypes) then
  98. begin
  99. zgResult.ColWidths[1] := 308 - (Min(FSpecialProjTypes.Count, 2)*45);
  100. for i := 0 to FSpecialProjTypes.Count - 1 do
  101. begin
  102. zgResult.ColCount := zgResult.ColCount + 1;
  103. zgResult.Cells[2+i, 0].Text := FSpecialProjTypes.Strings[i];
  104. zgResult.ColWidths[2+i] := 45;
  105. zgResult.CellClass.Cols[2+i] := TZjCheckBoxCell;
  106. end;
  107. end;
  108. end;
  109. var
  110. stnNode: TsdIDTreeNode;
  111. i, iProjectID: Integer;
  112. begin
  113. InitResultGrid;
  114. for i := 0 to FSelectProjs.Count - 1 do
  115. begin
  116. iProjectID := Integer(FSelectProjs.Items[i]);
  117. stnNode := stdSelectProject.IDTree.FindNode(iProjectID);
  118. if stnNode.Rec.ValueByName('Type').AsInteger = 1 then
  119. begin
  120. zgResult.RowCount := zgResult.RowCount + 1;
  121. zgResult.Cells[1, zgResult.RowCount - 1].Text :=
  122. stnNode.Rec.ValueByName('Name').AsString;
  123. zgResult.Cells[1, zgResult.RowCount - 1].Align := gaCenterLeft;
  124. zgResult.Rows[zgResult.RowCount - 1].Data := stnNode;
  125. end;
  126. end;
  127. end;
  128. constructor TProjGatherSelectFrame.Create(AProjectID: Integer;
  129. ASpecialProjTypes: TStrings);
  130. var
  131. i: Integer;
  132. begin
  133. inherited Create(nil);
  134. FMarkedProjs := TList.Create;
  135. FSelectProjs := TList.Create;
  136. FProjectID := AProjectID;
  137. FValidProjs := TList.Create;
  138. // È¡Ïû¹ýÂË
  139. //FilterValidProject;
  140. //ProjectManager.sdvProjectsSpare.OnFilterRecord := DoOnFilterRecord;
  141. ProjectManager.sdvProjectsSpare.Filtered := True;
  142. stdSelectProject.DataView := ProjectManager.sdvProjectsSpare;
  143. FSpecialProjTypes := ASpecialProjTypes;
  144. if FSpecialProjTypes <> nil then
  145. begin
  146. SetLength(FSpecialProjIDs, FSpecialProjTypes.Count);
  147. for i := 0 to ASpecialProjTypes.Count - 1 do
  148. FSpecialProjIDs[i] := -1;
  149. end;
  150. end;
  151. destructor TProjGatherSelectFrame.Destroy;
  152. begin
  153. //ProjectManager.sdvProjectsSpare.Filtered := False;
  154. //ProjectManager.sdvProjectsSpare.OnFilterRecord := nil;
  155. FValidProjs.Free;
  156. FSelectProjs.Free;
  157. FMarkedProjs.Free;
  158. inherited;
  159. end;
  160. procedure TProjGatherSelectFrame.DoOnFilterRecord(ARecord: TsdDataRecord;
  161. var AAllow: Boolean);
  162. begin
  163. AAllow := Assigned(ARecord) and IsValidProj(ARecord.ValueByName('ID').AsInteger);
  164. end;
  165. procedure TProjGatherSelectFrame.FilterValidProject;
  166. var
  167. vTopParent: TsdIDTreeNode;
  168. i: Integer;
  169. begin
  170. vTopParent := GetTopParent;
  171. AddValidProject(vTopParent);
  172. end;
  173. function TProjGatherSelectFrame.GetTopParent: TsdIDTreeNode;
  174. begin
  175. Result := ProjectManager.ProjectsTree.FindNode(FProjectID);
  176. while Assigned(Result.Parent) do
  177. Result := Result.Parent;
  178. end;
  179. function TProjGatherSelectFrame.HasSelect(AProjectID: Integer): Boolean;
  180. begin
  181. Result := FSelectProjs.IndexOf(Pointer(AProjectID)) <> -1;
  182. end;
  183. function TProjGatherSelectFrame.IsValidProj(AID: Integer): Boolean;
  184. var
  185. i: Integer;
  186. vNode: TsdIDTreeNode;
  187. begin
  188. Result := False;
  189. for i := 0 to FValidProjs.Count - 1 do
  190. begin
  191. vNode := TsdIDTreeNode(FValidProjs.Items[i]);
  192. if vNode.ID = AID then
  193. begin
  194. Result := True;
  195. Break;
  196. end;
  197. end;
  198. end;
  199. procedure TProjGatherSelectFrame.LoadHistorySelects(AProjs: TList);
  200. var
  201. i: Integer;
  202. vGatherProjInfo: TGatherProjInfo;
  203. begin
  204. for i := 0 to AProjs.Count - 1 do
  205. begin
  206. vGatherProjInfo := TGatherProjInfo(AProjs.Items[i]);
  207. FSelectProjs.Add(Pointer(vGatherProjInfo.ProjectID));
  208. if Assigned(FSpecialProjTypes) then
  209. begin
  210. if (vGatherProjInfo.ProjType > 0) and (vGatherProjInfo.ProjType <= FSpecialProjTypes.Count) then
  211. FSpecialProjIDs[vGatherProjInfo.ProjType-1] := vGatherProjInfo.ProjectID;
  212. end;
  213. end;
  214. AssignSelectTenders;
  215. end;
  216. procedure TProjGatherSelectFrame.RemoveProjs(ANode: TsdIDTreeNode);
  217. var
  218. iChild: Integer;
  219. i: Integer;
  220. begin
  221. if FSelectProjs.IndexOf(Pointer(ANode.ID)) <> -1 then
  222. begin
  223. FSelectProjs.Remove(Pointer(ANode.id));
  224. for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
  225. if FSpecialProjIDs[i] = ANode.ID then
  226. FSpecialProjIDs[i] := -1;
  227. end;
  228. for iChild := 0 to ANode.ChildCount - 1 do
  229. RemoveProjs(ANode.ChildNodes[iChild]);
  230. end;
  231. procedure TProjGatherSelectFrame.zgSelectProjectGetCellText(
  232. Sender: TObject; const ACoord: TPoint; var Value: String;
  233. DisplayText: Boolean);
  234. var
  235. stnNode: TsdIDTreeNode;
  236. begin
  237. if ACoord.X = 1 then
  238. begin
  239. stnNode := stdSelectProject.IDTree.Items[ACoord.Y - 1];
  240. if Assigned(stnNode) and HasSelect(stnNode.ID) then
  241. Value := 'True';
  242. end;
  243. end;
  244. procedure TProjGatherSelectFrame.zgSelectProjectSetCellText(
  245. Sender: TObject; const ACoord: TPoint; var Value: String;
  246. DisplayText: Boolean);
  247. var
  248. stnNode: TsdIDTreeNode;
  249. begin
  250. if ACoord.X = 1 then
  251. begin
  252. stnNode := stdSelectProject.IDTree.Items[ACoord.Y - 1];
  253. if Value = 'True' then
  254. AddProjs(stnNode)
  255. else
  256. RemoveProjs(stnNode);
  257. end;
  258. zgSelectProject.InvalidateCol(1);
  259. end;
  260. procedure TProjGatherSelectFrame.zgSelectProjectCellTextChanged(
  261. Sender: TObject; Col, Row: Integer);
  262. begin
  263. if (Col = 1) then
  264. begin
  265. AssignSelectTenders;
  266. if Assigned(FAfterSelectProject) then
  267. FAfterSelectProject;
  268. end;
  269. end;
  270. procedure TProjGatherSelectFrame.zgSelectProjectDrawCellText(
  271. ACanvas: TCanvas; const ARect: TRect; const ACoord: TPoint;
  272. AGrid: TZJGrid; const Text: String; var ADefaultDraw: Boolean);
  273. procedure GetBitmap(AImage: TBitmap);
  274. begin
  275. with stdSelectProject.IDTree.Items[ACoord.Y - 1] do
  276. if Rec.ValueByName('Type').AsInteger = 0 then
  277. if Expanded and HasChildren then
  278. MainForm.Images.GetBitmap(34, AImage)
  279. else
  280. MainForm.Images.GetBitmap(34, AImage)
  281. else
  282. MainForm.Images.GetBitmap(11, AImage);
  283. end;
  284. const
  285. rIconWidth = 16;
  286. rIconHeight = 16;
  287. var
  288. Img: TBitmap;
  289. Cell: TZjCell;
  290. rImg: TRect;
  291. begin
  292. if (ACoord.X = 2) and (ACoord.Y > zgSelectProject.FixedRowCount - 1) then
  293. begin
  294. Cell := zgSelectProject.Cells[ACoord.X, ACoord.Y];
  295. Img := TBitmap.Create;
  296. try
  297. GetBitmap(Img);
  298. case Cell.Align of
  299. gaTopLeft, gaTopCenter, gaTopRight:
  300. rImg := Rect(ARect.Left + 2, ARect.Top, ARect.Left + rIconWidth, ARect.Top + rIconHeight);
  301. gaCenterLeft, gaCenterCenter, gaCenterRight:
  302. rImg := Rect(ARect.Left + 2, ARect.Top + (ARect.Bottom - ARect.Top - rIconHeight) div 2, ARect.Left + rIconWidth, ARect.Bottom - (ARect.Bottom - ARect.Top - rIconHeight) div 2);
  303. gaBottomLeft, gaBottomCenter, gaBottomRight:
  304. rImg := Rect(ARect.Left + 2, ARect.Bottom - rIconHeight, ARect.Left + rIconWidth, ARect.Bottom);
  305. end;
  306. ACanvas.StretchDraw(rImg, Img);
  307. WriteText(ACanvas, Rect(ARect.Left + rIconWidth, ARect.Top, ARect.Right, ARect.Bottom)
  308. , 2, 2, Text, Cell.Align, False);
  309. ADefaultDraw := False;
  310. finally
  311. Img.Free;
  312. end;
  313. end;
  314. end;
  315. procedure TProjGatherSelectFrame.zgResultGetCellText(Sender: TObject;
  316. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  317. begin
  318. if (ACoord.X > 1) and (ACoord.Y > 0) then
  319. begin
  320. if Assigned(zgResult.Rows[ACoord.Y].Data) and (TsdIDTreeNode(zgResult.Rows[ACoord.Y].Data).ID = FSpecialProjIDs[ACoord.X-2]) then
  321. Value := 'True'
  322. else
  323. Value := 'False';
  324. end;
  325. end;
  326. procedure TProjGatherSelectFrame.zgResultSetCellText(Sender: TObject;
  327. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  328. var
  329. iProjID, i: Integer;
  330. stnNode: TsdIDTreeNode;
  331. begin
  332. if (ACoord.X > 1) and (ACoord.Y > 0) then
  333. begin
  334. stnNode := TsdIDTreeNode(zgResult.Rows[ACoord.Y].Data);
  335. iProjID := stnNode.ID;
  336. if FSpecialProjIDs[ACoord.X-2] <> iProjID then
  337. begin
  338. for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
  339. begin
  340. if FSpecialProjIDs[i] = iProjID then
  341. FSpecialProjIDs[i] := -1
  342. end;
  343. FSpecialProjIDs[ACoord.X-2] := iProjID;
  344. end
  345. else
  346. FSpecialProjIDs[ACoord.X-2] := -1;
  347. for i := 0 to FSpecialProjTypes.Count - 1 do
  348. zgResult.InvalidateCol(i+2);
  349. end;
  350. end;
  351. procedure TProjGatherSelectFrame.AssignResult(AProjs: TList);
  352. function SpecialProjType(AID: Integer): Integer;
  353. var
  354. i: Integer;
  355. begin
  356. Result := 0;
  357. for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
  358. begin
  359. if AID = FSpecialProjIDs[i] then
  360. begin
  361. Result := i+1;
  362. Break;
  363. end;
  364. end;
  365. end;
  366. var
  367. iRow: Integer;
  368. stnNode: TsdIDTreeNode;
  369. vGatherProj: TGatherProjInfo;
  370. begin
  371. AProjs.Clear;
  372. for iRow := 1 to zgResult.RowCount - 1 do
  373. begin
  374. stnNode := TsdIDTreeNode(zgResult.Rows[iRow].Data);
  375. vGatherProj := TGatherProjInfo.Create(stnNode, -1, SpecialProjType(stnNode.ID));
  376. AProjs.Add(vGatherProj);
  377. end;
  378. end;
  379. function TProjGatherSelectFrame.CheckProjPhaseValid(
  380. APhaseIndex: Integer): Boolean;
  381. var
  382. iRow: Integer;
  383. stnNode: TsdIDTreeNode;
  384. begin
  385. FMarkedProjs.Clear;
  386. for iRow := 1 to zgResult.RowCount - 1 do
  387. begin
  388. stnNode := TsdIDTreeNode(zgResult.Rows[iRow].Data);
  389. if stnNode.Rec.ValueByName('PhaseCount').AsInteger < APhaseIndex then
  390. FMarkedProjs.Add(Pointer(stnNode.ID));
  391. end;
  392. Result := FMarkedProjs.Count = 0;
  393. zgSelectProject.Invalidate;
  394. end;
  395. procedure TProjGatherSelectFrame.zgSelectProjectCellGetColor(
  396. Sender: TObject; ACoord: TPoint; var AColor: TColor);
  397. var
  398. vProj: TsdIDTreeNode;
  399. begin
  400. if ACoord.Y > 0 then
  401. begin
  402. vProj := stdSelectProject.IDTree.Items[ACoord.Y - 1];
  403. if Assigned(vProj) then
  404. begin
  405. if FMarkedProjs.IndexOf(Pointer(vProj.ID)) <> -1 then
  406. AColor := $00646AFE
  407. else
  408. AColor := clWindow;
  409. end;
  410. end;
  411. end;
  412. procedure TProjGatherSelectFrame.ClearMarkedProj;
  413. begin
  414. FMarkedProjs.Clear;
  415. zgSelectProject.Invalidate;
  416. end;
  417. end.