放到stringstream中处理,处理完了在转回string。

解决方案 »

  1.   

    请用Memo.lines[memo.lines.count-1]:=Memo.lines[memo.lines.count-1]+Copy(string,i,count);速度就会很快。、
      

  2.   

    请用Memo.lines[memo.lines.count-1]:=Memo.lines[memo.lines.count-1]+Copy(string,i,count);速度就会很快。、
      

  3.   

    请用Memo.lines[memo.lines.count-1]:=Memo.lines[memo.lines.count-1]+Copy(string,i,count);速度就会很快。、
      

  4.   

    chechy(我爱洁洁):
        StringStream怎么用?我没用过,请告诉我。
    netlib(河外孤星):
        我用下面的代码测试,花了9秒钟!还是太慢啊:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
     for i:=1 to 1000 do
      Memo1.lines[memo1.lines.count-1]:=Memo1.lines[memo1.lines.count-1]+inttostr(i);
    end;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
     for i:=1 to 1000 do
      Memo1.lines.add(inttostr(i));
    end;
    这样很快,
    你的代码和
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     S:string;
    begin
     for i:=1 to 1000 do
      S:=S+inttostr(i);
     showmessage(S);
    end;
    的效率是一样的,根memo1没有关系。
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
     for i:=1 to 1000 do
      Memo1.lines.add(inttostr(i));
    end;
    这样很快,
    你的代码和
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     S:string;
    begin
     for i:=1 to 1000 do
      S:=S+inttostr(i);
     showmessage(S);
    end;
    的效率是一样的,根memo1没有关系。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
     for i:=1 to 1000 do
      Memo1.lines.add(inttostr(i));
    end;
    这样很快,
    你的代码和
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     S:string;
    begin
     for i:=1 to 1000 do
      S:=S+inttostr(i);
     showmessage(S);
    end;
    的效率是一样的,根memo1没有关系。
      

  8.   

    1)TStringStream的用法看Help。主要是string经常会动态分配内存,而stringstream一次分配大容量内存,带来了效率的提高。
    2)不要直接操作memo.Lines,因为除了Tstrings的处理外,还有界面的处理,效率太差,我宁可在代码中使用另外一个TStrings,然后一次赋值。
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
     a: TStrings;
    begin
      a := TStringList.Create;
      a := memo1.Text;
     for i:=1 to 1000 do
      a[a.count-1]:=a[a.count-1]+inttostr(i);
      memo1.text := a;
    end;
      

  9.   

    河外孤星:
        你这样做的话Memo中每行只有一个数据,不太好。
    我爱洁洁:
        你这段代码有错,你测试下就知道了。另外,我用for i:=1 to 1000 do……的代码只是测试用而已,最终我还是要处理我的长字符串的。帮助看了一下,不是太明白,能否直接告诉我怎么处理?我的长字符串中的有些数据是要丢掉的,所以只能把它copy出来。
        解决问题后另外给50或更多分。多谢各位高手!
      

  10.   

    帮助中没有例子,我还是看不懂:)
    请大家告诉我我的问题到底该怎么处理。比如说我第一次取的数据是copy(string,1,40),第二次取的数据是copy(string,1000,60),我该怎么做?我也不一定要放到Memo中,放字符串中也行,关键是效率和容易处理。
      

  11.   

    你先声明一个动态内存字符串,让它等于原来的Memo.text
    然后对字符串操作,最后在等于回去!
      

  12.   

    应该是你的搜索算法有问题!另外,Copy很消耗时间的,因此,你可以考虑用指针来做!例如:
    var
      Data:string;
      Buf:TStringStream;
      P:pchar;
      i,Count:integer;
    ...
      Buf:=TStringStream.Create('');
      Data:='.....................................';
      ....
      while .....do begin
        i:=/////;
        Count:=////;
        P:=@Data[i];
        Buf.Write(P,Count);
        .......
      end;
      .....
      Memo1.Text:=Buf......
      
    这样,用内存流和指针来操作,应该非常快的。
    其余其他的,不要每次都添加到Memo里面,可以采取双缓冲的方法啊,在内存里面建立一个临时的用来保存String的对象,在全部处理完成之后,才一次性的赋给Memo,这样速度应该很快。