Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FTP & INDY [D7]


stepan_mk ©   (2005-08-05 11:19:00) 

DELPHI7
INDY10
есть такой код
 
...
var s:TstringList;
...
BEGIN
...
if ftp.Connected
  then
   begin
   s:=TStringList.Create;
    ftp.List(s);
...



На комаде list получаю ошиПку Index out of bounds(0)
ПРОЧЕМУ? И как сделать чтоб не возникала?


Alexander Panov   (2005-08-06 17:32:00) [1]

stepan_mk   (05.08.05 14:59) [5]
1. Не врубился что означает
SendMessage(FHandle,FMessage,100,Integer(List));


Так организована передача результата из одного потока в другой(основной). Передается ссылка на TStringList.


stepan_mk   (2005-08-05 14:59:00) [2]

1. Не врубился что означает
SendMessage(FHandle,FMessage,100,Integer(List));
2. На Indy 9 у меня всё пахало.


Alexander Panov   (2005-08-05 14:31:00) [3]

Вот пример. Правда Инди версии 9. Но думаю, что тут отличий не должно быть.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

var
 WM_FTPEndGetFile: Cardinal;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 public
   procedure MyWndProc(var Message: TMessage);
 end;

var
 Form1: TForm1;

implementation

uses uSimpleGetFTP;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Enabled := False;
 TSimpleGetFTP.Create('ftp.almar.net.ru','!readme.txt','!readme.txt',Handle,WM_FTPEndGetFile);
end;

procedure TForm1.MyWndProc(var Message: TMessage);
begin
 if Message.Msg = WM_FTPEndGetFile then
 begin
     Button1.Enabled := True;
     case Message.WParam of
     0: ;
     1: ;
     2: ;
     100: Memo1.Lines.Assign(TStringList(Message.LParam));
     end;
     Message.Result := 0;
     Exit;
 end;
 WndProc(Message);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.Title := Self.Caption;
 WM_FTPEndGetFile := RegisterWindowMessage(PChar(Application.Title+IntToStr(Application.Handle)));
 WindowProc := MyWndProc;
end;

end.


unit uSimpleGetFTP;

interface

uses
 Classes, Windows,IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdFTP, IdFTPCommon;

type
 TSimpleGetFTP = class(TThread)
 private
   FHandle: THandle;
   FMessage: Cardinal;
   FFTP: TIdFtp;
   FUrl,FSrcFile,FDestFile: String;
 protected
   procedure Execute; override;
 public
   constructor Create(const aURL, aFile, aDestFile: String; aHandle: THandle; IdMessage: Cardinal);
   destructor Destroy; override;
 end;

implementation

constructor TSimpleGetFTP.Create(const aURL, aFile, aDestFile: String; aHandle: THandle; IdMessage: Cardinal);
begin
 inherited Create(True);
 FreeOnTerminate := True;
 FUrl := aUrl;
 FSrcFile := aFIle;
 FDestFIle := aDestFIle;
 FHandle := aHandle;
 FMessage := idMessage;
 Resume;
end;

destructor TSimpleGetFTP.Destroy;
begin
 FFtp.Free;
 inherited;
end;

procedure TSimpleGetFTP.Execute;
var
 Err: Cardinal;
 List: TStringList;
begin

List := TStringList.Create;
try
 FFtp := TIdFtp.Create(nil);
 FFtp.Host := FUrl; //+';';
 FFtp.Password := 'aaa@aaa.aaa';
 FFtp.Username := 'Anonymous';
 FFtp.TransferType := ftBinary;
 FFTp.Passive := True;
 Err := 0;

 try
   if Err=0 then FFTP.Connect;
 except
   Err := 1;
 end;

 try
   if Err=0 then
   begin
//      FFtp.ChangeDirUp;
//      FFtp.ChangeDir('/pub/farplugins/');
     FFtp.List(List);
     SendMessage(FHandle,FMessage,100,Integer(List));
   end;
 except
   Err := 3;
 end;

 try
   if Err=0 then FFTP.Get(FSrcFile,FDestFile,True,False);
 except
   Err := 2;
 end;

 try
   FFTP.Disconnect;
 except
 end;
 SendMessage(FHandle,FMessage,Err,0);
finally
 List.Free;
end;
end;

end.


stepan_mk   (2005-08-05 14:10:00) [4]

У меня пере етим есть Connect, Get, и ещё куча кода.
А потом ели надо то ищется нужний файл в директории


Alexander Panov   (2005-08-05 13:13:00) [5]

stepan_mk   (05.08.05 12:32) [1]

TIdFtp - событийно-зависимый компонент. Следовательно, выполнять некоторое действие(в данном случае List), надо по наступлению некоторого события.
У тебя это событие - OnConnect(либо подобное).
Подробнее см. в справке.


stepan_mk   (2005-08-05 12:32:00) [6]

пропобал и так писать
...
BEGIN
...
if ftp.Connected
 then
  begin
   ftp.List;
...
ОшиПка та же


Наверх

Титульная страница Поиск, карта сайта Написать письмо