当IDFTP是从控件面板拖过去的时候,我可以直接在Events里找到Onwork事件双击现在的IDFTP是在进程中动态生成的,如何让刷新主线程的界面啊

解决方案 »

  1.   

    动态绑定事件
    http://hi.baidu.com/daoshan/blog/item/1feaa3cc5fd7a20e01e92807.html
      

  2.   


    unit Unit2;interface
    uses Classes,IdFTP,dialogs,SysUtils,windows,IdComponent,IDException,WinSock;
    function connFtp(fileName:String):boolean;type
      TOrderSThread = class(TThread)
        filePath:string;
      protected
        procedure updateData(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
        procedure Execute; override;
      end;implementation
      uses unit1;procedure TOrderSThread.Execute;
    begin
      FreeOnTerminate := True;
      connFtp(filePath);
    end;
    function connFtp(fileName:String):boolean;
    var
    IdFTP:TIdFTP;
    fs: TFileStream;
    tempStrem:TMemoryStream;
    iFileSize:integer;
    begin
    try
      fs := TFileStream.Create(fileName, fmOpenReadWrite);
      IdFTP := TIdFTP.Create(nil);
      IdFtp.OnWork := updateData;
      IdFTP.Host := '192.168.2.230';
      IdFTP.Port := 21;
      IdFTP.Username := 'admin';
      IdFTP.Password := '123456';
      if not idftp.Connected then
      IdFTP.Connect();  iFileSize := IdFTP.Size(ExtractFileName(fileName));
      if iFileSize = -1 then
      begin
        idftp.Put(fs,ExtractFileName(fileName));
      end
      else if fs.Size <= iFileSize then
      begin
        SendMessage(Form1.Handle,WM_FTPWORK,1,iFileSize);
      end
      else
      begin
        tempStrem := TMemoryStream.Create;
        while fs.Size > iFileSize do
        begin
          fs.Position := iFileSize;
          if fs.Size - iFileSize > 1048576 then
          begin
            tempStrem.CopyFrom(fs,1048576);
            iFileSize := iFileSize + 1048576;
          end
          else
          begin
            tempStrem.CopyFrom(fs,fs.Size-iFileSize);
            iFileSize := fs.Size;
          end;
          IdFTP.Put(tempStrem, ExtractFileName(fileName), true);//最后一个参数就是打开Append,续传方式
          tempStrem.Clear;
        end;
      end;
    except
      on E:EIdSocketError do
      begin
        SendMessage(Form1.Handle,WM_FTPWORK,0,e.LastError);
      end;end;
    end;
    procedure TOrderSThread.updateData(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      SendMessage(Form1.Handle,WM_FTPWORK,0,integer(pchar(timetostr(Now))));
    end;
    end.运行时提示 [Error] Unit2.pas(34): Undeclared identifier: 'updateData'