为什么总是会出现 list index out bounds(0) 错误 ( 积分: 50 )

  • 主题发起人 主题发起人 warket
  • 开始时间 开始时间
W

warket

Unregistered / Unconfirmed
GUEST, unregistred user!
我将一个文本文件读入,然后通过splitstring函数分割出来放到Tstringgrid里面,我看程序应该没有什么错误,但是总是出现list index out bounds(0)错误,不知道什么原因。
function SplitString(const Source,ch:string):TStringList;
var
temp:string;
i:Integer;

begin
Result:=TStringList.Create;
//如果是空自符串则返回空列表
if Source=''
then exit;
temp:=Source;
i:=pos(ch,Source);
while i<>0 do
begin
Result.add(copy(temp,0,i-1));
Delete(temp,1,i);
i:=pos(ch,temp);
end;
Result.add(temp);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
f:textfile;
s:string;
i:integer;
temps:TStringList;
begin
//*****读取初始化文件,包括邮件接收人,发送人的邮件地址和邮件帐号密码
//*****************************************
//初始化表格
sg1.Cells[0,0]:='序号';
sg1.ColWidths[0]:=30;
sg1.Cells[1,0]:='主题';
sg1.ColWidths[1]:=160;
sg1.Cells[2,0]:='文件名';
sg1.ColWidths[2]:=460;
sg1.Cells[3,0]:='发送时间';
sg1.ColWidths[3]:=93;
sg1.Cells[4,0]:='完成状态';
i:=0;
temps:=TStringList.Create;
temps.Sort;
assignfile(f, ExtractFilePath(Application.ExeName )+'sendtask.txt');
reset(f);
while not eof(f) do
begin
i:=i+1;
Readln(F, S);
temps:= SplitString(s,';');
if sg1.RowCount<i then
sg1.RowCount:=i;
sg1.Cells[0,i]:=' '+inttostr(i);
sg1.Cells[1,i]:=temps[0];
sg1.Cells[2,i]:=temps[2];
sg1.Cells[3,i]:=temps[2];
//sg1.Cells[4,i]:=temps[3];
end;
temps.Free;
CloseFile(F);
end;
 
//你的代码太多问题了.第一是内存泄露了
//第二是没有判断TStrings的索引是否超出范围
procedure TForm1.FormCreate(Sender: TObject);
var
f:textfile;
s:string;
i,J, vCount:integer;
temps:TStringList;
begin
//*****读取初始化文件,包括邮件接收人,发送人的邮件地址和邮件帐号密码
//*****************************************
//初始化表格
sg1.Cells[0,0]:='序号';
sg1.ColWidths[0]:=30;
sg1.Cells[1,0]:='主题';
sg1.ColWidths[1]:=160;
sg1.Cells[2,0]:='文件名';
sg1.ColWidths[2]:=460;
sg1.Cells[3,0]:='发送时间';
sg1.ColWidths[3]:=93;
sg1.Cells[4,0]:='完成状态';
i:=0;
//temps:=TStringList.Create;
//temps.Sort;
{删除上面两条语句}
assignfile(f, ExtractFilePath(Application.ExeName )+'sendtask.txt');
reset(f);
while not eof(f) do
begin
i:=i+1;
Readln(F, S);
temps:= SplitString(s,';');
if sg1.RowCount<i then
sg1.RowCount:=i;
vCount := temps.count - 1;
sg1.Cells[0,i]:=' '+inttostr(i);
if vCount >= 0 then sg1.Cells[1,i]:=temps[0];
if vCount >= 2 then sg1.Cells[2,i]:=temps[2]; //这里是1 还是2 ????
if vCount >= 2 then sg1.Cells[3,i]:=temps[2];
//sg1.Cells[4,i]:=temps[3];
temps.Free
end;
//temps.Free; 这句移到循环内
CloseFile(F);
//随便修改了一下你看看吧
 
这样的错误仔细跟踪下代码,应该容易查出来的
 
SplitString在两种情况下会返回空,异常是由指针越界引起的。
 
肯定是越界了,到了没有定义的范围
 
谢谢各位,我自己找到答案了,因为度的文件含有空行。
不过分数还是要发的:)
 
后退
顶部