我的上传过程是这样的首先选择上传路径 用listview列举出要上传的文件 
listview.checkboxes =true 可以选择多个文件或单个文件上传  循环listview 开始上传选中的文件fstream := TFileStream.Create(lvItem.SubItems[0],fmOpenRead);
 ftpClient.Put(fstream,lvItem.Caption,false);我创建了线程单元 本想调用整个函数 可总报内存错误
后来 实在不行只把 put 一步 放到线程里 也报错 
刚刚接触线程 多多指教!

解决方案 »

  1.   

    上传部分 放到线程里执行是可以的!
    但是你不要寄望Indy自己没Bug!
    对Indy源码的必要修改有时候是必要的
      

  2.   

    我的indy 已经不是自带的了  indy 9现在的问题是我不会把上传部分做到线程里面去   贴出原码 大家看看
    procedure TfrmMirrorSend.UpLoadItem(lvItem: TListItem);
    var
      Fstream: TFileStream;
      ftpup:ftp ;begin
      try
        IsTransmit := True;
        
        fstream := TFileStream.Create(lvItem.SubItems[0],fmOpenRead);
        try
          //首先对表操作
          if SignIsoTable(strIsoID,lvItem.Caption,lvItem.SubItems[0]) then
          begin      lvItem.SubItems[2]:= '发送中';
         
           ftpClient.Put(fstream,lvItem.Caption,false);
          //上传完毕
          ggFileSend.Progress :=0;
          lvItem.SubItems[2] := '已发送';      IsTransmit := False;
          end;     finally
           fstream.Free;
          chdir(SysCfg.strFilePath);      
          lvItem.Update;
         end;  except
        ggFileSend.Progress :=0;
        IsTransmit := False;
        lvItem.SubItems[2] := '错误';
      end;
    end;就是这一句想放到线程函数里 怎么写呢 
     ftpClient.Put(fstream,lvItem.Caption,false);
      

  3.   

    在你的线程里面用CoInitialize初始化一下
    线程结束的时候要记得CoUninitialize;