当一行文本即一大段时,用memo.lines.strings[memo.lines.count-1]:=memo.lines.strings[memo.lines.count-1]+str或者memo.text:=memo.text+str都很影响效率,我的数据量很大。不知有没有更好的方法。用memo.lines.append或memo.lines.add总是自动换行。
调试欢乐多
如果不是要求实时看到结果,进行编辑的话,建议使用TStringList+String实现。
Tstr: TStringList;
begin
Tstr := TStringList.Create;
try
Tstr.Add('addddd');
memo1.Lines.AddStrings(tstr);
finally
Tstr.free;
end;类似这样的方法你试一下
再memo.text:=s;
memo多次刷新肯定慢。
但如果用TStrings换成TMemo,处理速度会降低很多。特别是在处理大数据时,其速度要降低数百倍。
我也有这个意思。楼主如果把海量的数据全部放到一个Memo里,估计想翻页看一下都困难。
可以按您的意思,全部数据放到一个TStringList里,然后想看哪行时,再单独取那一行对Memo.Text赋值。其实我意思的侧重点是:楼主的基本思路值得商榷:海量数据放入内存(无论TMemo.Strings还是TStringList),本身就不是最佳方案。但是因为不知道楼主是要干什么,所以没有什么建设性的意见。
如果数据来得不频繁就实时刷新.因为每刷新一次,Memo就会将所有的重新Load一次,即使只加一个字符也是这样.
还有就是用其他的Memo代替Windows的Memo也是一个可行的方法.
我做的是一个telnet程序,像unix机器发命令取返回数据,这个命令的返回数据非常大,足有几万行,我在idtelnet的IdTelnetDataAvailable事件里将返回数据放到memo中,然后要逐行分析出需要的数据入库:procedure TExThread.IdTelnetDataAvailable(Sender: TIdTelnet;
const Buffer: string);
begin
self.memoTelLog.Lines.Strings[self.memoTelLog.Lines.Count - 1] :=
self.memoTelLog.Lines.Strings[self.memoTelLog.Lines.Count - 1] + Buffer;
end;但是问题就来了,IdTelnetDataAvailable是一段一段返回数据,并不是一次性返回,所以要不停的将数据添加到memo中,如果用memo的add或append来添加,就有可能在错误的地方出现回车,导致分析出错误数据,如下:话统任务 #18 测量单元 中继群出局话务测量
测量周期 1小时 结束时间 2008-04-18 09:00 出局或双向中继群 6985 WZHGM20A_6
溢出阈值 否
结果准确度 准确
试占次数 0
占用次数 0
接通次数 0
应答次数 0
溢出次数 0
中继电路类型不配次数 0
承载能力方式不配次数 0
双占次数 0上面是一小段正确的返回数据,IdTelnetDataAvailable里可能一次返回是:
话统任务 #18 测量单元 中继群出局话务测量
测量周期 1小时 结束时间 2008-04-18 09:00 出局或双向中继群 6985 WZHGM20A_6
溢出阈值 否
结果准确度 准确
试占次数 0
占用次数 0
接然后第二次返回:
通次数 0
应答次数 0
溢出次数 0
中继电路类型不配次数 0
承载能力方式不配次数 0
双占次数 0
如果用add或append就会从在“接”后加换行,我分析数据就会出现错误,就只好用:
self.memoTelLog.Lines.Strings[self.memoTelLog.Lines.Count - 1] :=
self.memoTelLog.Lines.Strings[self.memoTelLog.Lines.Count - 1] + Buffer;
这种方式加了,而且这种方式也会出现问题,可能会从“接”中间劈两半返回,出现乱码问题。感觉我这问题应该发到网络通信区。
s,s1,s2: WideString;
i: integer;
begin
s:= 接收到的数据;
i:= posex('话统任务',s); //前题是:格式规范
if i>1 then
begin
s1:= s2+copy(s,1,i);
MainForm.Memo1.Lines.Add(s1); //将结果送入主进程的Memo中显示
s2:= copy(s,i,Length(s)-i);
end
else
s2:= s2+s;
end;主进程部分,应在数据处理结束后,清空Memo的内容,否则,会造成阻塞致使接收数据的丢失。
memo用来显示你处理的信息
Memo1.WordWrap := False;//自动换行属性设为假
当你一条文本就一大段时,也不会折行了。
人家说的不是显示时候的自动换行,而是在Add的时候,memo会自动给加入的
这行字符串末尾加上个换行.