如何将任意数据粘贴到TMemo中?

Mas*_*ler 2 delphi copy-paste tmemo

复制和粘贴文本很容易,因为它内置于TMemo中,但它似乎只能处理文本.但在我看来,任何类型的数据都可以表示为字符串.如果我从另一个程序中复制一些任意数据并想将其粘贴到TMemo中,我如何让Delphi接受它作为原始字符串?

Dav*_*vid 6

"如果我从另一个程序中复制一些任意数据并希望将其粘贴到TMemo中,我如何让Delphi接受它作为原始字符串?" 所以为了澄清你的问题,你:

  • 想要使用任何其他应用程序(一个没有代码的应用程序,一个普通的应用程序)并在其中复制一些东西
  • 想要将这些复制的数据(包括非文本格式)粘贴为备忘录中的文本.

那是对的吗?如果是这样,你就不能使用Clipboard.AsText- 只有CF_TEXT在剪贴板上有格式的数据时才返回文本.您需要直接使用剪贴板API.剪贴板使用格式代码保存数据,您可以获得指向该数据的指针和大小,并将其视为字符串或您想要的.

所以:

  • 找出要粘贴的格式.您可以遍历剪贴板上当前所有格式EnumClipboardFormats,或者使用其中一个预定义常量(用于文本,图像,音频等).剪贴板可以同时保存多种格式的数据,因此您可能希望选择多个格式中的哪一种你用.
  • 如果此格式的数据在剪贴板上,请将其打开.确保将此代码包装在a中try/finally并关闭finally子句中的剪贴板.如果您没有关闭剪贴板,则其他任何应用程序都无法使用它,因此即使您的应用程序崩溃,也希望它关闭.
  • 调用GetClipboardData以获取该格式的数据句柄.关于(或给予,如果你以后实现Copy)的数据是通过分配的GlobalAlloc,所以你需要锁定句柄以获得指向它的指针GlobalLock(一旦完成,解锁就可以了GlobalUnlock.)数据由剪贴板拥有所以不要在你使用它之后释放它.要以字节为单位查找此数据的大小,请使用GlobalSize.
  • 这为您提供了指向已知大小的数据的指针.此时,您可以随心所欲地做任何事情.将其作为字符串处理是一种选择.由于您的应用不拥有数据,您应该复制它,而不是直接操作它.

您的代码应该知道数据具有一定的大小,并且可能不会以空终止(或者可能在其中包含空值),因此在转换为字符串时,请确保不要超出缓冲区.您可以对其进行编码以避免NULLs等.如果您想要更多关于此类内容的详细信息,则可能值得提出另一个问题(或搜索将任意数据编码为字符串.)最简单的方法是将数据复制到大小+ 1个缓冲区,将最后一个字节设置为null,遍历除最后一个字节之外的每个字节,对于不可打印的字符(字节值<32),将其更改为"." 或其他一些角色.然后将指向此缓冲区的指针传递给AnsiString构造函数,强制转换为PAnsiChar.(这可确保您的数据被视为一串字节大小的字符 - 如果您使用D2009 +,请记住这一点,因为本机字符串类型是Unicode.)要使用的替代字符串类型是RawByteString.获得字符串后,将其添加到备忘录中.

在MSDN粘贴特定格式的数据有一个很好的例子(在C中,抱歉).您可以将其作为起点,添加您自己的数据自定义处理.粘贴为字符串可能不是查看任意二进制数据的最佳方式 - 您可以使用十六进制编辑器组件或其他一些可视化工具来更好地查看数据.