Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - ProgressBar che indichi l'avanzamento di un download Ftp
Forum - Delphi - ProgressBar che indichi l'avanzamento di un download Ftp

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Ciao a tutti volevo chiedere come far corrispondere l'avanzamento di una progressbar al processo di download via ftp di un file.
Io avevo pensato di fare una cosa del genere:
Impostare il valore massimo della ProgressBar come la grandezza del file da scaricare. Con un TTimer posto ogni millisecondo o 10 millisecondi vedere qual'è la dimensione del file scaricato e impostarlo come la sua ProgressBar.Position.
Cosicchè ho provato ma mi sono accorto di una cosa:
quando arriva al codice ftp.Get(...) in realtà blocca tutti i processi e solo dopo fa partire il TTimer..
Come posso far eseguire il TTImer e la ProgressBar di conseguenza, DURANTE il processo di download?
Grazie

PM Quote
Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Segnala al moderatore
Postato alle 14:30
Mercoledì, 17/02/2010
per motrare l'avanzamento con una barra quando si copia un file si usa:

var
  FromF,
  ToF        : file of byte;
  Buffer     : array[0..4096] of char;
  NumRead    : integer;
  FileLength : longint;
begin
  AssignFile(FromF,Source);
  reset(FromF);
  AssignFile(ToF,Destination);
  rewrite(ToF);
  FileLength:=FileSize(FromF);
  With Progressbar1 do
  begin
    Min := 0;
    Max := FileLength;
    while FileLength > 0 do
    begin
      BlockRead(FromF,Buffer[0],SizeOf(Buffer),NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF,Buffer[0],NumRead);
      Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
end;

potresti modificarlo e ottenere ciò che desideri

PM Quote
Avatar
alessandrob (Normal User)
Newbie


Messaggi: 17
Iscritto: 19/01/2010

Segnala al moderatore
Postato alle 15:03
Mercoledì, 17/02/2010
Se devi vedere il progress del download Ftp ed utilizzi i componenti di delphi puoi utilizzare gli eventi corrispondenti:

Per il "vecchio" TNMFTP esiste l'evento
  OnPacketRecvd: TNotifyEvent;
che ti informa dell'arrivo di dati e le proprietà
  BytesRecvd
  BytesTotal
per sapere a che punto sei arrivato.

Se utilizzi i componenti Indy, puoi utilizzare gli eventi WorkBegin, Work e WorkEnd, dove trovi indicazioni sul numero di byte totali e ricevuti.

Alessandro

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 17:22
Mercoledì, 17/02/2010
Ciao alessandro. Io uso il componente IndyClient.
Molto interessante questa idea della proprità Work.
Mi potresti spiegare COME potrei usarla... cioè il mio problema era infatti quello di poter DETTAGLIARE il processo di Download DURANTE il download...
e non riesco a capire come mettere insieme i due processi.
Grazie mille anticipatamente

PM Quote
Avatar
alessandrob (Normal User)
Newbie


Messaggi: 17
Iscritto: 19/01/2010

Segnala al moderatore
Postato alle 18:32
Mercoledì, 17/02/2010
Un estratto dal codice che utilizzo io direttamente, con alcune piccole spiegazioni: ho creato una estensione del controllo IdFtp, per cui quello che segue è solo una piccola parte del codice completo, che tra le altre cose funziona da dentro una DLL.

Ovviamente puoi anche usare il controllo direttamente in un form, posizionarci il controllo TIdFtp e gestire direttamente gli eventi.

In particolare, nel mio caso, il form FFc è un form dedicato alla visualizzazione dello stato di avanzamento del download e deve essere creato prima di iniziare il processo di download vero e proprio: su questo form è posizionata la progressbar (pbSess).

Eseguo inoltre una verifica di superamento del massimo durante l'avanzamento vero e proprio.

Di seguito il codice, spero che ti possa essere utile.

type
  TMyIdFtp = class( TIdFtp )
  private
    FFc: TFrmDump;
   ...
  end;

procedure TMyIdFtp.DoMyIdFtpWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);
begin
{ --- Inizio --- }
  if FFc <> Nil
    then begin
      FFc.pbSess.Position := 0;
      FFc.pbSess.Max := AWorkCountMax;
      FFc.pbSess.Visible := True;
      FFc.pbSess.Update;
    end;
