不难的问题(对我很难)(100分)

  • 主题发起人 主题发起人 delphiboy
  • 开始时间 开始时间
D

delphiboy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何让D3中的RICHEDIT打开大文件的速度加快。我查
了一下已答问题,好象没有解决。谁有详细程序EXAMPLE!?
 
我认为要改写RichEdit,可以继承RichEdit,改写LoadFromFile,分段读取大文件,
及先读取一部分,后面耕具需要在读文件。 {B-(
 
建议使用RXLIB中的RichEdit构件,这个构件好像速度上比Delphi的标准
构件要快。而且有源代码,可以研究一下它用了什么技术
估计要加速主要是解决内存数据结构的问题,其他我就说不上什么了
 
我做了个试验:
实验一: 一个6.4M大的TXT文件,用D3里的
RICHEDIT来打开,没有完成(时间太长,以至机器
没响应了);用RXLIB(V2.60)里的RICHEDIT来打
开,也没有完成(情况同D3/RICHEDIT);
用现在一些编辑器程序所用的元件MWEDIT来打开,
快是快,可惜不支持大于64K文件,导致文件大部分
截去!(注:PLUSMEMO也如此!)

实验二:我用ULTREEDIT32来打开,7秒!!!
我用EDITPLUS来打开,10秒!!!
用GWDTEXTEDIT2.0打开/EMEDITOR打开/
COBPAD PLUS打开....全部是10秒!!!之内!

我昏倒!看来国外的程序人的确水平比较高,而且它们
打开文本文件,全部是一次性,好象不存在分段读取等等
我们在以前大富翁里谈到的办法。

小弟的水平有限,无法完成这个难题,恳求大家帮忙!!

 
hehe
以前我处理的时候
是先用把文件读到一个缓冲区buf;
然后用
richedit.string:=buf
一次把数据灌进去,这样速度要快得多。
:)
 
to nuke:能否写个EXAMPLE?
 
nuke???
求求你了!!!
我可以在加分!
 
var
FileStream:TFileStream;
MemoryStream:TMemoryStream;
begin
if (Opendialog1.Execute) and (FileExists(OpenDialog1.FileName)) then
begin
FileStream:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
try
MemoryStream:=TMemoryStream.Create;
try
MemoryStream.LoadFromStream(FileStream);
RichEdit1.Lines.LoadFromStream(MemoryStream);
finally
MemoryStream.Free;
end;
finally
FileStream.Free;
end;
end;
end;
 
试试这个用得时间,我也想知道结果! {B-)
 
我试了4.019kb的普通文本文件,我写的示例只要5-10秒中即可完全读出并显示。win98
中的WORDPAD.EXE要20-30秒,并且只是读部分文件,操作慢得要死!
希望测试结果对你有用!!! {B-))
 
这个也许对你有用:richedit1.MaxLength := High (Integer) - 1024;
有了这一句,可以让你打开并且编辑大于64K的文件,否则好像要出一点小毛病.
 
to beta:RICHEDI本来就可以打开大于64K的文件呀。如果不写你
那句,回产生啥错误呢?

to 沈前卫:别急,等我测试用用看。
 
我实验了你的程序,结果是没有作用!
就是说用RICHEDIT的普通LoadFromFile和你的
LoadFromStream相比,没有时间上差别。

(另外我还实验了在“自动换行”的TRUE/FALSE之间
的区别,没有区别,RICHEDIT打开文件的时间相同)

前卫兄,问题到底出在哪里呢?
 
delphiboy,在我的机器(delphi)上,如果没有这一句,
输入到第64K个字就不能再输入了.
 
上面还写错了,文件是4,019kb(约4M),以下是我的测试结果:
Dell233M+32M+Win98+Delphi4

4,019kb文件为A, 8,038kb文件为B

在系统资源为84%可用时,A:8秒 B:27秒
在系统资源为71%可用时,A:18秒 B:54秒

最好系统资源要充足! {B-(

看了一下VCL的原代码,发现LoadFromFile其实也是调用LoadFromStream(FileStream),
所以两者时间没有区别,delphi之所以如此慢,可能与其程序的算法有关,delphi
从filestream读出文件后,都是在TStrings中处理文件的,如计算文件有多少行等,
他是判断是否为#13,#10来处理的。
nuke: richedit.string:=buf(应为:richedit.Lines.text:=String(buf)
也一样不行,因为RichEdit在处理文本的方法都为private procedure SetTextStr,
也就是说,所有方法都会受delphi的限制。
解决方法,我认为分段读,按需读,都要知己编程。delphiboy,你所举的几个
编辑器我想都有其独特的方法,肯定不是用什么控件完成的。 {B-(
 
看来只能这样了
 
后退
顶部