把一个文件里的第一行,和最后一行去掉,然后把之间连续超过三行的空行,替换成一行但在循环的时候,为什么报错了?
请高人指点,谢了unit Main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,shellapi;type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    SpeedButton1: TSpeedButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure SpeedButton1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure RepTxt(file1:string);
    Procedure ReplaceTxt(file1:string);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.RepTxt(file1:string);
var
    sl:TStringlist ;
    i:Integer; 
    str:string;  
begin
    sl:=TStringList.Create;
    try
        sl.LoadFromFile(file1);
        if checkbox1.Checked then
             sl.Delete(0);
        if CheckBox2.Checked then
             sl.Delete(sl.Count-1);        for i := 0 to sl.Count-1  do
        begin
            str:=IntToStr(i);
            if trim(sl.Strings[i])=''  then//空行
                sl.Delete(i);    
        end;     
         
        
        sl.SaveToFile('C:\tmp.txt');
    except
        ShowMessage(str);
        Free;
    end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
    begin
        Edit1.Text:=OpenDialog1.FileName;
    end;
    
end;//空行操作
procedure TForm1.Button2Click(Sender: TObject);
begin
    RepTxt(Trim(Edit1.Text));
end;end.

解决方案 »

  1.   

    sl.Delete(i);
    删除之后Stringlist里面的各行的序号都变了,你再循环肯定错误了,
    你可以先把你找到的空行的编号记录下来,然后最后一次性删除
      

  2.   

    從前往後刪,可能會引起index越界而發生錯誤。改成從後往前刪。
      

  3.   


          for i := sl.Count-1 downto 0  do
          begin
            str:=IntToStr(i);
            if trim(sl.Strings[i])=''  then//空行
               sl.Delete(i);    
          end;   
      

  4.   

      
       var
        IsOne :Boolean;
        
          for i := sl.Count-1 downto 0  do
          begin
            str:=IntToStr(i);
            if trim(sl.Strings[i])=''  then//空行
             begin
              if not IsOne then //是第一行记住,并跳过
              begin
                IsOne := True; 
                continue;
              end;
               sl.Delete(i);//其它行删掉
            end
            else
              IsOne := False; //不是空行,取消记录   
          end;   
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s1: TStringList;
      I : Integer;
      str: string;
      DelAry: array of Integer;
    begin
      s1 := TStringList.Create;
      Str:= Trim(Edit1.Text);  for I := 1 to Length(Str)  do  {字符串第一位是#0,这里不需要}
        s1.Add(str[I]);  for I := s1.Count -1 downto 0 do
      begin
        if Trim(s1.Strings[I]) = ''  then
        begin
          SetLength(DelAry,Length(DelAry)+1);
          DelAry[High(DelAry)] := I;
        end;
      end;  if High(DelAry) < 2  then
      begin
        for I := Low(DelAry) to High(DelAry) do
          s1.Delete(DelAry[I]);
      end else begin
        I:= Low(DelAry);
        while I+2 <= High(DelAry) do
        begin
          if (DelAry[I+1]-DelAry[I]=-1) and (DelAry[I+2]-DelAry[I+1]=-1) then
          begin
            s1.Delete(DelAry[I]);
            S1.Delete(DelAry[I+1]);
          end else begin
            s1.Delete(DelAry[I]);
            S1.Delete(DelAry[I+1]);
            s1.Delete(DelAry[I+2]);
          end;
          if (I+2) = High(DelAry) then  Break else I:= I+3;
        end;
        if I=High(DelAry) then
          s1.Delete(DelAry[I]);
        if I+1 = High(DelAry) then
        begin
          s1.Delete(DelAry[I]);
          s1.Delete(DelAry[I+1]);
        end;
      end;  Str := '';
      for I := 0 to s1.Count -1 do
        Str := Str + s1.Strings[I];
      Edit1.Text := str ;  s1.Free;
    end;end.
    自己瞎写个 给你参考
      

  6.   

    重新贴下unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      s1: TStringList;
      I : Integer;
      str: string;
      DelAry: array of Integer;
    begin
      s1 := TStringList.Create;
      Str:= Trim(Edit1.Text);  for I := 1 to Length(Str)  do  {字符串第一位是#0,这里不需要}
        s1.Add(str[I]);  for I := s1.Count -1 downto 0 do
      begin
        if Trim(s1.Strings[I]) = ''  then
        begin
          SetLength(DelAry,Length(DelAry)+1);
          DelAry[High(DelAry)] := I;
        end;
      end;  if High(DelAry) < 2  then
      begin
        for I := Low(DelAry) to High(DelAry) do
          s1.Delete(DelAry[I]);
      end else begin
        I:= Low(DelAry);
        while I+2 <= High(DelAry) do
        begin
          if (DelAry[I+1]-DelAry[I]=-1) and (DelAry[I+2]-DelAry[I+1]=-1) then
          begin
            s1.Delete(DelAry[I]);
            S1.Delete(DelAry[I+1]);
          end else begin
            s1.Delete(DelAry[I]);
            S1.Delete(DelAry[I+1]);
            s1.Delete(DelAry[I+2]);
          end;
          if (I+2) = High(DelAry) then  Break else I:= I+3;
        end;
        if I=High(DelAry) then
          s1.Delete(DelAry[I]);
        if I+1 = High(DelAry) then
        begin
          s1.Delete(DelAry[I]);
          s1.Delete(DelAry[I+1]);
        end;
      end;  Str := '';
      for I := 0 to s1.Count -1 do
        Str := Str + s1.Strings[I];
      Edit1.Text := str ;  s1.Free;
    end;end.