Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何将任意数据粘贴到TMemo中?_Delphi_Copy Paste_Tmemo - Fatal编程技术网

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

Delphi 如何将任意数据粘贴到TMemo中?,delphi,copy-paste,tmemo,Delphi,Copy Paste,Tmemo,复制和粘贴文本很容易,因为它内置于TMemo中,但它似乎只能处理文本。但在我看来,任何类型的数据都可以表示为字符串。如果我从另一个程序复制一些任意数据并想将其粘贴到TMemo中,我如何让Delphi将其作为原始字符串接受?您是否尝试在您的TMemo和“另一个程序”之间使用clipbaord.astext梅森我不确定是否理解您的答案,但是,是的,您可以像avar所说的那样使用clipbrd.AsText,只需将clipbrd添加到uses子句中即可。 请注意,如果字符串中的某个地方有空字符,那么K

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

您是否尝试在您的TMemo和“另一个程序”之间使用clipbaord.astext

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

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

  • 想要使用任何其他应用程序(一个你没有代码的应用程序,一个普通的应用程序)并复制其中的内容吗
  • 要将复制的数据(可以是任何格式,包括非文本)粘贴为备忘录中的文本
对吗?如果是这样,您就不能使用
Clipboard.AsText
——这只会在剪贴板上有
CF\u text
格式的数据时返回文本。您需要直接使用剪贴板API。剪贴板保存着带有格式代码的数据,您可以获取指向该数据的指针和大小,并将其视为字符串或任意形式

因此:

  • 找出要粘贴的格式。您可以通过迭代当前剪贴板上的所有格式,或使用其中一个预定义常量(用于文本、图像、音频等)。剪贴板可以同时保存多种格式的数据,因此您可能需要选择使用哪种格式
  • 如果剪贴板上有此格式的数据。确保将此代码包装在
    try/finally
    中,并在
    finally
    子句中关闭剪贴板。如果不关闭剪贴板,其他应用程序将无法使用它,因此即使应用程序崩溃,您也希望将其关闭
  • 调用以获取该格式数据的句柄。上的数据(或提供给的数据,如果以后实现复制)是通过分配的,因此您需要通过锁定句柄来获取指向它的指针(完成后,使用解锁)。该数据归剪贴板所有,因此使用后不要释放它。要以字节为单位查找此数据的大小,请使用
  • 这将为您提供一个指向已知大小数据的指针。在这一点上,你可以用它做任何你想做的事情。将其视为字符串是一种选择。由于你的应用程序不拥有数据,你应该复制它,而不是直接操作它
您的代码应该知道数据具有一定的大小,并且可能不会以null结尾(或者其中可能包含null),因此在转换为字符串时,请确保不会溢出缓冲区。您可以对其进行编码以避免
NULL
s等。如果您想了解此类内容的更多详细信息,可能值得再问一个问题(或搜索将任意数据编码为字符串)。最简单的方法是将数据复制到大小为+1的缓冲区中,将最后一个字节设置为NULL,迭代每个字节(最后一个字节除外),对于不可打印字符(字节值<32),将其更改为“.”或其他字符。然后将指向此缓冲区的指针传递给
AnsiString
的构造函数,并将其转换为
PAnsiChar
。(这可确保数据被视为字节大小字符的字符串-如果使用D2009+,请记住这一点,因为本机字符串类型是Unicode。)要使用的另一种字符串类型是
RawByteString
。一旦你有了一个字符串,就把它添加到你的备忘录中


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

我不确定您的语句“任何类型的数据都可以表示为字符串”是否有意义。二进制数据可能嵌入了空值,这会干扰将数据作为字符串处理。例如,位图图像的字符串表示值是多少


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

这是行不通的。如果剪贴板的内容不是文本格式,AsText将返回一个空字符串。正如Mason所说,如果剪贴板没有CF_文本格式数据,这将不起作用。我想他想获取任意数据(任何格式)并将其视为字符串。我的意思是,任何类型的数据都可以表示为RawByteString。我应该用更好的措辞。