Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > обработка событий IdFTP в потоке


Автор: uwannadie 21.5.2010, 16:56
установлена BDS 2010 architec
пытаюсь загрузить файл по фтп в потоке, используя TidFTP
Indy 10.5.5
Код

unit FTPThread;

interface

uses
  Classes, IdFtp, IdComponent;

type
  WorkThread = class(TThread)
  private
    ftpHost, ftpDir,
    ftpFile, ftpLocalPath,
    ftpUser, ftpPasswd: String;
    aFtp: TIdFTP;
    destructor Destroy;
  protected
    constructor Create(CreateSuspended: boolean);
    procedure Execute; override;
    procedure FTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
    procedure FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
  end;

implementation

uses main;

{ WorkThread }
procedure WorkThread.FTPWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  Form1.ProgressBar1.Position := AWorkCount;
end;

procedure WorkThread.FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  Form1.ProgressBar1.Max := aFtp.Size(ftpFile);
end;

constructor WorkThread.Create;
begin
  ftpHost := 'ftp.ncdc.noaa.gov';
  ftpDir := '/pub/data/inventories/';
  ftpFile := 'ISH-HISTORY.TXT';
  ftpUser := 'ftp';
  ftpPasswd := '[email protected]';
  ftpLocalPath := 'D:\' + ftpFile;
  aFtp := TIdFTP.Create(nil);
  aFtp.OnWork := FTPWork;
  aFtp.OnWorkBegin := FTPWorkBegin;
  inherited Create(CreateSuspended);
end;

destructor WorkThread.Destroy;
begin
  aFtp.Free;
  inherited Destroy;
end;
procedure WorkThread.Execute;
begin
  { Place thread code here }
  aFtp.Connect;
  aFtp.ChangeDir(ftpDir);
  aFtp.Get(ftpFile, ftpLocalPath);
  aFtp.Disconnect;
end;

end.

при компиляции ругается на строки
Код

 aFtp.OnWork := FTPWork;
 aFtp.OnWorkBegin := FTPWorkBegin;

Код

Checking project dependencies...
Compiling ftp_test.dproj (Debug configuration)
[DCC Warning] FTPThread.pas(15): W1010 Method 'Destroy' hides virtual method of base type 'TThread'
[DCC Error] FTPThread.pas(47): E2009 Incompatible types: 'Parameter lists differ'
[DCC Hint] FTPThread.pas(15): H2219 Private symbol 'Destroy' declared but never used
[DCC Fatal Error] ftp_test.dpr(7): F2063 Could not compile used unit 'FTPThread.pas'
Failed
Elapsed time: 00:00:00.3

в общем нипанятна  smile 

Автор: uwannadie 21.5.2010, 20:13
предыдущую проблему победил, заменив типы данных в 2х строках на Int64:
Код

procedure IdFtpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
procedure IdFtpWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);

теперь падает в куске с авторизацией:
Код

  ftpHost := 'ftp.ncdc.noaa.gov';
  ftpDir := '/pub/data/inventories/'; 
  ftpFile := 'ISH-HISTORY.TXT';
  ftpUser := 'ftp';
  ftpPasswd := '[email protected]';
  ftpLocalPath := 'D:\' + ftpFile;
  MyFtp.Username := ftpUser; //тут access violation вылезает
  MyFtp.Password := ftpPasswd;

Автор: uwannadie 21.5.2010, 20:34
кажется у меня паранойя: разговариваю сам с собой.
загвоздка была в том, что не отрабатывал конструктор, соответственно вылезала ошибка

Автор: uwannadie 21.5.2010, 22:34
вопрос решился путем отказа от глюкавой инди и написания функции загрузки, используя функции из wininet.pas

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)