Pasek postępu pobierania pliku z FTP Indy 10.2.0.3 + Lazaus

0

Witam.

Prubuję zrobić pasek postępu pobierania pliku z FTP.
Zgodnie z tym co znalazłaem tutaj: IdFTP i IdFTPServer - podstawowe procedury
w zdarzeniu

IdFTP1WorkBegin 

wpisałem:

ProgressBar1.Max:=AWorkCountMax;
ProgressBar1.Position := 0;
Application.ProcessMessages;   

Jednak AWorkCountMax zwraca wartość 0...
Dlaczego ?

W zdarzeniu

IdFTP1Work

Wpisałem:

ProgressBar1.Position := AWorkCount;
LOGUJ(IntToStr(AWorkCount));
 Application.ProcessMessages;  

Procedura LOGUJ zapisuje dane ze zmiennej do pliku.
Tutaj działanie jest poprawne:

08:42:57  7322
08:42:58  2811
08:42:59  3317
08:43:00  3511
08:43:00  3234
08:43:01  3396
08:43:02  3568
08:43:09  32768
08:43:09  65536
08:43:09  98304
08:43:09  131072
08:43:09  163840
08:43:10  196608
08:43:10  229376
08:43:10  262144
08:43:10  294912
08:43:10  327680
08:43:10  360448
08:43:10  393216
08:43:10  425984
08:43:10  458752
08:43:10  491520
08:43:10  524288
08:43:10  557056
08:43:10  589824
08:43:10  622592
08:43:10  655360
08:43:10  688128
08:43:10  720896
08:43:10  753664
08:43:10  786432
08:43:10  819200
08:43:10  851968
08:43:10  884736
08:43:10  917504
08:43:10  950272
08:43:10  983040
08:43:10  1015808
08:43:10  1048576
08:43:10  1081344
08:43:10  1114112
08:43:10  1146880
08:43:10  1179648
08:43:10  1212416
08:43:10  1245184
08:43:10  1277952
08:43:10  1310720
08:43:10  1343488
08:43:10  1376256
08:43:10  1409024
08:43:10  1441792
08:43:10  1474560
08:43:10  1507328
08:43:10  1540096
08:43:10  1572864
08:43:10  1605632
08:43:10  1638400
08:43:11  1671168
08:43:11  1703936
08:43:11  1736704
08:43:11  1769472
08:43:11  1802240
08:43:11  1835008
08:43:11  1867776
08:43:11  1900544
08:43:11  1933312
08:43:11  1966080
08:43:11  1998848
08:43:11  2031616
08:43:11  2064384
08:43:11  2097152
08:43:11  2129920
08:43:11  2162688
08:43:11  2195456
08:43:11  2228224
08:43:11  2260992
08:43:11  2293760
08:43:11  2326528
08:43:11  2359296
08:43:11  2392064
08:43:11  2424832
08:43:11  2457600
08:43:11  2490368
08:43:11  2523136
08:43:11  2555904
08:43:11  2566144 

Co nie tak jest z tym AWorkCountMax?

Z góry dziękuję za pomoc.

1

proszę bardzo https://www.google.pl/search?q=indy+idftp+AWorkCountMax - w drugim linku z góry masz ładnie wyjaśnione dlaczego nie działa i nie ma prawa działać i jak to zrobić poprawnie. Ale lepiej zapytać zamiast poświęcić 10s na wpisanie pytania do googla i 30s na jego przeanalizowanie...

0

Drugim odnośnikiem jest strona z której korzystałem (pisałem o tym w pierwszym poście).
To co wpisałem w zdarzeniach wzięte jest właśnie z tej strony, mimo to nie działa stąd pytanie na forum.

2

ja pier***

With that said, AWorkCountMax will only be valid on uploads, never on downloads. The reason for this is because The FTP protocol does not transmit the file size during transfers, so TIdFTP does not know the size of a file being downloaded, only the size of the local file being uploaded. For a download, you will have to retrieve the file size manually first, either with TIdFTP.Size(), TIdFTP.List(), or TIdFTP.ExtListItem().

0

Ja mam chyba inne google bo tego nie znalazłem ...
W każdym razie działa - dziękuję serdecznie.


EDIT

Swoją drogą wydaję mi się że w taki razie w artykule:
IdFTP i IdFTPServer - podstawowe procedury
jest błąd...

0

drugi link z googla u mnie to http://stackoverflow.com/questions/17498198/indy-ftp-doesnt-load-correctly-a-progress-bar tylko, że trzeba oprócz pierwszego postu z pytaniem przeczytać jeszcze odpowiedzi

0

A u mnie na Indy 10.1.5 tamto nie działa bo:

  1. Nikt tam nie napisał że metoda FileSize działa tylko po zmianie typu transferu na binarny
  2. metoda FileSize musi być wywołana przed rozpoczęciem pobierania czyli przed GET (w OnWorkBegin już nie działa) działający (przynajmniej w tej wersji Indy przykład):
//fTotalFileSize: Int64;
procedure TForm1.btnTestClick(Sender: TObject);
var
  fs: TFileStream;
begin
  fs:= TFileStream.Create('D:\wrar500pl.exe', fmCreate or fmOpenWrite);
  try
  IdFTP.Passive:= True;
  IdFTP.UserName:= 'anonymous';
  IdFTP.Password:= '[email protected]';
  IdFTP.Host:= 'ftp.rarlab.com';
  IdFTP.TransferType:= ftBinary;
  if (IdFTP.Connected = False) then
  begin
    IdFTP.Connect;
    try
      if (IdFTP.Connected = True) then
      begin
        fTotalFileSize:= IdFTP.Size('rar/wrar500pl.exe');
        IdFTP.Get('rar/wrar500pl.exe', fs);
      end;
    finally
      if (IdFTP.Connected = True) then
        IdFTP.Disconnect;
    end;
  end;
  finally
  fs.Free;
  end;
end;

procedure TForm1.IdFTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if (AWorkMode = wmRead) and (fTotalFileSize > 0) then
  begin
    ProgressBar1.Position:= (AWorkCount * 100) div fTotalFileSize;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1