delphi – 如何将自定义格式剪贴板数据粘贴到TMemo中?

前端之家收集整理的这篇文章主要介绍了delphi – 如何将自定义格式剪贴板数据粘贴到TMemo中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题是指 this一个及其 accepted answer发布在stackoverflow上.

我对Windows API编程感到不舒服.

探索Topografix Topografix处理剪贴板操作的方式,我发现它使用名为GPX的自定义剪贴板格式,它实际上是纯XML文本(准确地说是GPX).使用Clipboard.AsText被排除在外.

我在这个阶段偶然发现:

  1. program ProbeClipboard;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,Windows,ClipBrd;
  7.  
  8. var
  9. CF_GPX: Cardinal;
  10. ClipboardData: THandle;
  11.  
  12. begin
  13. CF_GPX:=RegisterClipboardFormat('GPX');
  14.  
  15. if ClipBoard.HasFormat(CF_GPX) then
  16. begin
  17. Writeln('GPX format available in clipboard');
  18. //
  19. OpenClipboard(0);
  20.  
  21. ClipboardData := GetClipboardData(CF_GPX);
  22.  
  23. if ClipboardData = 0 then
  24. raise Exception.Create('Clipboard data Error');
  25.  
  26. /// How to use GlobalLock and GlobalUnLock
  27. /// so that I can paste the Clipboard data
  28. /// to a TMemo instance for example
  29.  
  30. CloseClipboard;
  31. end;
  32. end.

请帮我解决这个问题.

解决方法

我这样写的:
  1. program ProbeClipboard;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,ClipBrd;
  7.  
  8. var
  9. CF_GPX: Cardinal;
  10. ClipboardData: Windows.HGLOBAL;
  11. Ptr: Pointer;
  12. Size: DWORD;
  13.  
  14. begin
  15. CF_GPX := RegisterClipboardFormat('GPX');
  16.  
  17. Clipboard.Open;
  18. try
  19. if Clipboard.HasFormat(CF_GPX) then
  20. begin
  21. Writeln('GPX format available in clipboard');
  22.  
  23. ClipboardData := Clipboard.GetAsHandle(CF_GPX);
  24. if ClipboardData=0 then
  25. RaiseLastOSError;
  26.  
  27. Ptr := Windows.GlobalLock(ClipboardData);
  28. if Ptr=nil then
  29. RaiseLastOSError;
  30.  
  31. try
  32. Size := Windows.GlobalSize(ClipboardData);
  33.  
  34. //Ptr now points to a memory block of Size bytes
  35. //containing the clipboard data
  36. finally
  37. Windows.GlobalUnlock(ClipboardData);
  38. end;
  39. end;
  40. finally
  41. Clipboard.Close;
  42. end;
  43. end.

请注意,我移动了剪贴板“打开”命令,该命令将剪贴板锁定在CF_GPX格式的测试之外.这是为了避免代码中存在竞争条件.在您的代码中,可以在HasFormat调用和OpenClipboard调用之间修改剪贴板.

我还专门使用了Clipboard类.这个类有你需要的所有,你不需要使用原始的Win32剪贴板API.

我甚至把错误检查!

猜你在找的Delphi相关文章