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

时间:2009-11-14 00:45:13

标签: delphi copy-paste tmemo

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

4 个答案:

答案 0 :(得分:6)

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

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

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

所以:

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

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

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

答案 1 :(得分:2)

梅森我不确定我理解你的答案,但是你可以使用Clipboard.AsText像avar所说的只是将clipbrd添加到uses子句。 请注意,如果你的字符串中有一个空字符,那么KAZAM你的字符串将从开头粘贴到空字符#0。另一种方法是使用内存映射文件或消息在应用程序之间发送数据。

答案 2 :(得分:1)

您是否尝试在tmemo和“其他程序”之间使用clipboard.as文本

答案 3 :(得分:0)

我不确定你的陈述“任何类型的数据都可以表示为字符串”是有意义的。二进制数据可能具有嵌入的空值,这会干扰将数据视为字符串。例如,位图图像的字符串表示的值是什么?

由应用程序设置剪贴板以确定剪贴板信息的格式。如果应用程序足够周到以提供非文本信息的文本表示(例如,图像的文件名,如果有的话),那么您可以使用该字符串信息。否则,不清楚将信息粘贴到TMemo中甚至是什么意思。