【问题标题】:Delphi. Analog of Memo/RichEdit德尔福。备忘录/RichEdit 的模拟
【发布时间】:2011-06-08 20:10:28
【问题描述】:

有人知道是否有 Memo/RichEdit 的类似物吗?需求:对行进行编号,从流中加载大文件(超过 5 MB)。

【问题讨论】:

  • 我不太清楚你所说的“模拟”是什么意思。如果您的意思只是“替代”,那么就有 SynEdit 和 Scintilla。但不会轻易放弃TMemoTRichEdit;实际上,这些只是封装了 Microsoft Windows 操作系统的基本编辑器控件(是的,例如 Delphi TMemo 控件,它只是对 Windows 说,'嘿,你能为我创建一个你喜欢的多行编辑控件吗? ')。这些控件经过了非常好的测试。
  • Windows 控件是否不处理 5MB 文件。
  • @David: TMemo 是多行 EDIT 类的包装器,限制为 32k。我不知道RICHEDIT_CLASS
  • @Ian - 请参阅 MaxLength,这是 VCL 对 EM_LIMITTEXT 的包装器。
  • 在向“Text exceeds memo capacity” error 发布答案时,我设置了大约 0.5GB 的文本没有问题。不过设置文本需要一些时间。

标签: delphi richedit tmemo


【解决方案1】:

Developer Express 拥有大量的 VCL 组件,其中包括一个备忘录替换 (TcxMemo) 和一个 RTF 编辑(不过我不知道功能集)。

【讨论】:

    【解决方案2】:

    TMS Software 有一个非常好的 TAdvMemo 和很多语法高亮。并且还有一个 TRichEdit 的“替代品”。除了突出显示他们的备忘录的语法外,还支持行号。不知道大文件,但 5MB 听起来并不接近他们可能拥有的任何限制。

    TRichView 是另一个强烈推荐的 TRichEdit 替代品,具有大量功能集。

    【讨论】:

    • 我猜TRichView 也是 Windows Rich Edit 控件的包装器?
    • @Andreas:不,不是。它是一个完整的原生 Delphi 控件。 TRichView
    【解决方案3】:

    我们的SynMemoEx component 设计轻巧快速。它可以毫无问题地加载和处理 50 MB 的文本内容,包括自动换行。

    但它仅适用于 2007 年之前的 Delphi 6(还不是 unicode)。但它是免费且开源的。

    我们在SynProject tool 中使用此组件,用于文件版本控制显示和文档版本。而且你有highlighting for .pas .c .cs .h .xml .html .dfm files(以及更多)。

    它具有行号和其他不错的功能。见一些screenshots from here

    【讨论】:

      【解决方案4】:

      TRichView 是一个流行的组件,专门设计用于显示、编辑和打印超文本文档。还有一个 TRichView 插件提供所见即所得编辑。它有 Unicode、RTF 导入和导出、HTML 导出、数据感知版本等等。

      我将它用作我家谱程序的主要组件,并用它来加载非常大的文件(例如 100 MB 或更大)。它可以直接从流中读取或写入。

      【讨论】:

        【解决方案5】:

        【讨论】:

        • SynEdit 很棒,但 Michael 发现它非常慢,例如带有 5 MB 的文本(请参阅他的上一个问题)。这就是他要求其他组件的原因。但问题并没有说明这一点,所以你无法知道。
        • ooww.. 不要检查他以前的问题。 Idk .. 我正在使用 SynEdit 打开大约 300 MB 文本(实际上是二进制文件),对我来说(至少)它看起来并不那么慢:|
        【解决方案6】:

        是否存在任何可以链接内容看起来像 TMemo 的组件?

        需要(认为这是必须能够做到的):

        • 将其中两个放在它们之间,并在它们之间放置一个 TSplitter
        • 内容只加载一次,但同时显示(能够同时看到两个部分),不像 TMemo 那样您必须将所有内容复制到 ram 上
        • 在不到一秒的时间内加载 100MiB TXT 纯文本文件的时间(不包括来自读取媒体的 I/O 时间),换句话说,如果您在 RAM 上有数据并希望在不到一秒的时间内将其显示在两者上
        • 应用程序必须是可运行的(因此没有组件需要单独的 dll,我知道如何将 dll 注入 exe 并在运行时提取它们)并且必须以取证方式从只读媒体运行(不能在任何地方写入)。

        通缉:

        • 不限于 32Bits 系统上的 3GiB(不像丑陋的 ram 需求 TMemo 那样一次性加载整个文件,仅显示部分)
        • Unicode 和 UTF-8/UTF-16 带/不带 BOM 标头等
        • 选择字体来显示文本,如果可以为所有字体选择单行距或正常的布尔值会更好
        • 没有行长限制(TMemo 限制为每行 4KiB-1),如果您有超过一百万个字符的行,请在一行中使用正确的滚动条滚动查看,等等。

        不需要:

        • 语法、颜色等...仅用于纯文本
        • WordWrap(每一行就是一行)

        好吧,我在假装什么?简短回答:纯文本文件的同时链接视图。

        再解释一下:

        • 假设您有一个 GUI,用户可以在其中添加“分隔符”
        • 每个分隔符将视图(而不是文件)分成两部分...因此,如果您有 N 个分隔符,您可以同时看到文件的 N+1 个部分
        • 每个视图都有自己的垂直滚动条,但所有视图只有一个水平滚动条(滚动时所有视图水平同步)
        • 因此用户可以在一个视图中查看第一行,而同时查看其他部分,而无需每次都上下滚动

        为什么?简单的答案:假设该文件是一个日志并且有超过一百万行......再次想象它就像一个历史日志......并且用户想要查看第 X 天和第 Y 天和第 # 天的一些行......等同时(比较或任何原因)。

        如果您使用 TMemo 执行此操作,则需要复制所有数据...而且 32 位应用程序在 32 位处理器上限制为 2GiB 内存,在 64 位处理器上限制为 3GiB 内存(f 编译带有特殊指令)。

        请记住,应用程序必须在 32 位和 64 位处理器上运行,而无需编译不同的版本...并且必须是可运行的,并且在运行时(取证风格)根本不需要(任何地方)写入。

        我想了一种可能的方法来创建它...基于 TStringList,但我还是很有限...而且从头开始工作太多了。

        也许有一个组件在那里,因为我看到一些应用程序可以在不加载它的情况下向您显示一个大文件,它们都是从头开始有自己的实现吗?或者他们使用了一个我不知道的组件?,他们中的大多数是用于十六进制编辑一个大的二进制文件,有些可以编辑很多 GiB 的文件,其中只有少数可以非常快速地插入和删除,直到他们保存(在执行挂起的插入/删除操作时复制整个文件的 I/O 可能需要很长时间,超过一个小时,但在屏幕上执行插入/删除非常快,不到十分之一秒)。

        如果我找到一个组件,我可以做我想做的所有事情:

        • 看起来像 TMemo
        • 通过代码可以模拟垂直和水平滚动,而无需触摸选定的文本选择(我可以使用较小的 TPanel 容器隐藏滚动条,因此无需控件来隐藏滚动条)
        • 非常重要:不要加载整个文件(只阅读显示的部分)
        • 有 LoadFromFile(但不是真正加载整个文件,只是在内部存储文件引用)
        • 不需要但需要:用户可以像在 TMemo 上一样进行编辑
        • 不需要但需要:使用 SaveToFile 保存用户更改

        外面有人吗?

        添加:免费(任何用途)并且必须开源。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-08
          • 1970-01-01
          • 2010-12-26
          • 1970-01-01
          • 1970-01-01
          • 2012-09-25
          相关资源
          最近更新 更多