123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- unit BillsClipboard;
- interface
- uses
- BaseClipboard, Classes, BillsDm, ZhAPI, XmlDoc, XmlIntf, Windows, sdIDTree;
- type
- TBillsBlockNode = class
- private
- FID: Integer;
- FParentID: Integer;
- FNextSiblingID: Integer;
- FCode: string;
- FB_Code: string;
- FName: string;
- FUnits: string;
- FPrice: Double;
- FOrgQuantity: Double;
- FOrgTotalPrice: Double;
- FMisQuantity: Double;
- FMisTotalPrice: Double;
- FOthQuantity: Double;
- FOthTotalPrice: Double;
- FQuantity: Double;
- FTotalPrice: Double;
- FCalcType: Integer;
- FDrawingCode: string;
- FAlias: string;
- FDgnQuantity1: Double;
- FDgnQuantity2: Double;
- FMemoStr: string;
- FDealCode: string;
- FDealCompany: string;
- public
- procedure SaveToXmlNode(AXmlNode: IXMLNode);
- procedure LoadFromXmlNode(AXmlNode: IXMLNode);
- end;
- TBillsClipboard = class(TBaseClipboard)
- private
- FBillsData: TBillsData;
- FNodeList: TList;
- procedure SaveNodesToXml(AXmlNode: IXMLNode);
- procedure LoadNodesFromXml(AXmlNode: IXMLNode);
- procedure CopyBillsNodeData(ANode: TsdIDTreeNode);
- procedure CopyBillsNode(ANode: TsdIDTreeNode);
- procedure CopyData(ANode: TsdIDTreeNode; ACount: Integer);
- function AddBillsNode(ANode: TsdIDTreeNode; APos: Integer): TsdIDTreeNode;
- procedure PasteBillsNodeData(ANode: TsdIDTreeNode; APasteNode: TBillsBlockNode);
- procedure PasteChildren(AParentNode: TsdIDTreeNode; APasteParentID: Integer);
- procedure PasteNextSibling(APreSibling: TsdIDTreeNode; APasteNodeID: Integer);
- procedure PasteBillsNode(ANode: TsdIDTreeNode; APos: Integer; APasteNode: TBillsBlockNode);
- procedure PasteData(ANode: TsdIDTreeNode; APos: Integer);
- procedure Clear;
- protected
- procedure LoadXmlData(AXmlDoc: IXmlDocument); override;
- procedure SaveXmlData(AXmlDoc: IXmlDocument); override;
- public
- constructor Create(ABillsData: TBillsData);
- destructor Destroy; override;
- procedure Copy(ANode: TsdIDTreeNode; ACount: Integer);
- // APos: 0[×ÓÏî] 1[ºóÏî] 2[ǰÏî]
- procedure Paste(ANode: TsdIDTreeNode; APos: Integer);
- end;
- function HasBillsBlockFormat: Boolean;
- implementation
- uses sdDB, Math, SysUtils, UtilMethods;
- var
- CF_BillsBlock: Word;
- function HasBillsBlockFormat: Boolean;
- begin
- Result := HasClipboardFormat(CF_BillsBlock);
- end;
- { TBillsClipboard }
- function TBillsClipboard.AddBillsNode(ANode: TsdIDTreeNode;
- APos: Integer): TsdIDTreeNode;
- begin
- // ×ÓÏî²åÈë
- if APos = 0 then
- Result := ANode.Owner.Add(ANode.ID, -1)
- // ºóÏî²åÈë
- else if APos = 1 then
- Result := ANode.Owner.Add(ANode.ParentID, ANode.NextSiblingID)
- // ǰÏî²åÈë
- else if APos = 2 then
- Result := ANode.Owner.Add(ANode.ParentID, ANode.ID);
- end;
- procedure TBillsClipboard.Clear;
- begin
- ClearObjects(FNodeList);
- FNodeList.Clear;
- end;
- procedure TBillsClipboard.Copy(ANode: TsdIDTreeNode; ACount: Integer);
- begin
- Clear;
- CopyData(ANode, ACount);
- SaveToStream;
- SaveToClipboard(CF_BillsBlock);
- end;
- procedure TBillsClipboard.CopyBillsNode(ANode: TsdIDTreeNode);
- var
- iChild: Integer;
- begin
- if Assigned(ANode) then
- begin
- CopyBillsNodeData(ANode);
- for iChild := 0 to ANode.ChildCount - 1 do
- CopyBillsNode(ANode.ChildNodes[iChild]);
- end;
- end;
- procedure TBillsClipboard.CopyBillsNodeData(ANode: TsdIDTreeNode);
- var
- vNode: TBillsBlockNode;
- begin
- vNode := TBillsBlockNode.Create;
- FNodeList.Add(vNode);
- vNode.FID := ANode.Rec.ValueByName('ID').AsInteger;
- vNode.FParentID := ANode.Rec.ValueByName('ParentID').AsInteger;
- vNode.FNextSiblingID := ANode.Rec.ValueByName('NextSiblingID').AsInteger;
- vNode.FCode := ANode.Rec.ValueByName('Code').AsString;
- vNode.FB_Code := ANode.Rec.ValueByName('B_Code').AsString;
- vNode.FName := ANode.Rec.ValueByName('Name').AsString;
- vNode.FUnits := ANode.Rec.ValueByName('Units').AsString;
- vNode.FPrice := ANode.Rec.ValueByName('Price').AsFloat;
- vNode.FOrgQuantity := ANode.Rec.ValueByName('OrgQuantity').AsFloat;
- vNode.FOrgTotalPrice := ANode.Rec.ValueByName('OrgTotalPrice').AsFloat;
- vNode.FMisQuantity := ANode.Rec.ValueByName('MisQuantity').AsFloat;
- vNode.FMisTotalPrice := ANode.Rec.ValueByName('MisTotalPrice').AsFloat;
- vNode.FOthQuantity := ANode.Rec.ValueByName('OthQuantity').AsFloat;
- vNode.FOthTotalPrice := ANode.Rec.ValueByName('OthTotalPrice').AsFloat;
- vNode.FQuantity := ANode.Rec.ValueByName('Quantity').AsFloat;
- vNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
- vNode.FCalcType := ANode.Rec.ValueByName('CalcType').AsInteger;
- vNode.FDrawingCode := ANode.Rec.ValueByName('DrawingCode').AsString;
- vNode.FAlias := ANode.Rec.ValueByName('Alias').AsString;
- vNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
- vNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
- vNode.FMemoStr := ANode.Rec.ValueByName('MemoStr').AsString;
- vNode.FDealCode := ANode.Rec.ValueByName('DealCode').AsString;
- vNode.FDealCompany := ANode.Rec.ValueByName('DealCompany').AsString;
- end;
- procedure TBillsClipboard.CopyData(ANode: TsdIDTreeNode; ACount: Integer);
- begin
- while Assigned(ANode) and (ACount > 0) do
- begin
- CopyBillsNode(ANode);
- Dec(ACount, ANode.PosterityCount + 1);
- ANode := ANode.NextSibling;
- end;
- end;
- constructor TBillsClipboard.Create(ABillsData: TBillsData);
- begin
- inherited Create;
- FBillsData := ABillsData;
- FNodeList := TList.Create;
- end;
- destructor TBillsClipboard.Destroy;
- begin
- ClearObjects(FNodeList);
- FNodeList.Free;
- inherited;
- end;
- procedure TBillsClipboard.LoadNodesFromXml(AXmlNode: IXMLNode);
- var
- BillsBlockNode: TBillsBlockNode;
- iNum: Integer;
- ParentXmlNode, CurXmlNode: IXMLNode;
- begin
- ParentXmlNode := AXmlNode.ChildNodes.FindNode('BillsBlockNodes');
- for iNum := 0 to ParentXmlNode.ChildNodes.Count - 1 do
- begin
- CurXmlNode := ParentXmlNode.ChildNodes.Nodes[iNum];
- BillsBlockNode := TBillsBlockNode.Create;
- FNodeList.Add(BillsBlockNode);
- BillsBlockNode.LoadFromXmlNode(CurXmlNode);
- end;
- end;
- procedure TBillsClipboard.LoadXmlData(AXmlDoc: IXmlDocument);
- begin
- inherited;
- LoadNodesFromXml(AXmlDoc.DocumentElement);
- end;
- procedure TBillsClipboard.Paste(ANode: TsdIDTreeNode; APos: Integer);
- begin
- Clear;
- LoadFromClipboard(CF_BillsBlock);
- LoadFromStream;
- PasteData(ANode, APos);
- end;
- procedure TBillsClipboard.PasteBillsNode(ANode: TsdIDTreeNode;
- APos: Integer; APasteNode: TBillsBlockNode);
- var
- stnCurrent: TsdIDTreeNode;
- begin
- stnCurrent := AddBillsNode(ANode, APos);
- PasteBillsNodeData(stnCurrent, APasteNode);
- PasteChildren(stnCurrent, APasteNode.FID);
- PasteNextSibling(stnCurrent, APasteNode.FNextSiblingID);
- end;
- procedure TBillsClipboard.PasteBillsNodeData(ANode: TsdIDTreeNode;
- APasteNode: TBillsBlockNode);
- begin
- ANode.Rec.ValueByName('Code').AsString := APasteNode.FCode;
- ANode.Rec.ValueByName('B_Code').AsString := APasteNode.FB_Code;
- ANode.Rec.ValueByName('Name').AsString := APasteNode.FName;
- ANode.Rec.ValueByName('Units').AsString := APasteNode.FUnits;
- ANode.Rec.ValueByName('Price').AsFloat := APasteNode.FPrice;
- ANode.Rec.ValueByName('OrgQuantity').AsFloat := QuantityRoundTo(APasteNode.FOrgQuantity);
- ANode.Rec.ValueByName('OrgTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOrgTotalPrice);
- ANode.Rec.ValueByName('MisQuantity').AsFloat := QuantityRoundTo(APasteNode.FMisQuantity);
- ANode.Rec.ValueByName('MisTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FMisTotalPrice);
- ANode.Rec.ValueByName('OthQuantity').AsFloat := QuantityRoundTo(APasteNode.FOthQuantity);
- ANode.Rec.ValueByName('OthTotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FOthTotalPrice);
- ANode.Rec.ValueByName('Quantity').AsFloat := QuantityRoundTo(APasteNode.FQuantity);
- ANode.Rec.ValueByName('TotalPrice').AsFloat := TotalPriceRoundTo(APasteNode.FTotalPrice);
- ANode.Rec.ValueByName('CalcType').AsInteger := APasteNode.FCalcType;
- ANode.Rec.ValueByName('DrawingCode').AsString := APasteNode.FDrawingCode;
- ANode.Rec.ValueByName('Alias').AsString := APasteNode.FAlias;
- ANode.Rec.ValueByName('DgnQuantity1').AsFloat := QuantityRoundTo(APasteNode.FDgnQuantity1);
- ANode.Rec.ValueByName('DgnQuantity2').AsFloat := QuantityRoundTo(APasteNode.FDgnQuantity2);
- ANode.Rec.ValueByName('MemoStr').AsString := APasteNode.FMemoStr;
- ANode.Rec.ValueByName('DealCode').AsString := APasteNode.FDealCode;
- ANode.Rec.ValueByName('DealCompany').AsString := APasteNode.FDealCompany;
- end;
- procedure TBillsClipboard.PasteChildren(AParentNode: TsdIDTreeNode;
- APasteParentID: Integer);
- var
- iNode: Integer;
- begin
- for iNode := 0 to FNodeList.Count - 1 do
- if TBillsBlockNode(FNodeList.Items[iNode]).FParentID = APasteParentID then
- begin
- PasteBillsNode(AParentNode, 0, TBillsBlockNode(FNodeList.Items[iNode]));
- Break;
- end;
- end;
- procedure TBillsClipboard.PasteData(ANode: TsdIDTreeNode; APos: Integer);
- var
- I: Integer;
- vPasteNode: TBillsBlockNode;
- begin
- PasteBillsNode(ANode, APos, TBillsBlockNode(FNodeList.First));
- end;
- procedure TBillsClipboard.PasteNextSibling(APreSibling: TsdIDTreeNode;
- APasteNodeID: Integer);
- var
- iNode: Integer;
- begin
- if APasteNodeID = -1 then Exit;
- for iNode := 0 to FNodeList.Count - 1 do
- if TBillsBlockNode(FNodeList.Items[iNode]).FID = APasteNodeID then
- begin
- PasteBillsNode(APreSibling, 1, TBillsBlockNode(FNodeList.Items[iNode]));
- Break;
- end;
- end;
- procedure TBillsClipboard.SaveNodesToXml(AXmlNode: IXMLNode);
- var
- ParentXmlNode, CurXmlNode: IXMLNode;
- iNum: Integer;
- BillsBlockNode: TBillsBlockNode;
- begin
- ParentXmlNode := AXmlNode.AddChild('BillsBlockNodes');
- for iNum := 0 to FNodeList.Count - 1 do
- begin
- BillsBlockNode := TBillsBlockNode(FNodeList.Items[iNum]);
- CurXmlNode := ParentXmlNode.AddChild('BillsBlockNode');
- BillsBlockNode.SaveToXmlNode(CurXmlNode);
- end;
- end;
- procedure TBillsClipboard.SaveXmlData(AXmlDoc: IXmlDocument);
- begin
- SaveNodesToXml(AXmlDoc.DocumentElement);
- inherited;
- end;
- { TBillsBlockNode }
- procedure TBillsBlockNode.LoadFromXmlNode(AXmlNode: IXMLNode);
- begin
- FID := AXmlNode.Attributes['ID'];
- FParentID := AXmlNode.Attributes['ParentID'];
- FNextSiblingID := AXmlNode.Attributes['NextSiblingID'];
- FCode := AXmlNode.Attributes['Code'];
- FB_Code := AXmlNode.Attributes['B_Code'];
- FName := AXmlNode.Attributes['Name'];
- FUnits := AXmlNode.Attributes['Units'];
- FPrice := AXmlNode.Attributes['Price'];
- FOrgQuantity := AXmlNode.Attributes['OrgQuantity'];
- FOrgTotalPrice := AXmlNode.Attributes['OrgTotalPrice'];
- FMisQuantity := AXmlNode.Attributes['MisQuantity'];
- FMisTotalPrice := AXmlNode.Attributes['MisTotalPrice'];
- FOthQuantity := AXmlNode.Attributes['OthQuantity'];
- FOthTotalPrice := AXmlNode.Attributes['OthTotalPrice'];
- FQuantity := AXmlNode.Attributes['Quantity'];
- FTotalPrice := AXmlNode.Attributes['TotalPrice'];
- FCalcType := AXmlNode.Attributes['CalcType'];
- FDrawingCode := AXmlNode.Attributes['DrawingCode'];
- FAlias := AXmlNode.Attributes['Alias'];
- FDgnQuantity1 := AXmlNode.Attributes['DgnQuantity1'];
- FDgnQuantity2 := AXmlNode.Attributes['DgnQuantity2'];
- FMemoStr := AXmlNode.Attributes['MemoStr'];
- FDealCode := AXmlNode.Attributes['DealCode'];
- FDealCompany := AXmlNode.Attributes['DealCompany'];
- end;
- procedure TBillsBlockNode.SaveToXmlNode(AXmlNode: IXMLNode);
- begin
- AXmlNode.Attributes['ID'] := FID;
- AXmlNode.Attributes['ParentID'] := FParentID;
- AXmlNode.Attributes['NextSiblingID'] := FNextSiblingID;
- AXmlNode.Attributes['Code'] := FCode;
- AXmlNode.Attributes['B_Code'] := FB_Code;
- AXmlNode.Attributes['Name'] := FName;
- AXmlNode.Attributes['Units'] := FUnits;
- AXmlNode.Attributes['Price'] := FPrice;
- AXmlNode.Attributes['OrgQuantity'] := FOrgQuantity;
- AXmlNode.Attributes['OrgTotalPrice'] := FOrgTotalPrice;
- AXmlNode.Attributes['MisQuantity'] := FMisQuantity;
- AXmlNode.Attributes['MisTotalPrice'] := FMisTotalPrice;
- AXmlNode.Attributes['OthQuantity'] := FOthQuantity;
- AXmlNode.Attributes['OthTotalPrice'] := FOthTotalPrice;
- AXmlNode.Attributes['Quantity'] := FQuantity;
- AXmlNode.Attributes['TotalPrice'] := FTotalPrice;
- AXmlNode.Attributes['CalcType'] := FCalcType;
- AXmlNode.Attributes['DrawingCode'] := FDrawingCode;
- AXmlNode.Attributes['Alias'] := FAlias;
- AXmlNode.Attributes['DgnQuantity1'] := FDgnQuantity1;
- AXmlNode.Attributes['DgnQuantity2'] := FDgnQuantity2;
- AXmlNode.Attributes['MemoStr'] := FMemoStr;
- AXmlNode.Attributes['DealCode'] := FDealCode;
- AXmlNode.Attributes['DealCompany'] := FDealCompany;
- end;
- initialization
- CF_BillsBlock := RegisterClipboardFormat('Zh.BillsBlock');
- end.
|