ProjGatherSelectFrm.pas 12 KB

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