CheckAndClearFrm.pas 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. unit CheckAndClearFrm;
  2. interface
  3. uses
  4. BillsCompileDm, ZhAPI, sdIDTree, sdDB,
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, ZJGrid, StdCtrls, ExtCtrls, ZJCells;
  7. type
  8. TNodeData = class
  9. private
  10. FID: Integer;
  11. FB_Code: string;
  12. FName: string;
  13. FUnits: string;
  14. FPrice: Double;
  15. FQuantity: Double;
  16. end;
  17. TCheckAndClearForm = class(TForm)
  18. pnlSearch: TPanel;
  19. cbUnits: TCheckBox;
  20. cbPrice: TCheckBox;
  21. cbQuantity: TCheckBox;
  22. btnSearch: TButton;
  23. pnlResult: TPanel;
  24. zgSearchResult: TZJGrid;
  25. pnlClear: TPanel;
  26. cbSelectAll: TCheckBox;
  27. btnDelete: TButton;
  28. procedure btnSearchClick(Sender: TObject);
  29. procedure zgSearchResultMouseDown(Sender: TObject;
  30. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  31. procedure zgSearchResultCellCanEdit(Sender: TObject;
  32. const ACoord: TPoint; var Allow: Boolean);
  33. procedure btnDeleteClick(Sender: TObject);
  34. procedure cbSelectAllClick(Sender: TObject);
  35. private
  36. FBillsCompileData: TBillsCompileData;
  37. FResults: TList;
  38. procedure InitResultGrid;
  39. procedure FilterResult(ANode: TsdIDTreeNode);
  40. procedure FilterResults(ANode: TsdIDTreeNode);
  41. procedure SearchResults;
  42. procedure DisplayResults;
  43. procedure SelectAllorNot(ASelect: Boolean);
  44. procedure DeleteAllResults;
  45. procedure DeleteSelectResults;
  46. public
  47. constructor Create(ABillsCompileData: TBillsCompileData);
  48. destructor Destroy; override;
  49. end;
  50. procedure ShowCheckAndClearForm(ABillsCompileData: TBillsCompileData);
  51. implementation
  52. {$R *.dfm}
  53. procedure ShowCheckAndClearForm(ABillsCompileData: TBillsCompileData);
  54. var
  55. CheckClearForm: TCheckAndClearForm;
  56. begin
  57. CheckClearForm := TCheckAndClearForm.Create(ABillsCompileData);
  58. try
  59. CheckClearForm.ShowModal;
  60. finally
  61. CheckClearForm.Free;
  62. end;
  63. end;
  64. { TForm1 }
  65. constructor TCheckAndClearForm.Create(ABillsCompileData: TBillsCompileData);
  66. begin
  67. inherited Create(nil);
  68. FBillsCompileData := ABillsCompileData;
  69. FResults := TList.Create;
  70. InitResultGrid;
  71. end;
  72. destructor TCheckAndClearForm.Destroy;
  73. begin
  74. ClearObjects(FResults);
  75. FResults.Free;
  76. inherited;
  77. end;
  78. procedure TCheckAndClearForm.DisplayResults;
  79. var
  80. i: Integer;
  81. ResultNode: TNodeData;
  82. begin
  83. zgSearchResult.RowCount := FResults.Count + 1;
  84. for i := 0 to FResults.Count - 1 do
  85. begin
  86. ResultNode := TNodeData(FResults.Items[i]);
  87. zgSearchResult.Cells[1, i+1].Text := 'False';
  88. zgSearchResult.Cells[2, i+1].Text := ResultNode.FB_Code;
  89. zgSearchResult.Cells[2, i+1].Align := gaCenterLeft;
  90. zgSearchResult.Cells[3, i+1].Text := ResultNode.FName;
  91. zgSearchResult.Cells[3, i+1].Align := gaCenterLeft;
  92. zgSearchResult.Cells[4, i+1].Text := ResultNode.FUnits;
  93. zgSearchResult.Cells[4, i+1].Align := gaCenterCenter;
  94. zgSearchResult.Cells[5, i+1].Text := FloatToStr(ResultNode.FPrice);
  95. zgSearchResult.Cells[5, i+1].Align := gaCenterRight;
  96. zgSearchResult.Cells[6, i+1].Text := FloatToStr(ResultNode.FQuantity);
  97. zgSearchResult.Cells[6, i+1].Align := gaCenterRight;
  98. zgSearchResult.Rows[i+1].Data := ResultNode;
  99. end;
  100. end;
  101. procedure TCheckAndClearForm.FilterResults(ANode: TsdIDTreeNode);
  102. begin
  103. if not Assigned(ANode) then Exit;
  104. if ANode.HasChildren then
  105. FilterResults(ANode.FirstChild)
  106. else
  107. FilterResult(ANode);
  108. FilterResults(ANode.NextSibling);
  109. end;
  110. procedure TCheckAndClearForm.InitResultGrid;
  111. begin
  112. zgSearchResult.ColCount := 7;
  113. zgSearchResult.Cells[1, 0].Text := '恁寁';
  114. zgSearchResult.Cells[1, 0].Align := gaCenterCenter;
  115. zgSearchResult.ColWidths[1] := 35;
  116. zgSearchResult.CellClass.Cols[1] := TZjCheckBoxCell;
  117. zgSearchResult.Cells[2, 0].Text := 'ラ等晤瘍';
  118. zgSearchResult.Cells[2, 0].Align := gaCenterCenter;
  119. zgSearchResult.ColWidths[2] := 80;
  120. zgSearchResult.Cells[3, 0].Text := '靡備';
  121. zgSearchResult.Cells[3, 0].Align := gaCenterCenter;
  122. zgSearchResult.ColWidths[3] := 120;
  123. zgSearchResult.Cells[4, 0].Text := '等弇';
  124. zgSearchResult.Cells[4, 0].Align := gaCenterCenter;
  125. zgSearchResult.ColWidths[4] := 40;
  126. zgSearchResult.Cells[5, 0].Text := '等歎';
  127. zgSearchResult.Cells[5, 0].Align := gaCenterCenter;
  128. zgSearchResult.ColWidths[5] := 60;
  129. zgSearchResult.Cells[6, 0].Text := '杅講';
  130. zgSearchResult.Cells[6, 0].Align := gaCenterCenter;
  131. zgSearchResult.ColWidths[6] := 60;
  132. end;
  133. procedure TCheckAndClearForm.SearchResults;
  134. begin
  135. if cbUnits.Checked or cbPrice.Checked or cbQuantity.Checked then
  136. begin
  137. ClearObjects(FResults);
  138. FilterResults(FBillsCompileData.BillsCompileTree.FirstNode);
  139. DisplayResults;
  140. end;
  141. end;
  142. procedure TCheckAndClearForm.btnSearchClick(Sender: TObject);
  143. begin
  144. SearchResults;
  145. cbSelectAll.Checked := False;
  146. end;
  147. procedure TCheckAndClearForm.FilterResult(ANode: TsdIDTreeNode);
  148. function CheckCondition(ARec: TsdDataRecord): Boolean;
  149. begin
  150. Result := (not cbUnits.Checked or (ARec.ValueByName('Units').AsString = ''))
  151. and (not cbPrice.Checked or (ARec.ValueByName('Price').AsFloat = 0))
  152. and (not cbQuantity.Checked or (ARec.ValueByName('Quantity').AsFloat = 0));
  153. end;
  154. var
  155. ResultNode: TNodeData;
  156. begin
  157. if CheckCondition(ANode.Rec) and FBillsCompileData.BillsCompileTree.CanDelete(ANode) then
  158. begin
  159. ResultNode := TNodeData.Create;
  160. ResultNode.FID := ANode.ID;
  161. ResultNode.FB_Code := ANode.Rec.ValueByName('B_Code').AsString;
  162. ResultNode.FName := ANode.Rec.ValueByName('Name').AsString;
  163. ResultNode.FUnits := ANode.Rec.ValueByName('Units').AsString;
  164. ResultNode.FPrice := ANode.Rec.ValueByName('Price').AsFloat;
  165. ResultNode.FQuantity := ANode.Rec.ValueByName('Quantity').AsFloat;
  166. FResults.Add(ResultNode);
  167. end;
  168. end;
  169. procedure TCheckAndClearForm.zgSearchResultMouseDown(Sender: TObject;
  170. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  171. var
  172. ResultNode: TNodeData;
  173. BillsNode: TsdIDTreeNode;
  174. begin
  175. if (ssDouble in Shift) and (zgSearchResult.CurRow > 0) and (zgSearchResult.CurCol > 1) then
  176. begin
  177. ResultNode := TNodeData(zgSearchResult.Rows[zgSearchResult.CurRow].Data);
  178. BillsNode := FBillsCompileData.BillsCompileTree.FindNode(ResultNode.FID);
  179. FBillsCompileData.sdvBillsCompile.LocateInControl(BillsNode.Rec);
  180. end;
  181. end;
  182. procedure TCheckAndClearForm.zgSearchResultCellCanEdit(Sender: TObject;
  183. const ACoord: TPoint; var Allow: Boolean);
  184. begin
  185. if (ACoord.X = 1) and (ACoord.Y > 0) then
  186. Allow := True
  187. else
  188. Allow := False;
  189. end;
  190. procedure TCheckAndClearForm.btnDeleteClick(Sender: TObject);
  191. begin
  192. DeleteSelectResults;
  193. DisplayResults;
  194. end;
  195. procedure TCheckAndClearForm.DeleteAllResults;
  196. var
  197. i: Integer;
  198. ResultNode: TNodeData;
  199. BillsNode: TsdIDTreeNode;
  200. begin
  201. for i := 0 to FResults.Count - 1 do
  202. begin
  203. ResultNode := TNodeData(FResults.Items[i]);
  204. BillsNode := FBillsCompileData.BillsCompileTree.FindNode(ResultNode.FID);
  205. if FBillsCompileData.BillsCompileTree.CanDelete(BillsNode) then
  206. FBillsCompileData.BillsCompileTree.DeleteNode(BillsNode);
  207. end;
  208. ClearObjects(FResults);
  209. end;
  210. procedure TCheckAndClearForm.cbSelectAllClick(Sender: TObject);
  211. begin
  212. SelectAllorNot(TCheckBox(Sender).Checked);
  213. end;
  214. procedure TCheckAndClearForm.SelectAllorNot(ASelect: Boolean);
  215. var
  216. iRow: Integer;
  217. begin
  218. for iRow := 1 to zgSearchResult.RowCount - 1 do
  219. begin
  220. if ASelect then
  221. zgSearchResult.Cells[1, iRow].Text := 'True'
  222. else
  223. zgSearchResult.Cells[1, iRow].Text := 'False';
  224. end;
  225. end;
  226. procedure TCheckAndClearForm.DeleteSelectResults;
  227. var
  228. iRow: Integer;
  229. ResultNode: TNodeData;
  230. BillsNode: TsdIDTreeNode;
  231. begin
  232. for iRow := 1 to zgSearchResult.RowCount - 1 do
  233. begin
  234. if SameText(zgSearchResult.Cells[1, iRow].Text, 'True') then
  235. begin
  236. ResultNode := TNodeData(zgSearchResult.Rows[iRow].Data);
  237. BillsNode := FBillsCompileData.BillsCompileTree.FindNode(ResultNode.FID);
  238. if FBillsCompileData.BillsCompileTree.CanDelete(BillsNode) then
  239. FBillsCompileData.BillsCompileTree.DeleteNode(BillsNode);
  240. FResults.Remove(ResultNode);
  241. ResultNode.Free;
  242. end;
  243. end;
  244. end;
  245. end.