|
@@ -3,11 +3,9 @@ unit BillsClipboard;
|
|
|
interface
|
|
|
|
|
|
uses
|
|
|
- Clipbrd, Classes, BillsDm, ZhAPI, XmlDoc, XmlIntf, Windows, sdIDTree;
|
|
|
+ BaseClipboard, Classes, BillsDm, ZhAPI, XmlDoc, XmlIntf, Windows, sdIDTree;
|
|
|
|
|
|
type
|
|
|
- TInnerClipboard = class(TClipboard);
|
|
|
-
|
|
|
TBillsBlockNode = class
|
|
|
private
|
|
|
FID: Integer;
|
|
@@ -34,20 +32,11 @@ type
|
|
|
procedure LoadFromXmlNode(AXmlNode: IXMLNode);
|
|
|
end;
|
|
|
|
|
|
- TBillsClipboard = class
|
|
|
+ TBillsClipboard = class(TBaseClipboard)
|
|
|
private
|
|
|
- FStream: TMemoryStream;
|
|
|
FBillsData: TBillsData;
|
|
|
FNodeList: TList;
|
|
|
|
|
|
- procedure SaveToClipboard(AFormat: Word);
|
|
|
- procedure LoadFromClipboard(AFormat: Word);
|
|
|
-
|
|
|
- procedure SaveToStream;
|
|
|
- procedure LoadFromStream;
|
|
|
- procedure SaveToXmlFile(const AFileName: string);
|
|
|
- procedure LoadFromXmlFile(const AFileName: string);
|
|
|
-
|
|
|
procedure SaveNodesToXml(AXmlNode: IXMLNode);
|
|
|
procedure LoadNodesFromXml(AXmlNode: IXMLNode);
|
|
|
|
|
@@ -63,6 +52,9 @@ type
|
|
|
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;
|
|
@@ -81,10 +73,9 @@ uses sdDB, Math, SysUtils, UtilMethods;
|
|
|
var
|
|
|
CF_BillsBlock: Word;
|
|
|
|
|
|
-
|
|
|
function HasBillsBlockFormat: Boolean;
|
|
|
begin
|
|
|
- Result := Clipboard.HasFormat(CF_BillsBlock);
|
|
|
+ Result := HasClipboardFormat(CF_BillsBlock);
|
|
|
end;
|
|
|
|
|
|
{ TBillsClipboard }
|
|
@@ -168,7 +159,7 @@ end;
|
|
|
|
|
|
constructor TBillsClipboard.Create(ABillsData: TBillsData);
|
|
|
begin
|
|
|
- FStream := TMemoryStream.Create;
|
|
|
+ inherited Create;
|
|
|
FBillsData := ABillsData;
|
|
|
FNodeList := TList.Create;
|
|
|
end;
|
|
@@ -177,69 +168,9 @@ destructor TBillsClipboard.Destroy;
|
|
|
begin
|
|
|
ClearObjects(FNodeList);
|
|
|
FNodeList.Free;
|
|
|
- FStream.Free;
|
|
|
inherited;
|
|
|
end;
|
|
|
|
|
|
-procedure TBillsClipboard.LoadFromClipboard(AFormat: Word);
|
|
|
-
|
|
|
- procedure LockAndLoadData(AData: THandle);
|
|
|
- var
|
|
|
- DataPtr: Pointer;
|
|
|
- begin
|
|
|
- DataPtr := GlobalLock(AData);
|
|
|
- try
|
|
|
- FStream.WriteBuffer(DataPtr^, GlobalSize(AData));
|
|
|
- FStream.Position := 0;
|
|
|
- finally
|
|
|
- GlobalUnlock(AData);
|
|
|
- end;
|
|
|
- end;
|
|
|
-
|
|
|
-var
|
|
|
- Data: THandle;
|
|
|
-begin
|
|
|
- Clipboard.Open;
|
|
|
- try
|
|
|
- Data := GetClipboardData(AFormat);
|
|
|
- if Data <> 0 then
|
|
|
- LockAndLoadData(Data);
|
|
|
- finally
|
|
|
- Clipboard.Close;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TBillsClipboard.LoadFromStream;
|
|
|
-var
|
|
|
- FXmlDocument: IXMLDocument;
|
|
|
- I: Integer;
|
|
|
-begin
|
|
|
- FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
|
|
|
- try
|
|
|
- FXmlDocument.LoadFromStream(FStream);
|
|
|
- FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
|
|
|
- LoadNodesFromXml(FXmlDocument.DocumentElement);
|
|
|
- finally
|
|
|
- FXmlDocument := nil;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TBillsClipboard.LoadFromXmlFile(const AFileName: string);
|
|
|
-var
|
|
|
- FXmlDocument: IXMLDocument;
|
|
|
- I: Integer;
|
|
|
-begin
|
|
|
- FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
|
|
|
- try
|
|
|
- FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
|
|
|
- if not FileExists(AFileName) then Exit;
|
|
|
- FXmlDocument.LoadFromFile(AFileName);
|
|
|
- LoadNodesFromXml(FXmlDocument.DocumentElement);
|
|
|
- finally
|
|
|
- FXmlDocument := nil;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
procedure TBillsClipboard.LoadNodesFromXml(AXmlNode: IXMLNode);
|
|
|
var
|
|
|
BillsBlockNode: TBillsBlockNode;
|
|
@@ -256,6 +187,12 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+procedure TBillsClipboard.LoadXmlData(AXmlDoc: IXmlDocument);
|
|
|
+begin
|
|
|
+ inherited;
|
|
|
+ LoadNodesFromXml(AXmlDoc.DocumentElement);
|
|
|
+end;
|
|
|
+
|
|
|
procedure TBillsClipboard.Paste(ANode: TsdIDTreeNode; APos: Integer);
|
|
|
begin
|
|
|
Clear;
|
|
@@ -346,52 +283,10 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-procedure TBillsClipboard.SaveToClipboard(AFormat: Word);
|
|
|
-begin
|
|
|
- Clipboard.Open;
|
|
|
- try
|
|
|
- EmptyClipboard;
|
|
|
- FStream.Position := 0;
|
|
|
- TInnerClipboard(Clipboard).SetBuffer(AFormat, FStream.Memory^, FStream.Size);
|
|
|
- finally
|
|
|
- Clipboard.Close;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TBillsClipboard.SaveToStream;
|
|
|
-var
|
|
|
- FXmlDocument: IXMLDocument;
|
|
|
- I: Integer;
|
|
|
+procedure TBillsClipboard.SaveXmlData(AXmlDoc: IXmlDocument);
|
|
|
begin
|
|
|
- FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
|
|
|
- try
|
|
|
- FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
|
|
|
- FXmlDocument.Active := True;
|
|
|
- FXmlDocument.Encoding := 'GB2312';
|
|
|
- FXmlDocument.AddChild('BillsBlock_M');
|
|
|
- SaveNodesToXml(FXmlDocument.DocumentElement);
|
|
|
- FXmlDocument.SaveToStream(FStream);
|
|
|
- finally
|
|
|
- FXmlDocument := nil;
|
|
|
- end;
|
|
|
-end;
|
|
|
-
|
|
|
-procedure TBillsClipboard.SaveToXmlFile(const AFileName: string);
|
|
|
-var
|
|
|
- FXmlDocument: IXMLDocument;
|
|
|
- I: Integer;
|
|
|
-begin
|
|
|
- FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
|
|
|
- try
|
|
|
- FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
|
|
|
- FXmlDocument.Active := True;
|
|
|
- FXmlDocument.Encoding := 'GB2312';
|
|
|
- FXmlDocument.AddChild('BillsBlock_M');
|
|
|
- SaveNodesToXml(FXmlDocument.DocumentElement);
|
|
|
- FXmlDocument.SaveToFile(AFileName);
|
|
|
- finally
|
|
|
- FXmlDocument := nil;
|
|
|
- end;
|
|
|
+ SaveNodesToXml(AXmlDoc.DocumentElement);
|
|
|
+ inherited;
|
|
|
end;
|
|
|
|
|
|
{ TBillsBlockNode }
|