复制和粘贴文本很简单,因为它内置于TMemo中,但它似乎只能处理文本。但在我看来,任何类型的数据都可以表示为字符串。如果我从另一个程序中复制一些任意数据并想将它粘贴到TMemo中,我如何让Delphi接受它作为原始字符串?
答案 0 :(得分:6)
“如果我从另一个程序中复制一些任意数据并希望将其粘贴到TMemo中,我如何让Delphi接受它作为原始字符串?”所以为了澄清你的问题,你:
这是对的吗?如果是这样,您就无法使用Clipboard.AsText
- 只有在剪贴板上有CF_TEXT
格式的数据时才返回文本。您需要直接使用剪贴板API。剪贴板保存带有格式代码的数据,您可以获得指向该数据的指针和大小,并将其视为字符串或您想要的。
所以:
EnumClipboardFormats
遍历剪贴板上当前的所有格式,或者使用其中一个预定义常量(用于文本,图像,音频等)。剪贴板可以同时保存多种格式的数据,因此您可能需要选择你使用的许多。try/finally
中并关闭finally
子句中的剪贴板。如果您没有关闭剪贴板,则其他任何应用程序都无法使用它,因此即使您的应用程序崩溃,也希望它关闭。GetClipboardData
以获取该格式数据的句柄。通过GlobalAlloc
分配(或给予,如果您以后实施Copy)的数据,因此您需要锁定句柄以通过GlobalLock
获取指向它的指针(一旦完成,使用{{解锁) 3}}。)数据由剪贴板拥有,所以在你使用它之后不要释放它。要以字节为单位查找此数据的大小,请使用GlobalUnlock
。您的代码应该知道数据具有一定的大小,并且可能不会以空值终止(或者可能在其中有空值),因此在转换为字符串时,请确保不要超出缓冲区。您可以对其进行编码以避免NULL
等。如果您想要更多关于此类内容的详细信息,可能值得提出另一个问题(或搜索将任意数据编码为字符串。)最简单的方法是复制将数据放入大小为+ 1的缓冲区,将最后一个字节设置为空,遍历除最后一个字节之外的每个字节,对于不可打印的字符(字节值<32),将其更改为“。”或其他一些角色。然后将指向此缓冲区的指针传递给AnsiString
的构造函数,强制转换为PAnsiChar
。 (这可以确保您的数据被视为一串字节大小的字符 - 如果您使用D2009 +,请记住这一点,因为本机字符串类型是Unicode。)要使用的替代字符串类型是RawByteString
。获得字符串后,将其添加到备忘录中。
GlobalSize
有一个很好的例子(在C中,对不起)。您可以将其作为起点,添加您自己的数据自定义处理。粘贴为字符串可能不是查看任意二进制数据的最佳方式 - 您可以使用十六进制编辑器组件或其他可视化工具来更好地查看数据。
答案 1 :(得分:2)
答案 2 :(得分:1)
您是否尝试在tmemo和“其他程序”之间使用clipboard.as文本
答案 3 :(得分:0)
我不确定你的陈述“任何类型的数据都可以表示为字符串”是有意义的。二进制数据可能具有嵌入的空值,这会干扰将数据视为字符串。例如,位图图像的字符串表示的值是什么?
由应用程序设置剪贴板以确定剪贴板信息的格式。如果应用程序足够周到以提供非文本信息的文本表示(例如,图像的文件名,如果有的话),那么您可以使用该字符串信息。否则,不清楚将信息粘贴到TMemo中甚至是什么意思。