| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | unit BaseClipboard;interfaceuses  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;implementationfunction 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.
 |