关于快速取得RichTextBox的长度及文本的问题

cs_dn_net 2014-09-12 02:28:36
在RichTextBox中,当文本文件比较大时(比如10M多),取得文本的长度或文本内容都要花很长时间。
比如下面的代码:

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub cmdShowLen_Click()
Dim T As Long, L As Long
T = timeGetTime
L = Len(RichTextBox1.Text)
T = timeGetTime - T
MsgBox "用时=" & Str(T) & " 长度=" & Str(L)
End Sub
Private Sub cmdGetText_Click()
Dim T As Long
Dim S As String
T = timeGetTime
S = RichTextBox1.Text
T = timeGetTime - T
MsgBox "获取文本用时=" & Str(T)
End Sub

编译成本机代码后进行测试。
对一个690K的文本文件,获取长度或文本均在85ms左右;
对一个5.5M的文本文件,获取长度或文本需要9,600ms左右;
对一个14.2M的文本文件,获取长度或文本需要65,400ms左右。
对于更大的文件已经不想测试了。
第2个文件不到第1个文件的10倍大小,花费的时间却超过100倍!
第3个文件不到第2个文件的3倍大小,花费的时间也近7倍!

有什么办法可以快速取得RichTextBox里面的文本和长度呢?
SendMessage可以吗?
又或者有什么控件可以快速取得文本和长度的呢?(只要能容纳大的纯文本文件)
...全文
731 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-09-15
  • 打赏
  • 举报
回复
引用 2 楼 cs_dn_net 的回复:
[quote=引用 1 楼 Tiger_Zhao 的回复:] 用 WM_GETTEXTLENGTH 试试
快速取得文本及长度的问题解决了。 还有个问题:当用RichTextBox打开一个大文件后,按Ctrl+End跳到文本最后时,虽然马上能看到,但是程序会失去响应很长一段时间,远比用Len(RichTextBox1.Text)计算长度所花的时间长。 这有什么办法解决吗?[/quote] 带格式的显示是非常花时间的。 就像看小说一样,全文阅读总是载入很慢的,分章节就好多了。 想要快,就得把大文件分成小文件,直接载入大文件是不行的。
cs_dn_net 2014-09-15
  • 打赏
  • 举报
回复
非常感谢各位的建议! 我现在已经改用TextBox来解决了。 用TextBox拖动滚动条的时候响应还是很快的。 就是文件比较大的时候,改变比较前面的部分文本时,反应就慢了。
of123 2014-09-15
  • 打赏
  • 举报
回复
改成分页处理的机制。 还有一种变通的方法。用 Frame 数组控件,内置多个 RichTextBox。所有的与页跳转相关的操作都拦截,并通过设置相应的 Frame 元素可见来实现。或者,做 n + 1 个 RichTextBox,其中一个可见的用于显示,其他的用于存储文本。显示控件的大小最好适应窗口大小,也就是不需要滚动。可以做一个虚拟的滚动条用来换页。跳页时把相应元素的内容复制到显示 Box 中。如果复制量大,还需要在显示时先使目标控件不可见,复制完成后再恢复可见。
一如既往哈 2014-09-13
  • 打赏
  • 举报
回复
用RichTextBox打开超长文本本身就是不明智的举动,何况RichTextBox还是格式文本!!! 用webbrowser测试系统中不带@的字体(大概290中左右),设置font-family为对应的字体,类似于 <font style='font-family:宋体'>宋体</font> 结果webbrowser的反映变得极其迟缓!
PctGL 2014-09-13
  • 打赏
  • 举报
回复
有个消息可以支持从回调函数中以字节流的方式输入和输出数据,速度可能会好点
cs_dn_net 2014-09-12
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
用 WM_GETTEXTLENGTH 试试
快速取得文本及长度的问题解决了。 还有个问题:当用RichTextBox打开一个大文件后,按Ctrl+End跳到文本最后时,虽然马上能看到,但是程序会失去响应很长一段时间,远比用Len(RichTextBox1.Text)计算长度所花的时间长。 这有什么办法解决吗?
Tiger_Zhao 2014-09-12
  • 打赏
  • 举报
回复
用 WM_GETTEXTLENGTH 试试

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