想要你的程序在不会象死了一样没有反应, 可以在循环体内加上一句
Application.ProcessMessages;以处理Windows消息.
另外,临时中转用的s2可以省略,我们只要记住上一个段落的结尾索引
号即可.
procedure TForm1.Button4Click(Sender: TObject);
var
s1,s3:string;
i,j:integer;
begin
s1:=richedit1.text
//s1就是需要排列的那段文字
j:=1;
for i:=1 to length(s1) do
begin
if s1=#10 then //如果到了段末
begin
s3:=s3+MyTrimLeft(Copy(s1,j,i-j+1));
j:=i+1;
end;
// 为了在长时间循环过程中不让程序看上去像死了一样,
// 可以在循环体中调用Application.ProcessMessages,
// 来处理Windows消息.
// 但是在本例中每次循环的时间很短,如果每次都调用
// Application.ProcessMessage,明显浪费时间,所以我
// 们指定一个循环次数,达到该次数后再处理Windows消
// 息. 或者把Application.ProcessMessages放到上面
// 的 if s1=#10 then 条件判断体内.
if i mod 100 = 0 then
Application.ProcessMessages;
end;
if j<i then
s3:=s3+MyTrimLeft(Copy(s1,j,i-j+1));
richedit2.Text:=s3;//把最后结果s3显示出来
end;
另一个用Pos函数的版本,比上一个看起来简单,执行效率上差一些
procedure TForm1.Button4Click(Sender: TObject);
var
s1,s3:string;
i,j:integer;
begin
s1:=richedit1.text
//s1就是需要排列的那段文字
i:=Pos(#10,s1);
while i>0 do
begin
s3:=s3+MyTrimLeft(Copy(s1,1,i));
Delete(s1,1,i);
i:=Pos(#10,s1);
Application.ProcessMessages;
end;
if s1<>'' then
s3:=s3+MyTrimLeft(s1);
richedit2.Text:=s3;//把最后结果s3显示出来
end;