BillsClipboard.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. unit BillsClipboard;
  2. interface
  3. uses
  4. BaseClipboard, Classes, BillsDm, ZhAPI, XmlDoc, XmlIntf, Windows, sdIDTree;
  5. type
  6. TBillsBlockNode = class
  7. private
  8. FID: Integer;
  9. FParentID: Integer;
  10. FNextSiblingID: Integer;
  11. FCode: string;
  12. FB_Code: string;
  13. FName: string;
  14. FUnits: string;
  15. FPrice: Double;
  16. FOrgQuantity: Double;
  17. FOrgTotalPrice: Double;
  18. FMisQuantity: Double;
  19. FMisTotalPrice: Double;
  20. FOthQuantity: Double;
  21. FOthTotalPrice: Double;
  22. FQuantity: Double;
  23. FTotalPrice: Double;
  24. FCalcType: Integer;
  25. FDrawingCode: string;
  26. FAlias: string;
  27. FDgnQuantity1: Double;
  28. FDgnQuantity2: Double;
  29. FMemoStr: string;
  30. FDealCode: string;
  31. FDealCompany: string;
  32. public
  33. procedure SaveToXmlNode(AXmlNode: IXMLNode);
  34. procedure LoadFromXmlNode(AXmlNode: IXMLNode);
  35. end;
  36. TBillsClipboard = class(TBaseClipboard)
  37. private
  38. FBillsData: TBillsData;
  39. FNodeList: TList;
  40. procedure SaveNodesToXml(AXmlNode: IXMLNode);
  41. procedure LoadNodesFromXml(AXmlNode: IXMLNode);
  42. procedure CopyBillsNodeData(ANode: TsdIDTreeNode);
  43. procedure CopyBillsNode(ANode: TsdIDTreeNode);
  44. procedure CopyData(ANode: TsdIDTreeNode; ACount: Integer);
  45. function AddBillsNode(ANode: TsdIDTreeNode; APos: Integer): TsdIDTreeNode;
  46. procedure PasteBillsNodeData(ANode: TsdIDTreeNode; APasteNode: TBillsBlockNode);
  47. procedure PasteChildren(AParentNode: TsdIDTreeNode; APasteParentID: Integer);
  48. procedure PasteNextSibling(APreSibling: TsdIDTreeNode; APasteNodeID: Integer);
  49. procedure PasteBillsNode(ANode: TsdIDTreeNode; APos: Integer; APasteNode: TBillsBlockNode);
  50. procedure PasteData(ANode: TsdIDTreeNode; APos: Integer);
  51. procedure Clear;
  52. protected
  53. procedure LoadXmlData(AXmlDoc: IXmlDocument); override;
  54. procedure SaveXmlData(AXmlDoc: IXmlDocument); override;
  55. public
  56. constructor Create(ABillsData: TBillsData);
  57. destructor Destroy; override;
  58. procedure Copy(ANode: TsdIDTreeNode; ACount: Integer);
  59. // APos: 0[×ÓÏî] 1[ºóÏî] 2[ǰÏî]
  60. procedure Paste(ANode: TsdIDTreeNode; APos: Integer);
  61. end;
  62. function HasBillsBlockFormat: Boolean;
  63. implementation
  64. uses sdDB, Math, SysUtils, UtilMethods;
  65. var
  66. CF_BillsBlock: Word;
  67. function HasBillsBlockFormat: Boolean;
  68. begin
  69. Result := HasClipboardFormat(CF_BillsBlock);
  70. end;
  71. { TBillsClipboard }
  72. function TBillsClipboard.AddBillsNode(ANode: TsdIDTreeNode;
  73. APos: Integer): TsdIDTreeNode;
  74. begin
  75. // ×ÓÏî²åÈë
  76. if APos = 0 then
  77. Result := ANode.Owner.Add(ANode.ID, -1)
  78. // ºóÏî²åÈë
  79. else if APos = 1 then
  80. Result := ANode.Owner.Add(ANode.ParentID, ANode.NextSiblingID)
  81. // ǰÏî²åÈë
  82. else if APos = 2 then
  83. Result := ANode.Owner.Add(ANode.ParentID, ANode.ID);
  84. end;
  85. procedure TBillsClipboard.Clear;
  86. begin
  87. ClearObjects(FNodeList);
  88. FNodeList.Clear;
  89. end;
  90. procedure TBillsClipboard.Copy(ANode: TsdIDTreeNode; ACount: Integer);
  91. begin
  92. Clear;
  93. CopyData(ANode, ACount);
  94. SaveToStream;
  95. SaveToXmlFile('E:\1.xml');
  96. SaveToClipboard(CF_BillsBlock);
  97. end;
  98. procedure TBillsClipboard.CopyBillsNode(ANode: TsdIDTreeNode);
  99. var
  100. iChild: Integer;
  101. begin
  102. if Assigned(ANode) then
  103. begin
  104. CopyBillsNodeData(ANode);
  105. for iChild := 0 to ANode.ChildCount - 1 do
  106. CopyBillsNode(ANode.ChildNodes[iChild]);
  107. end;
  108. end;
  109. procedure TBillsClipboard.CopyBillsNodeData(ANode: TsdIDTreeNode);
  110. var
  111. vNode: TBillsBlockNode;
  112. begin
  113. vNode := TBillsBlockNode.Create;
  114. FNodeList.Add(vNode);
  115. vNode.FID := ANode.Rec.ValueByName('ID').AsInteger;
  116. vNode.FParentID := ANode.Rec.ValueByName('ParentID').AsInteger;
  117. vNode.FNextSiblingID := ANode.Rec.ValueByName('NextSiblingID').AsInteger;
  118. vNode.FCode := ANode.Rec.ValueByName('Code').AsString;
  119. vNode.FB_Code := ANode.Rec.ValueByName('B_Code').AsString;
  120. vNode.FName := ANode.Rec.ValueByName('Name').AsString;
  121. vNode.FUnits := ANode.Rec.ValueByName('Units').AsString;
  122. vNode.FPrice := ANode.Rec.ValueByName('Price').AsFloat;
  123. vNode.FOrgQuantity := ANode.Rec.ValueByName('OrgQuantity').AsFloat;
  124. vNode.FOrgTotalPrice := ANode.Rec.ValueByName('OrgTotalPrice').AsFloat;
  125. vNode.FMisQuantity := ANode.Rec.ValueByName('MisQuantity').AsFloat;
  126. vNode.FMisTotalPrice := ANode.Rec.ValueByName('MisTotalPrice').AsFloat;
  127. vNode.FOthQuantity := ANode.Rec.ValueByName('OthQuantity').AsFloat;
  128. vNode.FOthTotalPrice := ANode.Rec.ValueByName('OthTotalPrice').AsFloat;
  129. vNode.FQuantity := ANode.Rec.ValueByName('Quantity').AsFloat;
  130. vNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  131. vNode.FCalcType := ANode.Rec.ValueByName('CalcType').AsInteger;
  132. vNode.FDrawingCode := ANode.Rec.ValueByName('DrawingCode').AsString;
  133. vNode.FAlias := ANode.Rec.ValueByName('Alias').AsString;
  134. vNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
  135. vNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
  136. vNode.FMemoStr := ANode.Rec.ValueByName('MemoStr').AsString;
  137. vNode.FDealCode := ANode.Rec.ValueByName('DealCode').AsString;
  138. vNode.FDealCompany := ANode.Rec.ValueByName('DealCompany').AsString;
  139. end;
  140. procedure TBillsClipboard.CopyData(ANode: TsdIDTreeNode; ACount: Integer);
  141. begin
  142. while Assigned(ANode) and (ACount > 0) do
  143. begin
  144. CopyBillsNode(ANode);
  145. Dec(ACount, ANode.PosterityCount + 1);
  146. ANode := ANode.NextSibling;
  147. end;
  148. end;
  149. constructor TBillsClipboard.Create(ABillsData: TBillsData);
  150. begin
  151. inherited Create;
  152. FBillsData := ABillsData;
  153. FNodeList := TList.Create;
  154. end;
  155. destructor TBillsClipboard.Destroy;
  156. begin
  157. ClearObjects(FNodeList);
  158. FNodeList.Free;
  159. inherited;
  160. end;
  161. procedure TBillsClipboard.LoadNodesFromXml(AXmlNode: IXMLNode);
  162. var
  163. BillsBlockNode: TBillsBlockNode;
  164. iNum: Integer;
  165. ParentXmlNode, CurXmlNode: IXMLNode;
  166. begin
  167. ParentXmlNode := AXmlNode.ChildNodes.FindNode('BillsBlockNodes');
  168. for iNum := 0 to ParentXmlNode.ChildNodes.Count - 1 do
  169. begin
  170. CurXmlNode := ParentXmlNode.ChildNodes.Nodes[iNum];
  171. BillsBlockNode := TBillsBlockNode.Create;
  172. FNodeList.Add(BillsBlockNode);
  173. BillsBlockNode.LoadFromXmlNode(CurXmlNode);
  174. end;
  175. end;
  176. procedure TBillsClipboard.LoadXmlData(AXmlDoc: IXmlDocument);
  177. begin
  178. inherited;
  179. LoadNodesFromXml(AXmlDoc.DocumentElement);
  180. end;
  181. procedure TBillsClipboard.Paste(ANode: TsdIDTreeNode; APos: Integer);
  182. begin
  183. Clear;
  184. LoadFromClipboard(CF_BillsBlock);
  185. LoadFromStream;
  186. PasteData(ANode, APos);
  187. end;
  188. procedure TBillsClipboard.PasteBillsNode(ANode: TsdIDTreeNode;
  189. APos: Integer; APasteNode: TBillsBlockNode);
  190. var
  191. stnCurrent: TsdIDTreeNode;
  192. begin
  193. stnCurrent := AddBillsNode(ANode, APos);
  194. PasteBillsNodeData(stnCurrent, APasteNode);
  195. PasteChildren(stnCurrent, APasteNode.FID);
  196. PasteNextSibling(stnCurrent, APasteNode.FNextSiblingID);
  197. end;
  198. procedure TBillsClipboard.PasteBillsNodeData(ANode: TsdIDTreeNode;
  199. APasteNode: TBillsBlockNode);
  200. begin
  201. ANode.Rec.ValueByName('Code').AsString := APasteNode.FCode;
  202. ANode.Rec.ValueByName('B_Code').AsString := APasteNode.FB_Code;
  203. ANode.Rec.ValueByName('Name').AsString := APasteNode.FName;
  204. ANode.Rec.ValueByName('Units').AsString := APasteNode.FUnits;
  205. ANode.Rec.ValueByName('Price').AsFloat := APasteNode.FPrice;
  206. ANode.Rec.ValueByName('OrgQuantity').AsFloat := QuantityRoundTo(APasteNode.FOrgQuantity);
  207. ANode.Rec.ValueByName('OrgTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOrgTotalPrice);
  208. ANode.Rec.ValueByName('MisQuantity').AsFloat := QuantityRoundTo(APasteNode.FMisQuantity);
  209. ANode.Rec.ValueByName('MisTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FMisTotalPrice);
  210. ANode.Rec.ValueByName('OthQuantity').AsFloat := QuantityRoundTo(APasteNode.FOthQuantity);
  211. ANode.Rec.ValueByName('OthTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOthTotalPrice);
  212. ANode.Rec.ValueByName('Quantity').AsFloat := QuantityRoundTo(APasteNode.FQuantity);
  213. ANode.Rec.ValueByName('TotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FTotalPrice);
  214. ANode.Rec.ValueByName('CalcType').AsInteger := APasteNode.FCalcType;
  215. ANode.Rec.ValueByName('DrawingCode').AsString := APasteNode.FDrawingCode;
  216. ANode.Rec.ValueByName('Alias').AsString := APasteNode.FAlias;
  217. ANode.Rec.ValueByName('DgnQuantity1').AsFloat := QuantityRoundTo(APasteNode.FDgnQuantity1);
  218. ANode.Rec.ValueByName('DgnQuantity2').AsFloat := QuantityRoundTo(APasteNode.FDgnQuantity2);
  219. ANode.Rec.ValueByName('MemoStr').AsString := APasteNode.FMemoStr;
  220. ANode.Rec.ValueByName('DealCode').AsString := APasteNode.FDealCode;
  221. ANode.Rec.ValueByName('DealCompany').AsString := APasteNode.FDealCompany;
  222. end;
  223. procedure TBillsClipboard.PasteChildren(AParentNode: TsdIDTreeNode;
  224. APasteParentID: Integer);
  225. var
  226. iNode: Integer;
  227. begin
  228. for iNode := 0 to FNodeList.Count - 1 do
  229. if TBillsBlockNode(FNodeList.Items[iNode]).FParentID = APasteParentID then
  230. begin
  231. PasteBillsNode(AParentNode, 0, TBillsBlockNode(FNodeList.Items[iNode]));
  232. Break;
  233. end;
  234. end;
  235. procedure TBillsClipboard.PasteData(ANode: TsdIDTreeNode; APos: Integer);
  236. var
  237. I: Integer;
  238. vPasteNode: TBillsBlockNode;
  239. begin
  240. PasteBillsNode(ANode, APos, TBillsBlockNode(FNodeList.First));
  241. end;
  242. procedure TBillsClipboard.PasteNextSibling(APreSibling: TsdIDTreeNode;
  243. APasteNodeID: Integer);
  244. var
  245. iNode: Integer;
  246. begin
  247. if APasteNodeID = -1 then Exit;
  248. for iNode := 0 to FNodeList.Count - 1 do
  249. if TBillsBlockNode(FNodeList.Items[iNode]).FID = APasteNodeID then
  250. begin
  251. PasteBillsNode(APreSibling, 1, TBillsBlockNode(FNodeList.Items[iNode]));
  252. Break;
  253. end;
  254. end;
  255. procedure TBillsClipboard.SaveNodesToXml(AXmlNode: IXMLNode);
  256. var
  257. ParentXmlNode, CurXmlNode: IXMLNode;
  258. iNum: Integer;
  259. BillsBlockNode: TBillsBlockNode;
  260. begin
  261. ParentXmlNode := AXmlNode.AddChild('BillsBlockNodes');
  262. for iNum := 0 to FNodeList.Count - 1 do
  263. begin
  264. BillsBlockNode := TBillsBlockNode(FNodeList.Items[iNum]);
  265. CurXmlNode := ParentXmlNode.AddChild('BillsBlockNode');
  266. BillsBlockNode.SaveToXmlNode(CurXmlNode);
  267. end;
  268. end;
  269. procedure TBillsClipboard.SaveXmlData(AXmlDoc: IXmlDocument);
  270. begin
  271. SaveNodesToXml(AXmlDoc.DocumentElement);
  272. inherited;
  273. end;
  274. { TBillsBlockNode }
  275. procedure TBillsBlockNode.LoadFromXmlNode(AXmlNode: IXMLNode);
  276. begin
  277. FID := AXmlNode.Attributes['ID'];
  278. FParentID := AXmlNode.Attributes['ParentID'];
  279. FNextSiblingID := AXmlNode.Attributes['NextSiblingID'];
  280. FCode := AXmlNode.Attributes['Code'];
  281. FB_Code := AXmlNode.Attributes['B_Code'];
  282. FName := AXmlNode.Attributes['Name'];
  283. FUnits := AXmlNode.Attributes['Units'];
  284. FPrice := AXmlNode.Attributes['Price'];
  285. FOrgQuantity := AXmlNode.Attributes['OrgQuantity'];
  286. FOrgTotalPrice := AXmlNode.Attributes['OrgTotalPrice'];
  287. FMisQuantity := AXmlNode.Attributes['MisQuantity'];
  288. FMisTotalPrice := AXmlNode.Attributes['MisTotalPrice'];
  289. FOthQuantity := AXmlNode.Attributes['OthQuantity'];
  290. FOthTotalPrice := AXmlNode.Attributes['OthTotalPrice'];
  291. FQuantity := AXmlNode.Attributes['Quantity'];
  292. FTotalPrice := AXmlNode.Attributes['TotalPrice'];
  293. FCalcType := AXmlNode.Attributes['CalcType'];
  294. FDrawingCode := AXmlNode.Attributes['DrawingCode'];
  295. FAlias := AXmlNode.Attributes['Alias'];
  296. FDgnQuantity1 := AXmlNode.Attributes['DgnQuantity1'];
  297. FDgnQuantity2 := AXmlNode.Attributes['DgnQuantity2'];
  298. FMemoStr := AXmlNode.Attributes['MemoStr'];
  299. FDealCode := AXmlNode.Attributes['DealCode'];
  300. FDealCompany := AXmlNode.Attributes['DealCompany'];
  301. end;
  302. procedure TBillsBlockNode.SaveToXmlNode(AXmlNode: IXMLNode);
  303. begin
  304. AXmlNode.Attributes['ID'] := FID;
  305. AXmlNode.Attributes['ParentID'] := FParentID;
  306. AXmlNode.Attributes['NextSiblingID'] := FNextSiblingID;
  307. AXmlNode.Attributes['Code'] := FCode;
  308. AXmlNode.Attributes['B_Code'] := FB_Code;
  309. AXmlNode.Attributes['Name'] := FName;
  310. AXmlNode.Attributes['Units'] := FUnits;
  311. AXmlNode.Attributes['Price'] := FPrice;
  312. AXmlNode.Attributes['OrgQuantity'] := FOrgQuantity;
  313. AXmlNode.Attributes['OrgTotalPrice'] := FOrgTotalPrice;
  314. AXmlNode.Attributes['MisQuantity'] := FMisQuantity;
  315. AXmlNode.Attributes['MisTotalPrice'] := FMisTotalPrice;
  316. AXmlNode.Attributes['OthQuantity'] := FOthQuantity;
  317. AXmlNode.Attributes['OthTotalPrice'] := FOthTotalPrice;
  318. AXmlNode.Attributes['Quantity'] := FQuantity;
  319. AXmlNode.Attributes['TotalPrice'] := FTotalPrice;
  320. AXmlNode.Attributes['CalcType'] := FCalcType;
  321. AXmlNode.Attributes['DrawingCode'] := FDrawingCode;
  322. AXmlNode.Attributes['Alias'] := FAlias;
  323. AXmlNode.Attributes['DgnQuantity1'] := FDgnQuantity1;
  324. AXmlNode.Attributes['DgnQuantity2'] := FDgnQuantity2;
  325. AXmlNode.Attributes['MemoStr'] := FMemoStr;
  326. AXmlNode.Attributes['DealCode'] := FDealCode;
  327. AXmlNode.Attributes['DealCompany'] := FDealCompany;
  328. end;
  329. initialization
  330. CF_BillsBlock := RegisterClipboardFormat('Zh.BillsBlock');
  331. end.