Delphi 7,TRichedit,被RTF编码困住

时间:2010-12-23 10:45:50

标签: delphi delphi-7

我正在简要介绍这个问题。

  1. 从数据库中检索(id,name)字段记录到列表框中。
  2. 从列表中选择任何记录。
  3. 在所选ID的富编辑框中显示备注(Blob类型)。
  4. 除了两个记录都很好。
  5. 两条记录都有数千行记录到数据库中。 注意:[ 它来自于使用某些rtf格式代码从word或outlook粘贴的注释。 似乎导致“粘滞便笺”的那些是编码上的/ f0protect(或与其非常相似的东西)。 导致问题的所有问题都在注释页面中的某处。 解决方案是打开基表记录并查找记录并显示备注字段。 剪切/删除基表记录中的注释并将其粘贴到Word或记事本中(取决于卷)。做很多Find&替换rtf编码。然后将注释重新复制回基表记录中。 ]

  6. 将数据正确显示到富编辑中。

  7. 之后记录,应用程序无法通过从列表框中选择其他记录将其他备注加载到富编辑中。
  8. 内部发出错误声音。
  9. 不会抛出任何错误或异常。
  10. 对于这个问题,我脑子里有三件事。 1.问题可能出在RTF代码上。 2.缓冲区或内存。 3. TRichEdit控制。

    我希望这个解释对我有所帮助。

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

首先,我要重新解释你的问题,因为在它的当前化身(编号列表)中,它不容易回答。我考虑过编辑你的问题,但这可能太苛刻了。我只是这样做,因为你是网站的新手。如果你不是新人我会简单地发表评论,询问“问题是什么?”

我认为这个问题应该是这样的:


TRichEdit错过了一些特定的RTF

我正在根据数据库中的数据生成一些RTF并将其加载到TRichEdit控件中。大部分时间它工作正常,但在一些情况下,生成的RTF导致TRichEdit错过行为:它显示RTF就好了,但是当移动到新记录时,TRichEdit只是拒绝加载新文本!它不会抛出异常,但会从计算机中听到错误的哔声。

一些背景:TRichEdit中加载的文本长达数千行,而不是可以轻松附加到此消息的内容。此RTF由较小的RTF位构建,从Microsoft Outlook或Microsoft Word复制粘贴。显然,当在来自Outlook或Word的RTF位中找到/f0protect(或与此类似的东西)时,会发生错误。进入数据库并删除这些标记可以解决问题,但我需要一个更好的解决方案。

我不确定问题可能是什么。我在想它是:

  1. RTF代码可能存在问题。
  2. 缓冲区或内存。
  3. TRichEdit控制。

  4. 现在我回答:

    关于RTF格式的一些背景知识。首先,它是一种不断修改的Microsoft控制格式。您几乎可以以RTF格式保存任何Word文档,在Word中重新加载它并使其看起来相同。这并不意味着您可以将任何RTF加载到写字板中,并使其看起来与在Word中完全一样!微软太聪明了,不能犯这么幼稚的错误。写字板只是Microsoft Rich Text Controll的包装器(就像TRichEdit一样)。这意味着TRichEdit可以做的事情存在局限性。

    其次,RTF格式不是无上下文的:你不能期望简单地附加两个RTF并获得有效的RTF! RTF文档应该以标题开头,然后是文档区域。如果你附加两个RTF的和平,你得到两个标题,我认为结果是未定义的。

    你可能是对的,问题是你提到的3个问题之一。令人高兴的是,它很容易测试,抛出一个消除过程:

    1. 缓冲区或内存:生成的RTF有多大?从代码中创建一些等长(或更大)的RTF,确保它只包含简单的RTF。它错过了吗?如果是这样,你遇到了某种内存限制,但我对此表示怀疑。尽管如此,它很容易测试!

    2. RTF代码可能存在问题:非常可能!你说如果从数据库中删除那些有问题的标签,问题就会消失;在构建大型RTF的过程中从代码中删除标签。如果您最终需要删除一长串标签,可能需要反过来:制作一个您想要保留的代码列表并删除其他所有代码!

    3. TRichEdit控件:据我所知,没有第三方富文本编辑器,所以你不妨将问题(3)与问题(1)相同。说“这个RTF有效,因为它在Microsoft Word 2010中运行正常”对单个位没有帮助,除非您愿意使用OLE自动化在Word窗口中显示您的RTF!

    4. 其他建议:

      • 显示一些关于如何实际构建大型RTF的代码。
      • 如果找到错误的rtf标记并需要更多信息,请复制粘贴完全代码:/f0protect无效rtf!