end;

procedure TMyIdFtp.DoMyIdFtpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
{ --- Verifica di Sicurezza --- }
  if FFC <> Nil
    then begin
      if AWorkCount > FFc.pbSess.Max
        then FFc.pbSess.Max := 2 * FFc.pbSess.Max;

     { --- Avanzamento --- }
      FFc.pbSess.Position := AWorkCount;
      FFc.pbSess.Update;
    end;
end;

procedure TMyIdFtp.DoMyIdFtpWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
{ --- Completato --- }
  if FFc <> Nil
    then begin
      FFc.pbSess.Position := FFc.pbSess.Max;
      FFc.pbSess.Visible := False;
      FFc.pbSess.Update;
    end;
end;

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:21
Mercoledì, 17/02/2010
Ciao ho posto il tuo codice all'interno della stessa form ma non funziona...
ti posto il mio codice:
Codice sorgente - presumibilmente Delphi

  1. procedure TMainForm.Button2Click(Sender: TObject);
  2. begin
  3.   ind:= ListBox1.ItemIndex;
  4.   names:=  ftp.DirectoryListing.Items[ind].FileName;
  5.   ftp.Get(names, 'C:\'+names,False);
  6. end;
  7.  
  8. procedure TMainForm.ftpWork(ASender: TObject; AWorkMode: TWorkMode;
  9.   AWorkCount: Int64);
  10. begin
  11.   if MainForm <> Nil
  12.     then begin
  13.       if AWorkCount > Pb.Max
  14.         then Pb.Max := 2 * Pb.Max;
  15.       Pb.Position := AWorkCount;
  16.       Pb.Update;
  17.     end;
  18. end;
  19.  
  20. procedure TMainForm.ftpWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  21.   AWorkCountMax: Int64);
  22. begin
  23.   if MainForm <> Nil then
  24.     begin
  25.       Pb.Position:= 0;
  26.       Pb.Max:= AWorkCountMax;
  27.       Pb.Visible:= True;
  28.       Pb.Update;
  29.     end;
  30.  
  31. end;
  32.  
  33. procedure TMainForm.ftpWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
  34. begin
  35. { --- Completato --- }
  36.   if MainForm <> Nil
  37.     then begin
  38.       Pb.Position := Pb.Max;
  39.       Pb.Visible := True;
  40.       Pb.Update;
  41.     end;
  42. end;



Button2 è quello che utilizzo per il download... non riesco proprio a capire perchè non va!
Grazie..

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:57
Mercoledì, 17/02/2010
mi sono solo accorto aggiungendo dei ShowMessage per monitorare i processi che in realtà AWorkCountMax = 0
Come mai!? Come risolvo il tutto?

PM Quote
Avatar
alessandrob (Normal User)
Newbie


Messaggi: 17
Iscritto: 19/01/2010

Segnala al moderatore
Postato alle 15:35
Giovedì, 18/02/2010
Probabilmente gli eventi non sono agganciati al controllo.

Dovresti provare a selezionare il controllo IdFtp e nella finestra Object Inspector, pagina Events, per gli eventi OnWork, OnWorkBegin, OnWorkEnd (che probabilmente sono vuoti) eseguire un doppio click con il mouse.

Dovrebbe a questo punto apparire l'aggancio con l'evento (la procedura che ti ho descritto sopra)

Ti cosiglio inoltre di rimuovere il test
  if MainForm <> Nil ...
visto che lavori direttamente nel form principale.

A questo punto, durante il download, dovresti quanto meno verificare se il codice passa per gli eventi di cui sopra.

Ti consiglio di non usare i messagebox per i test di verifica, ma di inserire un controllo TMemo e aggiungere una linea per ogni volta che passa per l'evento di interesse.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:50
Giovedì, 18/02/2010
E' esattamente quello che ho fatto...
Il codice passa per gli eventi e infatti gli showmessage, siano utili o no, che ci metto dentro si avviano. Il problema è che AWorkCount mi restituisce un valore numerico maggiore di zero ma proprio la funzione AWorkCountMax mi restituisce 0. E perciò è ovvio che la progressbar non funzioni avendo come MAX 0.
Non riesco a capire come risolvere.

PS: ho anche tolto quel controllo Nil, ho provato di tutto...:d

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo