tpSelectTendersFrm.pas 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. unit tpSelectTendersFrm;
  2. interface
  3. uses
  4. sdIDTree,
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls, ExtCtrls, ZJGrid, JimPages, ActnList, sdGridDBA,
  7. sdGridTreeDBA;
  8. type
  9. TSelectTendersForm = class(TForm)
  10. btnOk: TButton;
  11. btnCancel: TButton;
  12. stdTenderSelect: TsdGridTreeDBA;
  13. lblTenderResult: TLabel;
  14. Panel1: TPanel;
  15. pnlTenderSelectTitle: TPanel;
  16. lblTenderSelect: TLabel;
  17. pnlSelect: TPanel;
  18. zgTenderSelect: TZJGrid;
  19. pnlSelectTitle: TPanel;
  20. lblTenderList: TLabel;
  21. pnlResult: TPanel;
  22. zgResult: TZJGrid;
  23. pnlResultTitle: TPanel;
  24. lblResultList: TLabel;
  25. pnlDivision: TPanel;
  26. procedure zgTenderSelectDrawCellText(ACanvas: TCanvas;
  27. const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
  28. const Text: String; var ADefaultDraw: Boolean);
  29. procedure zgTenderSelectShowHint(var HintStr: String;
  30. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  31. procedure zgTenderSelectCellTextChanged(Sender: TObject; Col,
  32. Row: Integer);
  33. procedure zgTenderSelectSetCellText(Sender: TObject;
  34. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  35. procedure zgTenderSelectGetCellText(Sender: TObject;
  36. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  37. procedure btnOkClick(Sender: TObject);
  38. private
  39. FSelects: TList;
  40. procedure AddRows(ANode: TsdIDTreeNode);
  41. procedure RemoveRows(ANode: TsdIDTreeNode);
  42. procedure InitResultGrid;
  43. procedure AssignResultGrid;
  44. procedure AssignResult;
  45. function GetSelectCount: Integer;
  46. function GetSelectTotalPrice: Double;
  47. public
  48. constructor Create(AHistorys: TList);
  49. destructor Destroy; override;
  50. procedure AssignSelectTenders(ATender: TList);
  51. property SelectCount: Integer read GetSelectCount;
  52. property SelectTotalPrice: Double read GetSelectTotalPrice;
  53. end;
  54. function SelectTendersToPart(ATenders: TList): Boolean;
  55. implementation
  56. uses
  57. Globals, MainFrm, ProjectManagerDm, sdDB, UtilMethods;
  58. function SelectTendersToPart(ATenders: TList): Boolean;
  59. var
  60. vSelectFrm: TSelectTendersForm;
  61. begin
  62. vSelectFrm := TSelectTendersForm.Create(ATenders);
  63. try
  64. Result := vSelectFrm.ShowModal = mrOk;
  65. if Result then
  66. vSelectFrm.AssignSelectTenders(ATenders);
  67. finally
  68. vSelectFrm.Free;
  69. end;
  70. end;
  71. {$R *.dfm}
  72. constructor TSelectTendersForm.Create(AHistorys: TList);
  73. begin
  74. inherited Create(nil);
  75. stdTenderSelect.DataView := ProjectManager.sdvProjectsSpare;
  76. FSelects := TList.Create;
  77. FSelects.Assign(AHistorys);
  78. InitResultGrid;
  79. end;
  80. destructor TSelectTendersForm.Destroy;
  81. begin
  82. FSelects.Free;
  83. inherited;
  84. end;
  85. procedure TSelectTendersForm.zgTenderSelectDrawCellText(ACanvas: TCanvas;
  86. const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
  87. const Text: String; var ADefaultDraw: Boolean);
  88. procedure GetBitmap(AImage: TBitmap);
  89. begin
  90. with stdTenderSelect.IDTree.Items[ACoord.Y - 1] do
  91. if Rec.ValueByName('Type').AsInteger = 0 then
  92. if Expanded and HasChildren then
  93. MainForm.Images.GetBitmap(34, AImage)
  94. else
  95. MainForm.Images.GetBitmap(34, AImage)
  96. else
  97. MainForm.Images.GetBitmap(11, AImage);
  98. end;
  99. const
  100. rIconWidth = 16;
  101. rIconHeight = 16;
  102. var
  103. Img: TBitmap;
  104. Cell: TZjCell;
  105. rImg: TRect;
  106. begin
  107. if (ACoord.X = 2) and (ACoord.Y > zgTenderSelect.FixedRowCount - 1) then
  108. begin
  109. Cell := zgTenderSelect.Cells[ACoord.X, ACoord.Y];
  110. Img := TBitmap.Create;
  111. try
  112. GetBitmap(Img);
  113. case Cell.Align of
  114. gaTopLeft, gaTopCenter, gaTopRight:
  115. rImg := Rect(ARect.Left + 2, ARect.Top, ARect.Left + rIconWidth, ARect.Top + rIconHeight);
  116. gaCenterLeft, gaCenterCenter, gaCenterRight:
  117. 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);
  118. gaBottomLeft, gaBottomCenter, gaBottomRight:
  119. rImg := Rect(ARect.Left + 2, ARect.Bottom - rIconHeight, ARect.Left + rIconWidth, ARect.Bottom);
  120. end;
  121. ACanvas.StretchDraw(rImg, Img);
  122. WriteText(ACanvas, Rect(ARect.Left + rIconWidth, ARect.Top, ARect.Right, ARect.Bottom)
  123. , 2, 2, Text, Cell.Align, False);
  124. ADefaultDraw := False;
  125. finally
  126. Img.Free;
  127. end;
  128. end;
  129. end;
  130. procedure TSelectTendersForm.zgTenderSelectShowHint(var HintStr: String;
  131. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  132. var
  133. vCell: TZjCell;
  134. vNode: TsdIDTreeNode;
  135. iLevelWidth: Integer;
  136. rText: TRect;
  137. procedure CalcTextRect(var R: TRect);
  138. var
  139. DC: HDC;
  140. iTextHeight: Integer;
  141. begin
  142. DC := CreateCompatibleDC(0);
  143. try
  144. SelectObject(DC, vCell.Font.Handle);
  145. iTextHeight := DrawText(DC, PChar(vCell.Text), Length(vCell.Text), R, DT_SINGLELINE or DT_VCenter
  146. or DT_NOCLIP or DT_CALCRECT);
  147. finally
  148. DeleteDC(DC);
  149. end;
  150. end;
  151. begin
  152. if ACoord.Y < 1 then Exit;
  153. vCell := zgTenderSelect.Cells[ACoord.X, ACoord.Y];
  154. with HintInfo do
  155. begin
  156. vNode := stdTenderSelect.IDTree.Items[ACoord.Y - 1];
  157. if not Assigned(vNode) then Exit;
  158. iLevelWidth := (vNode.Level + 1) * 20 + 16;
  159. rText := CursorRect;
  160. CalcTextRect(rText);
  161. if (rText.Right - rText.Left + iLevelWidth > CursorRect.Right - CursorRect.Left) or
  162. (rText.Right > ClientWidth) then
  163. begin
  164. CanShow := True;
  165. HintStr := vCell.Text;
  166. GetCursorPos(HintPos);
  167. end;
  168. end;
  169. end;
  170. procedure TSelectTendersForm.InitResultGrid;
  171. begin
  172. zgResult.ColCount := 2;
  173. zgResult.RowCount := 1;
  174. zgResult.Cells[1, 0].Text := '所选项目';
  175. zgResult.ColWidths[1] := 225;
  176. end;
  177. procedure TSelectTendersForm.AssignResult;
  178. const
  179. sResult = '共选中标段 %d 个,金额合计 %s 元';
  180. var
  181. sTotalPrice: string;
  182. begin
  183. InitResultGrid;
  184. AssignResultGrid;
  185. sTotalPrice := FormatFloat('##,###,###,###.##', SelectTotalPrice);
  186. lblTenderResult.Caption := Format(sResult, [SelectCount, sTotalPrice]);
  187. end;
  188. procedure TSelectTendersForm.zgTenderSelectCellTextChanged(Sender: TObject;
  189. Col, Row: Integer);
  190. begin
  191. if (Col = 1) then
  192. zgTenderSelect.InvalidateCol(1);
  193. end;
  194. procedure TSelectTendersForm.zgTenderSelectSetCellText(Sender: TObject;
  195. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  196. var
  197. stnNode: TsdIDTreeNode;
  198. begin
  199. if ACoord.X = 1 then
  200. begin
  201. stnNode := stdTenderSelect.IDTree.Items[ACoord.Y - 1];
  202. if Value = 'True' then
  203. AddRows(stnNode)
  204. else
  205. RemoveRows(stnNode);
  206. AssignResult;
  207. end;
  208. end;
  209. procedure TSelectTendersForm.AddRows(ANode: TsdIDTreeNode);
  210. var
  211. iChild: Integer;
  212. begin
  213. if not Assigned(ANode) then Exit;
  214. if FSelects.IndexOf(Pointer(ANode.ID)) = -1 then
  215. FSelects.Add(Pointer(ANode.ID));
  216. if ANode.HasChildren then
  217. for iChild := 0 to ANode.ChildCount - 1 do
  218. AddRows(ANode.ChildNodes[iChild]);
  219. end;
  220. procedure TSelectTendersForm.RemoveRows(ANode: TsdIDTreeNode);
  221. var
  222. iChild: Integer;
  223. begin
  224. if not Assigned(ANode) then Exit;
  225. if FSelects.IndexOf(Pointer(ANode.ID)) > -1 then
  226. FSelects.Remove(Pointer(ANode.ID));
  227. if ANode.HasChildren then
  228. for iChild := 0 to ANode.ChildCount - 1 do
  229. RemoveRows(ANode.ChildNodes[iChild]);
  230. end;
  231. procedure TSelectTendersForm.zgTenderSelectGetCellText(Sender: TObject;
  232. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  233. var
  234. stnNode: TsdIDTreeNode;
  235. begin
  236. if ACoord.X = 1 then
  237. begin
  238. stnNode := stdTenderSelect.IDTree.Items[ACoord.Y - 1];
  239. if Assigned(stnNode) and (FSelects.IndexOf(Pointer(stnNode.ID)) > -1) then
  240. Value := 'True';
  241. end;
  242. end;
  243. procedure TSelectTendersForm.AssignResultGrid;
  244. var
  245. i, iID: Integer;
  246. vNode: TsdIDTreeNode;
  247. begin
  248. for i := 0 to FSelects.Count - 1 do
  249. begin
  250. iID := Integer(FSelects.Items[i]);
  251. vNode := stdTenderSelect.IDTree.FindNode(iID);
  252. if vNode.Rec.ValueByName('Type').AsInteger = 1 then
  253. begin
  254. zgResult.RowCount := zgResult.RowCount + 1;
  255. zgResult.Cells[1, zgResult.RowCount - 1].Text := vNode.Rec.ValueByName('Name').AsString;
  256. zgResult.Cells[1, zgResult.RowCount - 1].Align := gaCenterLeft;
  257. zgResult.Rows[zgResult.RowCount - 1].Data := vNode;
  258. end;
  259. end;
  260. end;
  261. function TSelectTendersForm.GetSelectCount: Integer;
  262. begin
  263. Result := zgResult.RowCount - 1;
  264. end;
  265. function TSelectTendersForm.GetSelectTotalPrice: Double;
  266. var
  267. iRow: Integer;
  268. vNode: TsdIDTreeNode;
  269. begin
  270. Result := 0;
  271. for iRow := 1 to zgResult.RowCount - 1 do
  272. begin
  273. vNode := TsdIDTreeNode(zgResult.Rows[iRow].Data);
  274. if Assigned(vNode) then
  275. Result := Result + vNode.Rec.ValueByName('DealTotalPrice').AsFloat;
  276. end;
  277. end;
  278. procedure TSelectTendersForm.btnOkClick(Sender: TObject);
  279. function CheckValid(var AMessage: string): Boolean;
  280. begin
  281. Result := False;
  282. if SelectCount = 0 then
  283. AMessage := '请勾选需统一划分的标段。'
  284. else if SelectTotalPrice <= 0 then
  285. AMessage := '当前勾选的标段,合计金额为0,请检查标段数据是否正确。'
  286. else
  287. Result := True;
  288. end;
  289. var
  290. iCount: Integer;
  291. sMessage: string;
  292. begin
  293. if not CheckValid(sMessage) then
  294. begin
  295. WarningMessage(sMessage);
  296. Exit;
  297. end
  298. else
  299. ModalResult := mrOk;
  300. end;
  301. procedure TSelectTendersForm.AssignSelectTenders(ATender: TList);
  302. //var
  303. //iRow: Integer;
  304. begin
  305. ATender.Assign(FSelects);
  306. //for iRow := 1 to zgResult.RowCount - 1 do
  307. //begin
  308. // if Assigned(zgResult.Rows[iRow].Data) then
  309. // ATender.Add(Pointer(TsdIDTreeNode(zgResult.Rows[iRow].Data).ID));
  310. //end;
  311. end;
  312. end.