关于Memo和RichEdit的差别之一(0分)

  • 主题发起人 maomao.yan
  • 开始时间
M

maomao.yan

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟最近帮一个朋友做了一个电信用户网费的统计的小程序,
从一个文本文件中读入一批用户的数据,其行格式如下
用户所在地 用户所在局向代号 用户电话号码 用户该月网费
只要用到用户所在地和月网费这两项数据,统计一个地区总有多少用户,
每月网费在50元以上和50元以下和需要从电信退费的用户数,该地区所有用户总的
上网费用。
在写这个小程序时,因为考虑到该文本文件有时候很大,因此读入后载入一个RichEdit
控件,结果在遍历整个文件时发现这个程序的执行速度比起使用Memo控件来相差十几倍,
事实在,在2000操作系统下,Memo能读入的文本文件的大小已经没有64KB的限制了,所以
如果大家想进行类似操作的话,强烈推荐使用Memo控件,速度优势太明显了。以下是我的
数据处理源程序,希望能对大家有用
.....
temp = Memo2->Lines->Strings[0];
int pos=temp.Pos(char(0x09));
//定位这一行数据中第一个空格的位置
lastname = temp.SubString(1,pos-1);
//取出从第一个字符开始到第一个空格之间的字符,即为用户所在地区
for(int i=0;i<Memo2->Lines->Count;i++)
{
temp = Memo2->Lines->Strings;
int pos=temp.Pos(char(0x09));

name = temp.SubString(1,pos-1);
//第一段:用户地区
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第一段后剩下的字符串
pos=temp.Pos(char(0x09));
//第二段:
temp = temp.SubString(pos+1,temp.Length()-pos);
//去掉第二段后剩下的字符串
pos=temp.Pos(char(0x09));
//第三段:
price = temp.SubString(pos+1,temp.Length()-pos);
money=StrToFloat(price);

if(name==lastname)
{
totle+=1;
//若用户地区和前一条记录的地区相同,则先不输出
money>=50.0?num_big++:(money>0.0?num_small++:num_back++);
totle_money+=money;
StatusBar1->SimpleText="正在处理 "+lastname+" 地区用户......";
}
else
{
//否则,该地区已经统计完毕,输出最后结果。
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
num_big=0;num_small=0;num_back=0;
totle_money=money;
totle=1;
money>=50.0?num_big++:(money>0.0?num_small++:num_back++);
lastname=name;
}
}
Memo1->Lines->Add(lastname + " 一共有" + IntToStr(totle) +"个用户/n" +"其中月费超过50元的共有:"+ IntToStr(num_big)+"户,月费少于50元的共有:"+ IntToStr(num_small)+"户, 需要退费的共有:"+ IntToStr(num_back) +"户,该地区总收入:"+FloatToStr(totle_money)+"/n/n");
//最后一个地区直接输出结果

StatusBar1->SimpleText="全部数据处理完毕";
......

欢迎大家提出宝贵意见,使我能对这段代码进行优化。
 
设置RichEdit的PlainText为true,这样就是处理纯粹的文本。不是rtf文件了。
又:
1.为什么要RichEdit呢,你的文件如果不用显示,就用一个
TStringList 读取就可以了啊。
2.如果stringlist慢,你可以尝试用fopen,fgets一行一样的读取,这样也很快的。
 
因为要看到读入的这段文件,所以想用一个文本控件能把它显示出来,
不过我没用过TStringList,改天我要试一下看看,至于fopen和fgets,
我总认为这个不是windows函数,这是标准C的东西,所以也用的很少,事实上
我朋友有一个旧的版本就是用fopen和fgets实现的,我就是为了不同的方法实现才去另外
帮她做一个。
 
那可以用windows的API函数CreateFile,ReadFile应该比较快。
 
用文件的话效率太低,还是用TStringList要好些。
 
不知道是行的限制还是容量的限制,memo好象有文本大小的限制
我的也是2000,那是用的是bcb4
 
我也碰到类似问题,我也是用TRICHEDIT控件..但是我要导的文本,有30M..
经过观察,在导这个文本的的是时候消耗了了100M的内存,几乎死机.
不知道还有什么好方法否.
 
对于大文件同意invalid的建议。
 
后来,我用stringlist,解决了这个问题,我建议还是用这个好.
 
Memo有大小的限制,在9X中只有64KB.
把RICHEDIT设为PlainText设为True会快很多的.
对于大的文件,最好的方式是用"流"来读取.可以很好的解决速度与内存占
用上的问题.
 
时间太久,强制结束。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
797
DelphiTeacher的专栏
D
D
回复
0
查看
750
DelphiTeacher的专栏
D
顶部