PriceMarginClipboard.pas 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. unit PriceMarginClipboard;
  2. interface
  3. uses
  4. BaseClipboard, Classes, XmlDoc, XmlIntf, PriceMarginBillsDm, ZhAPI,
  5. Windows, ProjectGLDm, DetailGLDm, mDataRecord;
  6. Type
  7. TProjectGLNode = class
  8. private
  9. FID: Integer;
  10. FCode: string;
  11. FName: string;
  12. FUnits: string;
  13. FSpecs: string;
  14. FBasePrice: Double;
  15. FRiskRange: Double;
  16. FInfoPrice: Double;
  17. FInfoDate: string;
  18. public
  19. procedure SaveToXmlNode(AXmlNode: IXMLNode);
  20. procedure LoadFromXmlNode(AXmlNode: IXMLNode);
  21. end;
  22. TDetailGLNode = class
  23. private
  24. FGLID: Integer;
  25. FCode: string;
  26. FQuantity: Double;
  27. public
  28. procedure SaveToXmlNode(AXmlNode: IXMLNode);
  29. procedure LoadFromXmlNode(AXmlNode: IXMLNode);
  30. end;
  31. TDetailGL_Clipboard = class(TBaseClipboard)
  32. private
  33. FProjectGLData: TProjectGLData;
  34. FDetailGLData: TDetailGLData;
  35. FProjectGLs: TList;
  36. FDetailGls: TList;
  37. procedure SaveProjectGLsToXml(AXmlNode: IXMLNode);
  38. procedure SaveDetailGLsToXml(AXmlNode: IXMLNode);
  39. procedure CopyProjectGL(ARec: TProjectGLRecord);
  40. procedure CopyDetailGL(ARec: TDetailGLRecord);
  41. procedure CopyData(ABillsID: Integer);
  42. procedure LoadProjectGLsFromXml(AXmlNode: IXMLNode);
  43. procedure LoadDetailGLsFromXml(AXmlNode: IXMLNode);
  44. procedure Clear;
  45. protected
  46. procedure SaveXmlData(AXmlDoc: IXmlDocument); override;
  47. procedure LoadXmlData(AXmlDoc: IXmlDocument); override;
  48. public
  49. constructor Create(AProjectData: TObject);
  50. destructor Destroy; override;
  51. procedure Copy(ABillsID: Integer);
  52. //procedure Paste
  53. end;
  54. function HasDetailGLBlockFormat: Boolean;
  55. implementation
  56. uses
  57. ProjectData, sdDB;
  58. var
  59. CF_DetailGLBlock: Word;
  60. function HasDetailGLBlockFormat: Boolean;
  61. begin
  62. Result := HasClipboardFormat(CF_DetailGLBlock);
  63. end;
  64. { TDetailGLNode }
  65. procedure TDetailGLNode.LoadFromXmlNode(AXmlNode: IXMLNode);
  66. begin
  67. FGLID := AXmlNode.Attributes['GLID'];
  68. FCode := AXmlNode.Attributes['Code'];
  69. FQuantity := AXmlNode.Attributes['Quantity'];
  70. end;
  71. procedure TDetailGLNode.SaveToXmlNode(AXmlNode: IXMLNode);
  72. begin
  73. AXmlNode.Attributes['GLID'] := FGLID;
  74. AXmlNode.Attributes['Code'] := FCode;
  75. AXmlNode.Attributes['Quantity'] := FQuantity;
  76. end;
  77. { TProjectGLNode }
  78. procedure TProjectGLNode.LoadFromXmlNode(AXmlNode: IXMLNode);
  79. begin
  80. FID := AXmlNode.Attributes['ID'];
  81. FCode := AXmlNode.Attributes['Code'];
  82. FName := AXmlNode.Attributes['Name'];
  83. FUnits := AXmlNode.Attributes['Units'];
  84. FSpecs := AXmlNode.Attributes['Specs'];
  85. FBasePrice := AXmlNode.Attributes['BasePrice'];
  86. FRiskRange := AXmlNode.Attributes['RiskRange'];
  87. FInfoPrice := AXmlNode.Attributes['InfoPrice'];
  88. FInfoDate := AXmlNode.Attributes['InfoDate'];
  89. end;
  90. procedure TProjectGLNode.SaveToXmlNode(AXmlNode: IXMLNode);
  91. begin
  92. AXmlNode.Attributes['ID'] := FID;
  93. AXmlNode.Attributes['Code'] := FCode;
  94. AXmlNode.Attributes['Name'] := FName;
  95. AXmlNode.Attributes['Units'] := FUnits;
  96. AXmlNode.Attributes['Specs'] := FSpecs;
  97. AXmlNode.Attributes['BasePrice'] := FBasePrice;
  98. AXmlNode.Attributes['RiskRange'] := FRiskRange;
  99. AXmlNode.Attributes['InfoPrice'] := FInfoPrice;
  100. AXmlNode.Attributes['InfoDate'] := FInfoDate;
  101. end;
  102. { TDetailGL_Clipboard }
  103. procedure TDetailGL_Clipboard.Clear;
  104. begin
  105. ClearObjects(FDetailGls);
  106. ClearObjects(FProjectGLs);
  107. end;
  108. procedure TDetailGL_Clipboard.Copy(ABillsID: Integer);
  109. begin
  110. Clear;
  111. CopyData(ABillsID);
  112. SaveToStream;
  113. SaveToClipboard(CF_DetailGLBlock);
  114. end;
  115. procedure TDetailGL_Clipboard.CopyData(ABillsID: Integer);
  116. var
  117. vGLs: TList;
  118. iGL: Integer;
  119. Rec: TDetailGLRecord;
  120. begin
  121. vGLs := TList.Create;
  122. try
  123. FDetailGLData.LoadDetailGLs(ABillsID, vGLs);
  124. for iGL := 0 to vGLs.Count - 1 do
  125. begin
  126. Rec := TDetailGLRecord(vGLs.Items[iGL]);
  127. CopyDetailGL(Rec);
  128. end;
  129. finally
  130. vGLs.Free;
  131. end;
  132. end;
  133. procedure TDetailGL_Clipboard.CopyDetailGL(ARec: TDetailGLRecord);
  134. var
  135. DetailGL: TDetailGLNode;
  136. begin
  137. DetailGL := TDetailGLNode.Create;
  138. FDetailGls.Add(DetailGL);
  139. DetailGL.FGLID := ARec.GLID.AsInteger;
  140. DetailGL.FCode := ARec.Code.AsString;
  141. DetailGL.FQuantity := ARec.Quantity.AsFloat;
  142. CopyProjectGL(ARec.RelaProjectGL);
  143. end;
  144. procedure TDetailGL_Clipboard.CopyProjectGL(ARec: TProjectGLRecord);
  145. var
  146. ProjectGL: TProjectGLNode;
  147. begin
  148. ProjectGL := TProjectGLNode.Create;
  149. FProjectGLs.Add(ProjectGL);
  150. ProjectGL.FID := ARec.ID.AsInteger;
  151. ProjectGL.FCode := ARec.Code.AsString;
  152. ProjectGL.FName := ARec.Name.AsString;
  153. ProjectGL.FUnits := ARec.Units.AsString;
  154. ProjectGL.FSpecs := ARec.Specs.AsString;
  155. ProjectGL.FBasePrice := ARec.BasePrice.AsFloat;
  156. ProjectGL.FRiskRange := ARec.RiskRange.AsFloat;
  157. end;
  158. constructor TDetailGL_Clipboard.Create(AProjectData: TObject);
  159. begin
  160. inherited Create;
  161. FProjectGLs := TList.Create;
  162. FDetailGls := TList.Create;
  163. FProjectGLData := TProjectData(AProjectData).ProjectGLData;
  164. FDetailGLData := TProjectData(AProjectData).DetailGLData;
  165. end;
  166. destructor TDetailGL_Clipboard.Destroy;
  167. begin
  168. ClearObjects(FDetailGls);
  169. FDetailGls.Free;
  170. ClearObjects(FProjectGLs);
  171. FProjectGLs.Free;
  172. inherited;
  173. end;
  174. procedure TDetailGL_Clipboard.LoadDetailGLsFromXml(AXmlNode: IXMLNode);
  175. var
  176. Parent, Cur: IXMLNode;
  177. iGL: Integer;
  178. DetailGL: TDetailGLNode;
  179. begin
  180. Parent := AXmlNode.ChildNodes.FindNode('DetailGLs');
  181. for iGL := 0 to AXmlNode.ChildNodes.Count - 1 do
  182. begin
  183. Cur := AXmlNode.ChildNodes.FindNode('DetailGL');
  184. DetailGL := TDetailGLNode.Create;
  185. FDetailGls.Add(DetailGL);
  186. DetailGL.LoadFromXmlNode(Cur);
  187. end;
  188. end;
  189. procedure TDetailGL_Clipboard.LoadProjectGLsFromXml(AXmlNode: IXMLNode);
  190. var
  191. Parent, Cur: IXMLNode;
  192. iGL: Integer;
  193. ProjectGL: TProjectGLNode;
  194. begin
  195. Parent := AXmlNode.ChildNodes.FindNode('ProjectGLs');
  196. for iGL := 0 to AXmlNode.ChildNodes.Count - 1 do
  197. begin
  198. Cur := AXmlNode.ChildNodes.FindNode('ProjectGL');
  199. ProjectGL := TProjectGLNode.Create;
  200. FProjectGLs.Add(ProjectGL);
  201. ProjectGL.LoadFromXmlNode(Cur);
  202. end;
  203. end;
  204. procedure TDetailGL_Clipboard.LoadXmlData(AXmlDoc: IXmlDocument);
  205. begin
  206. inherited;
  207. LoadDetailGLsFromXml(AXmlDoc.DocumentElement);
  208. LoadProjectGLsFromXml(AXmlDoc.DocumentElement);
  209. end;
  210. procedure TDetailGL_Clipboard.SaveDetailGLsToXml(AXmlNode: IXMLNode);
  211. var
  212. Parent, Cur: IXMLNode;
  213. i: Integer;
  214. DetailGL: TDetailGLNode;
  215. begin
  216. Parent := AXmlNode.AddChild('DetailGLs');
  217. for i := 0 to FDetailGls.Count - 1 do
  218. begin
  219. DetailGL := TDetailGLNode(FDetailGls.Items[i]);
  220. Cur := Parent.AddChild('DetailGL');
  221. DetailGL.SaveToXmlNode(Cur);
  222. end;
  223. end;
  224. procedure TDetailGL_Clipboard.SaveProjectGLsToXml(AXmlNode: IXMLNode);
  225. var
  226. Parent, Cur: IXMLNode;
  227. i: Integer;
  228. ProjectGL: TProjectGLNode;
  229. begin
  230. Parent := AXmlNode.AddChild('ProjectGLs');
  231. for i := 0 to FProjectGLs.Count - 1 do
  232. begin
  233. ProjectGL := TProjectGLNode(FProjectGLs.Items[i]);
  234. Cur := Parent.AddChild('ProjectGL');
  235. ProjectGL.SaveToXmlNode(Cur);
  236. end;
  237. end;
  238. procedure TDetailGL_Clipboard.SaveXmlData(AXmlDoc: IXmlDocument);
  239. begin
  240. inherited;
  241. SaveProjectGLsToXml(AXmlDoc.DocumentElement);
  242. SaveDetailGLsToXml(AXmlDoc.DocumentElement);
  243. end;
  244. initialization
  245. CF_DetailGLBlock := RegisterClipboardFormat('Zh.M.DetailGL');
  246. end.