Browse Source

复制整块粘贴板优化

MaiXinRong 9 years ago
parent
commit
561b28e9fa
2 changed files with 175 additions and 121 deletions
  1. 159 0
      Units/BaseClipboard.pas
  2. 16 121
      Units/BillsClipboard.pas

+ 159 - 0
Units/BaseClipboard.pas

@@ -0,0 +1,159 @@
+unit BaseClipboard;
+
+interface
+
+uses
+  Clipbrd, Classes, Windows, XmlDoc, XmlIntf, SysUtils;
+
+type
+  TInnerClipboard = class(TClipboard);
+
+  TBaseClipboard = class
+  private
+    FStream: TMemoryStream;
+  protected
+    procedure LoadXmlData(AXmlDoc: IXMLDocument); virtual; abstract;
+    procedure SaveXmlData(AXmlDoc: IXMLDocument); virtual; abstract;
+
+    procedure SaveToClipboard(AFormat: Word);
+    procedure LoadFromClipboard(AFormat: Word);
+
+    procedure SaveToStream;
+    procedure LoadFromStream;
+    procedure SaveToXmlFile(const AFileName: string);
+    procedure LoadFromXmlFile(const AFileName: string);
+  public
+    constructor Create;
+    destructor Destroy; override;
+  end;
+
+function HasClipboardFormat(AFormat: Word): Boolean;
+
+implementation
+
+function HasClipboardFormat(AFormat: Word): Boolean;
+begin
+  Result := Clipboard.HasFormat(AFormat);  
+end;
+
+{ TBaseClipboard }
+
+constructor TBaseClipboard.Create;
+begin
+  FStream := TMemoryStream.Create;
+end;
+
+destructor TBaseClipboard.Destroy;
+begin
+  FStream.Free;
+  inherited;
+end;
+
+procedure TBaseClipboard.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 TBaseClipboard.LoadFromStream;
+var
+  FXmlDocument: IXMLDocument;
+  I: Integer;
+begin
+  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
+  try
+    FXmlDocument.LoadFromStream(FStream);
+    FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
+    LoadXmlData(FXmlDocument);
+  finally
+    FXmlDocument := nil;
+  end;
+end;
+
+procedure TBaseClipboard.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);
+    LoadXmlData(FXmlDocument);
+  finally
+    FXmlDocument := nil;
+  end;
+end;
+
+procedure TBaseClipboard.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 TBaseClipboard.SaveToStream;
+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');
+    SaveXmlData(FXmlDocument);
+    FXmlDocument.SaveToStream(FStream);
+  finally
+    FXmlDocument := nil;
+  end;
+end;
+
+procedure TBaseClipboard.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');
+    SaveXmlData(FXmlDocument);
+    FXmlDocument.SaveToFile(AFileName);
+  finally
+    FXmlDocument := nil;
+  end;
+end;
+
+end.

+ 16 - 121
Units/BillsClipboard.pas

@@ -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 }