![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
NMFTP + Nlist = Range check error [D6, Win2k]
Pavelkq © (2005-04-28 10:40:00)Здоавствуйте! Пишу ФТП-клиент для синхронизации локальной папки с сервером. Применил NMFTP. Код такой:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
TSL: TStringList;
begin
if NMFTP1.Connected then
NMFTP1.Disconnect
else
begin
NMFTP1.Vendor := NMOS_AUTO;
NMFTP1.Host:='hostname';
NMFTP1.Port:=21;
NMFTP1.TimeOut:=50000;
NMFTP1.UserID:='username';
NMFTP1.Password:='pass';
NMFTP1.Connect;
NMFTP1.ChangeDir('mydir');
end;
Memo2.Lines.Add('Соединились');
iii:=0; // - это тип Интегер
iiiTSL:=TStringList.Create;// - это TStringList
// Завел эту бадягу чисто для отладки. С ними список файлов на ФТП получается правильный, а без них почему-то в 8 раз меньше.
TSL:=TStringList.Create;// - сюда попадает список файлов на ФТП
Temp:='';// Тип Стринг
GetList;
ShowMessage(IntToStr(iii)+' '+IntToStr(iiiTSL.Count-1));
// Проверяю совпадение количества файлов.
TSL.Text:=copy(Temp,2,Length(Temp)-1);
TSL.Sorted:=true; // сортирую для дальнейшей обработки
For i:=0 to TSL.Count-1 do
Memo4.Lines.Add(TSL[i]);// вывожу
Memo4.Lines.Add(IntToStr(TSL.Count-1));// Тут же снова количество для отладки
// Дальше будет сравнение с локальным списком файлов.
end;
Procedure GetList();
begin
With Form1 do
begin
Timer1.Enabled:=true;// - включаю таймер, чтобы не зависло соединение. Может это и лишнее
Memo2.Lines.Add('Получаю список файлов');
Edit1.Visible:=True; // Тут отобразится процесс получения списка файлов
NMFTP1.NList;// Вот тут иногда вылетает та самая ошибка.
Edit1.Visible:=False;
Memo2.Lines.Add('Получен каталог '+Form1.NMFTP1.CurrentDir);
end;
end;
procedure TForm1.NMFTP1ListItem(Listing: String);
begin
Temp:=Temp+#13+Listing; // Собитаю список файлов для передачи в TStringList
Edit1.Text:=IntToStr(Length(Temp));// отображение процесса получения. Может можно по другому?
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Interval:=60000;
if NMFTP1.Connected then
NMFTP1.Disconnect;
Memo2.Lines.add('Таймер отключил');
end;
Так вот, иногда что-то не срабатывает и после команды NList вылетает ошибка Range Check Error. Может с таймером что-то напортачил?
Alexander Panov (2005-04-29 15:08:00) [1]Ты неправильно понимаешь работу подобных компонентов.
Они используют при работе событийную модель.
Разберись вот с этим примером, и тебе будет понятно, как работать с подобными компонентами.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Psock, NMFtp;
type
TForm1 = class(TForm)
NF: TNMFTP;
Button1: TButton;
me: TMemo;
procedure NFConnect(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure NFListItem(Listing: String);
procedure NFSuccess(Trans_Type: TCmdType);
private
{ Private declarations }
public
procedure Display(const s: String);
{ Public declarations }
end;
var
Form1: TForm1;
FtpList: TStringList;
implementation
{$R *.dfm}
procedure TForm1.NFConnect(Sender: TObject);
begin
NF.ChangeDir('pub');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
NF.Host := 'host';
NF.Port := 21;
NF.UserID := 'Anonymous';
NF.Password := 'anonymous@mail.ru';
me.Lines.Clear;
NF.Connect;
end;
procedure TForm1.Display(const s: String);
begin
me.Lines.Add(s);
end;
procedure TForm1.NFListItem(Listing: String);
begin
Display(Listing);
end;
procedure TForm1.NFSuccess(Trans_Type: TCmdType);
begin
case Trans_Type of
cmdChangeDir:
begin
FtpList := TStringList.Create;
NF.Nlist;
end;
cmdNList:
begin
me.Lines.AddStrings(FtpList);
FtpList.Free;
NF.Disconnect;
end;
end;
end;
end.
Pavelkq (2005-04-28 14:08:00) [2][1] Что Вы имеете в виду? У меня же if NMFTP1.Connected, то действие Дисконект. А только после условия идет вывод информации о соединении. В принципе, вполне возможно, что это лишнее. Но я взял из дельфийской справки.
Pavelkq (2005-04-28 13:58:00) [3]Разобрался с таймером. Получается эта фишка не то, чтобы не помогает, а наоборот, все портит. Убрал полностью таймер. Все пошло лучше. Но теперь вижу, что список файлов на FTP не всегда одинаковый. При общем количестве 829 файлов в списке оказывается от 828 до 832 файлов. При этом я переписал обработку получения списка файлов:
procedure TForm1.NMFTP1ListItem(Listing: String);
begin
TSL.Add(Listing);
Edit1.Text:=IntToStr(TSL.Count);
end;
В списке появляются остатки расширения файлов (rar, ar).
Cobalt (2005-04-28 13:15:00) [4]
if NMFTP1.Connected then
NMFTP1.Disconnect
else
begin
<skip>
NMFTP1.Connect;
NMFTP1.ChangeDir('mydir');
end;
Memo2.Lines.Add('Соединились');
if NMFTP1.Connected, то действие
Memo2.Lines.Add('Соединились'); будет неверным.
Это для начала.