gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:12:34 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

所以:

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

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

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

关于delphi - 如何将任意数据粘贴到 TMemo 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1732806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com