自定义的过程:procedure TForm1.downFile_Dir(s_sourcepath:string;s_dest:string; c_ftp:TIdFTP);
var
  LS: TStringList;
  FileCount: Integer;
begin
LS := TStringList.Create;
if  StrRScan(pchar(s_dest),'\')<>'\' then
   s_dest:=s_dest+'\';
try
    c_ftp.ChangeDir(s_sourcepath);
    c_ftp.List(LS);
   for  FileCount:=0 to LS.Count-1 do
   begin
    with c_ftp.DirectoryListing.Items[FileCount] do
      if  ItemType = ditDirectory  then //文件夹
        begin
              MkDir(s_dest+filename);
            downFile_Dir(filename,s_dest+filename, c_ftp);
         end
      else
        begin
           c_ftp.Get(filename,s_dest+FileName,true);
         end
    end;
finally
 LS.Free;
  c_ftp.ChangeDirUp;
  ShowMessage(c_ftp.RetrieveCurrentDir);
end;
end;调用的结果是它可以往文件夹里面去,但是目录数的子叶完了以后,返回上一层时就出错了.
我想是不是过程中调用的c_ftp:TIdFTP是不是没有创建新的实例,导致list index out of bounds。
不知有什么解决的好办法?

解决方案 »

  1.   

    我已经分析到原因了。
    其实就是参数c_ftp:TIdFTP传过来是没有创建副本。就相当于这样的问题:
    procedure TForm1.bb(e: Tedit;s:string);
    begin
        e.text:=s;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    bb(edit1,'sadfasdfsa');//edit1是一个文本框
    end;
    本人初学才两天,不知道应该如何在过程中将传过来的对象参数创建新的副本,还望能者多帮忙。感谢感谢!