代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

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

  •  2
  • Mason Wheeler  · 技术社区  · 15 年前

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

    4 回复  |  直到 13 年前
        1
  •  6
  •   David Mohaimin Moin    15 年前

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

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

    对吗?如果是这样,你就不能使用 Clipboard.AsText -仅当存在数据时返回文本 CF_TEXT 在剪贴板上设置格式。您需要直接使用剪贴板API。剪贴板包含带有格式代码的数据,您可以获取指向该数据的指针和大小,并将其视为字符串或您想要的任何内容。

    所以:

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

    您的代码应该知道数据有一定的大小,可能不会以空结尾(或者可能有空),所以在转换为字符串时,请确保不要溢出缓冲区。你可以对它进行编码以避免 NULL 如果您想了解更多关于这类内容的详细信息,可能需要再问一个问题(或搜索将任意数据编码为字符串)。最简单的方法是将数据复制到一个大小为+1的缓冲区中,将最后一个字节设置为空,迭代除最后一个字节外的每个字节,以及不可打印字符(字节值<32)将其更改为“.”或其他字符。然后将指向此缓冲区的指针传递给 AnsiString 的构造函数,强制转换为 PAnsiChar . (这可以确保您的数据被视为字节大小字符的字符串—如果您使用的是D2009+,则需要记住,因为本机字符串类型是Unicode。)要使用的另一种字符串类型是 RawByteString . 一旦你有了一个字符串,把它添加到你的备忘录中。

    有一个很好的例子(C,对不起) pasting data of a specific format on MSDN . 您可以使用它作为起点,添加您自己对数据的自定义处理。粘贴为字符串可能不是查看任意二进制数据的最佳方法-您可以使用十六进制编辑器组件或其他Visualiser来更好地查看数据。

        2
  •  2
  •   delphigeist    15 年前

    梅森,我不确定我是否理解你的答案,但是的,你可以使用剪贴板。就像艾娃说的,把clipbrd添加到uses子句中。 请注意,如果您的字符串中有一个空字符,那么kazam您的字符串将从一开始粘贴到空字符0。另一种方法是使用内存映射文件或消息在应用程序之间发送数据。

        3
  •  1
  •   avar    15 年前

    您是否尝试在tmemo和“另一个程序”之间使用clipboard.astext?

        4
  •  0
  •   Larry Lustig    15 年前

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

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