//****** 定义部分代码
Type
    TStreamStruct=record
    Name:String;
    FileStream:TFileStream;
    IsSending:Boolean;
End; var
  m_ArrFileStream:array of TStreamStruct;//****** 实现部分代码
procedure TMainForm.*****(fileList:TStringList);                      //fileList存储的是文件的绝对路径,如:“D:\Tencent\QQ.exe”
var i:Integer;
Begin
 for i:=0 to fileList.Count-1 do
  begin
    System.SetLength(m_ArrFileStream,i+1);
    m_ArrFileStream[i].Name:= ExtractFileName(fileList.Strings[i]);  //问题出在这一句,如果改为i+1,则抛出异常
    m_ArrFileStream[i+1].IsSending:=False;
    m_ArrFileStream[i+1].FileStream:=TFileStream.Create(fileList.Strings[i],fmOpenRead);
  end;
End;Why? Help!

解决方案 »

  1.   

    把SetLength放到外面:System.SetLength(m_ArrFileStream, fileList.Count);另外i+1的那两个地方要做个判断,不然循环到最后一次的时候会越界最后自己控制下对记录中的FileStream的释放
      

  2.   

    Begin
      System.SetLength(m_ArrFileStream, fileList.Count);
     for i:=0 to fileList.Count-1 do
      begin
      m_ArrFileStream[i].Name:= ExtractFileName(fileList.Strings[i]); //问题出在这一句,如果改为i+1,则抛出异常
      m_ArrFileStream[i+1].IsSending:=False;
      m_ArrFileStream[i+1].FileStream:=TFileStream.Create(fileList.Strings[i],fmOpenRead);
      end;
    End;
      

  3.   

    System.SetLength(m_ArrFileStream,i+1); //取值索引是0 - i 共 i+1个取址范围
    [i+1]已经越界
    改为System.SetLength(m_ArrFileStream,i+2);  System.SetLength(m_ArrFileStream,fileList.Count);
     for i:=0 to fileList.Count-1 do
      begin
      m_ArrFileStream[i].Name:= ExtractFileName(fileList.Strings[i]);
      m_ArrFileStream[i].IsSending:=False;
      m_ArrFileStream[i].FileStream:=TFileStream.Create(fileList.Strings[i],fmOpenRead);
      end;
    End;
      

  4.   

    Dephi的Array真有点让我摸不着头脑了var arrIn:array of Integer;  SetLength(arrIn,1);
      arrIn[0]:=10;
      arrIn[1]:=10;
      arrIn[2]:=10;都指定长度为1了,为何上面代码不会报错?
      

  5.   

    总结:    一、SetLength倒不一定要在外面,它所在的位置不关键,关键是数组的索引不能出界了;    二、最后我是这样写的:  for i:=0 to fileList.Count-1 do
      begin
        System.SetLength(m_ArrFileStream,i+1);
        m_ArrFileStream[i].Name:= ExtractFileName(fileList.Strings[i]);;
        m_ArrFileStream[i].IsSending:=False;
        m_ArrFileStream[i].FileStream:=TFileStream.Create(fileList.Strings[i],fmOpenRead);
      end;结帖给分!