当一行文本即一大段时,用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总是自动换行。
 

解决方案 »

  1.   

    Memo.Text := Memo.Text + String;
      

  2.   

    我的数据量很大的,而且要连续插入几百次,用Memo.Text := Memo.Text + String 效率很低
      

  3.   

    不知楼主要实现什么功能?
    如果不是要求实时看到结果,进行编辑的话,建议使用TStringList+String实现。
      

  4.   

    Memo.Lines已经是一个TStringList了不好意思刚才没有看到楼主贴子原文里就有我在一楼那句。看来楼主的意思并不是换行不换行的问题,而是海量数据的问题。把大量数据依次全部放到一个Memo或TStrings,或String里,是不是本身就不科学
      

  5.   

    var
      Tstr: TStringList;
    begin
      Tstr := TStringList.Create;
      try
        Tstr.Add('addddd');
        memo1.Lines.AddStrings(tstr);
      finally
        Tstr.free;
      end;类似这样的方法你试一下
      

  6.   

    memo1.Text := Tstr.Text;或者改成这句.
      

  7.   

    先定义一个字符串变量,s:=s+str;
    再memo.text:=s;
    memo多次刷新肯定慢。 
      

  8.   

    没错。
    但如果用TStrings换成TMemo,处理速度会降低很多。特别是在处理大数据时,其速度要降低数百倍。
      

  9.   


    我也有这个意思。楼主如果把海量的数据全部放到一个Memo里,估计想翻页看一下都困难。
    可以按您的意思,全部数据放到一个TStringList里,然后想看哪行时,再单独取那一行对Memo.Text赋值。其实我意思的侧重点是:楼主的基本思路值得商榷:海量数据放入内存(无论TMemo.Strings还是TStringList),本身就不是最佳方案。但是因为不知道楼主是要干什么,所以没有什么建设性的意见。
      

  10.   

    定时刷新数据+实时刷新数据如果数据来得频繁,就先用string存起来,定时刷新.
    如果数据来得不频繁就实时刷新.因为每刷新一次,Memo就会将所有的重新Load一次,即使只加一个字符也是这样.
    还有就是用其他的Memo代替Windows的Memo也是一个可行的方法.
      

  11.   

    估计用memo的话没啥太好的办法
      

  12.   

    csdn的网友真热心啊,早上一看有这么多网友帮忙。可能我没说清楚我的意思:
    我做的是一个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;  
    这种方式加了,而且这种方式也会出现问题,可能会从“接”中间劈两半返回,出现乱码问题。感觉我这问题应该发到网络通信区。
      

  13.   

    如果应用程序一天24小时不停获取回发数据,建议楼主在线程中接收、处理数据,在主进程中浏览、处理结果:var
      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的内容,否则,会造成阻塞致使接收数据的丢失。
      

  14.   

    如果用来分析用而不显示的话,没必要放到memo中,效率太低,楼主可以开一个缓存,将收到的数据全部加入到缓存中,然后去分析是否有正确的返回数据,如果有即提取出来分析,并删除缓存中相应的内容。从返回数据量来看,应该完全来的及处理和显示。
      

  15.   

    尚未处理好的数据不要放入memo,可以放入global string 中或者通过文件形式来处理
    memo用来显示你处理的信息
      

  16.   

    呵呵,只想就问题给出答案:
       Memo1.WordWrap := False;//自动换行属性设为假
    当你一条文本就一大段时,也不会折行了。
      

  17.   


    人家说的不是显示时候的自动换行,而是在Add的时候,memo会自动给加入的
    这行字符串末尾加上个换行.