Delphi行着色文本组件替换TRichEdit以提高性能

3
我目前在我的一个 Delphi 7 软件中使用 TRichEdit 作为“实时”事件日志查看器,但最近对我的软件进行了性能分析,发现 TRichEdit 占用了超过 40% 的 CPU 时间。
我想测试其他组件以比较性能,这个组件必须具备以下功能:
- 行着色(可以是 LINE 语法颜色,因为不同颜色的行有不同的前缀,或者 HTML 着色等)。 - 易于保存到文件功能(可以保存为 RTF 或 HTML)。 - 免费或开源。 - 即使对于“大文件”(可能达到 200 Mo),也要有良好的性能作为查看器。
说明:我已经查看了此帖子,但没有适合我的好答案。链接:https://stackoverflow.com/questions/6284630/delphi-analog-of-memo-richedit

那么,SynMemoEx组件有什么问题吗? - LU RD
1
@LURD 我非常喜欢Synopse组件,但是在这里,我从网站上提取SynMemoEx时遇到了一些问题。 - philnext
3个回答

3

嗯...TConsole来自于...嗯,Danny Thrope?但是在源代码中只有TConsole没有TconsoleColor。 - philnext
不,这是来自Danny Thorpe。 :P TColorConsole在D2版本中发布。向下滚动TConsole类。 - dthorpe
好的Danny,我试过了:比TRichEdit快4倍。确实是一个不错的组件,值得更多人知道和使用。我会寻找rtf文件保存的方法。 - philnext
谢谢。那是一项有趣/有回报的项目。很高兴听到它仍然可以编译和运行! - dthorpe

2
对于“实时”事件日志查看器,我建议使用VirtualTreeView。它能够处理几乎无限数量的行,具有大量的自定义功能(如自定义着色和自定义绘制任何和所有内容),支持Unicode,并且即使列表中已经有数百万项,也可以非常快速地工作。了解所有功能需要一些时间,但是一旦你理解了它的工作原理,就再也不会回头了。它甚至支持原地编辑(包括为每列支持自定义控件)。每个项目都是一个记录,可以保存您需要的任何数据(而不仅仅是要显示的数据)。增量搜索也受支持,以及从代码进行极快速的搜索,即使您有数百万项也不会有问题。
我建议避免使用任何类型的“标准”文本编辑组件,因为操作系统或组件本身会施加许多限制。我所知道的唯一一个可以支持大部分(如果不是全部)需求的组件已经被提到了 - TRichView。我尝试过TSynEdit,虽然它有很多功能,但性能严重不足。
尝试使用VirtualTreeView,你不会后悔的。

我一直想尝试VirtualTreeView,但不知道它可以用作编辑器。我在同一个项目中使用了TSynEdit(用于其他目的),但速度太慢了! - philnext
等一下。现在你想要一个可以用作编辑器的控件?! - David Heffernan
@DavidHeffernan 嗯..抱歉,我只是想要一个查看器。对我来说,VirtualTreeView显示TreeView,我不知道它还可以显示“带有颜色的文本行”。 - philnext
1
为什么这里是-1?在我看来,VirtualTreeView非常适合这个目的。它具有编辑功能,但您不需要这个功能来进行事件记录,对吧? - TLama
1
VirtualTreeView最好的一点就是数据虚拟化,即最好将数据保存在组件之外。 - LU RD

1

也许你可以记录到一个ClientDataset中。DBGrid允许您指定各种绘图选项,因此您可以根据可见行指定背景颜色。ClientDataset可以轻松管理相当多的数据,而网格将仅绘制那些可见的行。

无论如何,如果您记录了很多内容,不断重新绘制日志组件会减慢应用程序的速度。也许您应该通过在临时日志中缓存行并每隔几秒钟将它们批量添加到可见日志中来使日志变得不那么实时。


DBGrid?为什么不呢,但我不确定文件保存是否容易实现。我已经有一些机制来显示“回溯时间”日志和仅显示最后几行,但对于长时间和大数据流仍需要很长时间。 - philnext
ClientDataset本身具有保存和加载数据的方法。它以XML格式存储数据,虽然我不确定这样做的速度会有多快,当然也可能不是您所希望的格式。无论如何,您不需要保存Grid,只需保存数据集即可。如果日志也需要实时保存,我会创建一个日志方法(类),该方法接受日志字符串并将其推送到数据集和文件中。如果您在每次保存时向文件末尾添加信息,则可以快速保存日志文件。不要尝试在每次保存时重写整个文件。 - GolezTrol
如果数据量确实很大,将其记录到数据库并按需生成HTML报告可能会更好。您甚至可以使此页面轮询(使用AJAX)以获取上一个日志后的新日志。但是抛开所有可能的解决方案,想清楚您需要什么以及为什么是个好事。也许如果您明确了要求,就可以自己想出一个好的解决方案。 - GolezTrol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接