当前位置:主页>Delphi教程>文章内容
剪贴板的流存储
来源: 作者: 发布时间:2007-04-29  
(*//
标题:剪贴板的流存储
说明:如果你想借用剪贴板,有这套函数就方便了
设计:Zswang
日期:2003-11-14
支持:wjhu111@21cn.com
//*)
///////Begin Source
uses Clipbrd;
type
  TDataIdnet = array[0..2] of Char;
  TClipboardFileHead = packed record
    rIdent: TDataIdnet;
    rCount: Word;
  end;
  TClipboardFileItem = packed record
    rFormat: Word;
    rSize: Longword;
    rData: Pointer;
  end;
const rDataIdnet: TDataIdnet = 'cbf';
function ClipboardSaveToStream(mStream: TStream): Boolean;
var
  vClipboardFileHead: TClipboardFileHead;
  vClipboardFileItem: TClipboardFileItem;
  I: Integer;
  vData: THandle;
begin
  Result := False;
  if not Assigned(mStream) then Exit;
  vClipboardFileHead.rIdent := rDataIdnet;
  vClipboardFileHead.rCount := Clipboard.FormatCount;
  mStream.Write(vClipboardFileHead, SizeOf(vClipboardFileHead));
  try
    Clipboard.Open;
    for I := 0 to Clipboard.FormatCount - 1 do begin
      vData := GetClipboardData(Clipboard.Formats[I]);
      vClipboardFileItem.rFormat := Clipboard.Formats[I];
      vClipboardFileItem.rSize := GlobalSize(vData);
      vClipboardFileItem.rData := GlobalLock(vData);
      try
        mStream.Write(vClipboardFileItem, SizeOf(vClipboardFileItem) -
          SizeOf(vClipboardFileItem.rData));
        mStream.Write(vClipboardFileItem.rData^, vClipboardFileItem.rSize);
      finally
        GlobalUnlock(vData);
      end;
    end;
  finally
    Clipboard.Close;
  end;
  Result := True;
end; { ClipboardSaveToStream }
function ClipboardLoadFromStream(mStream: TStream): Boolean;
var
  vClipboardFileHead: TClipboardFileHead;
  vClipboardFileItem: TClipboardFileItem;
  I: Integer;
  vData: THandle;
begin
  Result := False;
  if not Assigned(mStream) then Exit;
  if mStream.Size <= SizeOf(vClipboardFileHead) then Exit;
  mStream.Read(vClipboardFileHead, SizeOf(vClipboardFileHead));
  if vClipboardFileHead.rIdent <> rDataIdnet then Exit;
  Clipboard.Clear;
  Clipboard.Open;
  try
    for I := 0 to vClipboardFileHead.rCount - 1 do begin
      mStream.Read(vClipboardFileItem, SizeOf(vClipboardFileItem) -
        SizeOf(vClipboardFileItem.rData));
      vData := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE,
        vClipboardFileItem.rSize);
      try
        vClipboardFileItem.rData := GlobalLock(vData);
        try
          mStream.Read(vClipboardFileItem.rData^, vClipboardFileItem.rSize);
          SetClipboardData(vClipboardFileItem.rFormat, vData);
        finally
          GlobalUnlock(vData);
        end;
      finally
        GlobalFree(vData);
      end;
    end;
  finally
    Clipboard.Close;
  end;
  Result := True;
end; { ClipboardLoadFromStream }
///////End Source
///////Begin Demo
procedure TFormClipboard.ButtonSaveClick(Sender: TObject);
var
  vMemoryStream: TMemoryStream;
begin
  if not SaveDialog1.Execute then Exit;
  if FileExists(SaveDialog1.FileName) and
    (MessageDlg(Format('是否覆盖文件 "%s"?', [SaveDialog1.FileName]),
    mtWarning, [mbYes, mbNo], 0) <> mrYes) then Exit;
  vMemoryStream := TMemoryStream.Create;
  try
    ClipboardSaveToStream(vMemoryStream);
    vMemoryStream.SaveToFile(SaveDialog1.FileName);
  finally
    vMemoryStream.Free;
  end;
end;
procedure TFormClipboard.ButtonLoadClick(Sender: TObject);
var
  vMemoryStream: TMemoryStream;
begin
  if not OpenDialog1.Execute then Exit;
  if not FileExists(OpenDialog1.FileName) then Exit;
  vMemoryStream := TMemoryStream.Create;
  try
    vMemoryStream.LoadFromFile(OpenDialog1.FileName);
    ClipboardLoadFromStream(vMemoryStream);
  finally
    vMemoryStream.Free;
  end;
end;
///////End Demo

 
上一篇:流的压缩和解压   下一篇:用Delphi制作DLL小结
 
  相关文章
·流的压缩和解压
·用Delphi制作DLL小结
·搜索字符串在流中的位置
·使用ACTIVEX和DELPHI开发串口通讯
·使用IntraWeb进行Web编程
·获取其他进程中ListView的文本
·取得图片的透明区域
·使用IntraWeb进行Web编程(二)
·GSM规范中的部分编码转换
·设置ListView的页眉图标
·通用查询组件设计(续二)
·获取其他程序中TreeView的内容
 
【关闭窗口】
推荐本站资源
最新文章