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 - Problema avanzamento Download con ProgressBar.
Forum - Delphi - Problema avanzamento Download con ProgressBar.

Avatar
Mario84 (Normal User)
Newbie


Messaggi: 8
Iscritto: 24/11/2014

Segnala al moderatore
Postato alle 22:07
Domenica, 28/12/2014
Salve a tutti e auguri di buon natale a tutti voi del Forum. E da giorni ormai che provo e riprovo ad inserire una ProgressBar in questo codice di scambio di file. C'è qualcuno che puoi aiutarmi a capire come fare e magari commentarmi il codice con i suoi vari passaggi? Ringrazio tutti anticipatamente per il vostro aiuto.
Codice sorgente - presumibilmente Delphi

  1. Function MessageErreurSocket( ErrorEvent: TErrorEvent; var ErrorCode: Integer):String;
  2. var
  3.     ErrorMsg: string;
  4. begin
  5.     // définition du message d'erreur en fonction du code d'erreur
  6.     case ErrorCode of
  7.          10004: ErrorMsg:= '. Chiamata di Funzione interrotta';
  8.          10013: ErrorMsg:= 'Autorizzazione negata.';
  9.          10014: ErrorMsg:= '. Indirizzo sbagliato';
  10.          10022: ErrorMsg:= '. Invalides Arguments';
  11.          10024: ErrorMsg:= 'Troppi file aperti.';
  12.          10035: ErrorMsg:= 'Risorsa temporaneamente non disponibile.';
  13.          10036: ErrorMsg:= '. Operazione in corso';
  14.          10037: ErrorMsg:= '. Operazione già in corso';
  15.          10038: ErrorMsg:= 'operazione Socket sulla non-presa.';
  16.          10039: ErrorMsg:= '. Indirizzo di destinazione richiesto';
  17.          10040: ErrorMsg:= 'Messaggio troppo lungo.';
  18.          10041: ErrorMsg:= 'Protocollo tipo sbagliato di socket per.';
  19.          10042: ErrorMsg:= '. Variante di protocollo Bad';
  20.          10043: ErrorMsg:= 'Protocollo non supportato.';
  21.          10044: ErrorMsg:= '. Tipo di socket non supportato';
  22.          10045: ErrorMsg:= 'Operazione non supportata.';
  23.          10046: ErrorMsg:= '. Famiglia Protocollo non supportato';
  24.          10047: ErrorMsg:= 'famiglia indirizzi non supportata dalla famiglia di protocolli.';
  25.          10048: ErrorMsg:= 'Indirizzo già in uso.';
  26.          10049: ErrorMsg:= 'Non è possibile assegnare richiesto indirizzo.';
  27.          10050: ErrorMsg:= 'rete non funziona.';
  28.          10051: ErrorMsg:= 'rete è irraggiungibile.';
  29.          10052: ErrorMsg:= 'Network caduto il collegamento on reset.';
  30.          10053: ErrorMsg:= 'Software causato interruzione di connessione.';
  31.          10054: ErrorMsg:= 'Connessione ripristinata dal peer.';
  32.          10055: ErrorMsg:= 'Nessuno spazio buffer disponibile.';
  33.          10056: ErrorMsg:= '. Socket è già collegato';
  34.          10057: ErrorMsg:= 'Socket non è collegato.';
  35.          10058: ErrorMsg:= 'Impossibile inviare dopo l'arresto del socket.';
  36.          10060: ErrorMsg:= 'Connessione scaduta.';
  37.          10061: ErrorMsg:= 'Connessione rifiutata.';
  38.          10064: ErrorMsg:= 'Host è giù.';
  39.          10065: ErrorMsg:= 'No route to host.';
  40.          10067: ErrorMsg:= 'troppi processi.';
  41.          10091: ErrorMsg:= 'sottosistema di rete non è disponibile.';
  42.          10092: ErrorMsg:= '. WINSOCK.DLL Versione fuori campo';
  43.          10093: ErrorMsg:= '. WSAStartup successo non ancora eseguita';
  44.          10094: ErrorMsg:= '. Arresto regolare in progress';
  45.          11001: ErrorMsg:= '. Host non trovato';
  46.          11002: ErrorMsg:= 'ospite non autorevole non trovato.';
  47.          11003: ErrorMsg:= 'Questo è un errore non recuperabile.';
  48.          11004: ErrorMsg:= '. Nome valido, nessun record di dati di tipo richiesto';
  49.    else
  50.        // Errore sconosciuto
  51.        ErrorMsg := 'Errore di presa sconosciuto.';
  52.    end;
  53.    // Formattazione il significato dell'errore
  54.     ErrorMsg := 'Socket Errore n°' + IntToStr(ErrorCode) + ' : ' + ErrorMsg;
  55.     // L'errore viene trattato
  56.     ErrorCode := 0;
  57.     // Imposta il tipo di errore
  58.     case ErrorEvent of
  59.         eeSend           : ErrorMsg := 'Writing ' + ErrorMsg;
  60.         eeReceive       : ErrorMsg := 'Reading ' + ErrorMsg;
  61.         eeConnect       : ErrorMsg := 'Connecting ' + ErrorMsg;
  62.         eeDisconnect : ErrorMsg := 'Disconnecting ' + ErrorMsg;
  63.         eeAccept         : ErrorMsg := 'Accepting ' + ErrorMsg;
  64.     else
  65.         // Errore sconosciuto
  66.         ErrorMsg := 'Unknown ' + ErrorMsg;
  67.     end;
  68.     Result:=ErrorMsg;
  69. end;
  70. //
  71. //**************************************************************************************
  72.  
  73.  
  74.  
  75. //**************************************************************************************
  76. //   Struttura telaio utilizzato per il trading
  77. //
  78. Const
  79.   TailleBloc = 256;
  80. Type
  81.   TIPTrame=Packed Record
  82.     Case ttType:Integer Of                           // ttType specifica il tipo di telaio
  83.                                                      // = 1 quando si tratta di un nome di file
  84.                                                      // = 2 quando è un file di song
  85.     1:(
  86.         ttNomFichier:String[255];                    // Nome Del File
  87.       );
  88.     2:( ttDebut : Integer;                           // indirizzo iniziale dei dati nel file
  89.         ttLong  : Integer;                           // Lunghezza dei dati inviati
  90.         ttDatas : Array[0..TailleBloc-1] Of Byte )   // I dati inviati
  91.   End;
  92. //
  93. //**************************************************************************************
  94.  
  95.  
  96.  
  97. //**************************************************************************************
  98. // SERVER
  99. // Questa sezione si applica solo al server
  100. Var
  101.   ServeurEnReception    : Boolean = False;     // = True quando la ricezione è di essere
  102.   ServeurAdresseClient  : String  = '';        // Indirizzo di client connesso
  103.   ServeurFichier        : File;                // File utilizzato per pezzi di backup
  104.  
  105.  
  106. procedure TForm1.btnOpenClick(Sender: TObject);
  107. begin
  108.   // Bouton de mise en écoute du serveur, c'est tout simple
  109.   Serveur.Open;
  110.   MemoServeur.Lines.Add('Serveur en écoute');
  111. end;
  112.  
  113. procedure TForm1.btnCloseClick(Sender: TObject);
  114. begin
  115.   // Bouton de fermeture du serveur, c'est aussi tout simple
  116.   If     ServeurEnReception
  117.      And (MessageDlg('Un transfert est en cours, fermer le serveur ?',mtConfirmation,[mbYes,mbNo],0)=mrYes)
  118.   Then Begin
  119.     Serveur.Close;
  120.     MemoServeur.Lines.Add('Serveur desactivé');
  121.   End;
  122. end;
  123.  
  124. //
  125. // évènements du socket serveur
  126. //
  127. procedure TForm1.ServeurClientConnect(Sender: TObject;
  128.   Socket: TCustomWinSocket);
  129. begin
  130.   // C'est juste pour signaler
  131.   MemoServeur.Lines.Add('OnConnect:'+Socket.RemoteAddress);
  132. end;
  133.  
  134. procedure TForm1.ServeurClientDisconnect(Sender: TObject;
  135.   Socket: TCustomWinSocket);
  136. begin
  137.   MemoServeur.Lines.Add('OnDisconnect:'+Socket.RemoteAddress);
  138.   // Le client se deconnecte => ou ferme le fichier en cours si besoin
  139.   If ServeurEnReception
  140.   Then Begin
  141.     CloseFile(ServeurFichier);
  142.     ServeurEnReception:=False;
  143.   End;
  144. end;
  145.  
  146. procedure TForm1.ServeurClientError(Sender: TObject;
  147.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  148.   var ErrorCode: Integer);
  149. begin
  150.   // On ne fait que signaler l'erreur
  151.   MemoServeur.Lines.Add('OnClientError:'+Socket.RemoteAddress+#13+MessageErreurSocket(ErrorEvent,ErrorCode));
  152. end;
  153.  
  154. procedure TForm1.ServeurClientRead(Sender: TObject;
  155.   Socket: TCustomWinSocket);
  156. Var Buffer:TIPTrame;
  157.     Erreur:Integer;
  158.     Recus :Integer;
  159. begin
  160.   // C'est ici la partie principale du serveur
  161.   // Cette procédure est appelée à chaque écriture d'un client
  162.  
  163.   Erreur  :=0;
  164.   Recus   :=Socket.ReceiveLength;    // Longueur reçue ( en octets )
  165.   MemoServeur.Lines.Add('OnRead'+Socket.RemoteAddress+' reçus '+IntToStr(Recus));
  166.  
  167.   If Recus<= SizeOf(Buffer)         // On vérifie que la longueur reçue tient dans la trame
  168.                                     // sinon attention au plantage !!!
  169.   Then With Buffer Do Begin
  170.     // Lecture de la trame reçue
  171.     Socket.ReceiveBuf(Buffer,Recus);
  172.  
  173.     // En fonction du type de la trame on effectue les traitements
  174.     Case ttType Of
  175.       1:Begin
  176.         // C'est une nouvelle demande, on vérifie le nom du fichier
  177.         // La longueur de la trame doit être au minimumu de
  178.         //   4 ( taille de ttType ) + 1 ( longueur de la chaine ttNomFichier ) + Length(ttNomFichier)
  179.         If (Recus>=5)And(Recus>=(5+Length(ttNomFichier)))
  180.         Then Begin
  181.           // La longueur est bonne, on accepte la demande
  182.           MemoServeur.Lines.Add(ttNomFichier);
  183.  
  184.           // On ferme le fichier précédent au cas ou
  185.           If ServeurEnReception Then CloseFile(ServeurFichier);
  186.  
  187.           // On ouvre le fichier de réception en écriture
  188.           AssignFile(ServeurFichier,ExtractFilePath(ParamStr(0))+ttNomFichier);
  189.           Try
  190.             Rewrite(ServeurFichier,1);
  191.             ServeurEnReception:=True;
  192.             Erreur:=0;
  193.           Except
  194.             Erreur:=5; // Erreur de création du fichier
  195.           End;
  196.         End
  197.         Else Erreur:=2; // La longueur reçue est trop courte
  198.       End;
  199.  
  200.       2:Begin
  201.         // On reçoit un morceau de fichier
  202.         // La longueur de la trame doit être au minimumu de
  203.         //   4 ( taille de ttType ) + 4 ( taille de ttDebut ) + 4 ( taille de ttLong )
  204.         //    + ttLong ( nombre de données envoyées )
  205.         If (Recus>=12)And(Recus>=(12+ttLong))
  206.         Then Begin
  207.           // Le morceau n'est accepté que si une demande est en cours
  208.           If ServeurEnReception
  209.           Then Begin
  210.             // Le morceau n'est accepté que si le début du fichier à déjà été reçu
  211.             If (ttDebut>=0)And(ttDebut<=FileSize(ServeurFichier))
  212.             Then Begin
  213.               Try
  214.                 // Si tout est bon on écrit le morceau dans le fichier
  215.                 Seek(ServeurFichier,ttDebut);
  216.                 BlockWrite(ServeurFichier,ttDatas,ttLong);
  217.                 Erreur:=0;  // C'est bon
  218.               Except
  219.                 Erreur:=6; // Erreur d'écriture du fichier
  220.               End;
  221.             End
  222.             Else Erreur:=4; // La position 'début' n'est pas correcte
  223.           End
  224.           Else Erreur:=3; // On n'a pas reçue de demande
  225.         End
  226.         Else Erreur:=2; // La longueur reçue est trop courte
  227.       End;
  228.  
  229.     End;// fin du case
  230.   End
  231.   Else Erreur:=1; // La longueur reçue est trop grande
  232.  
  233.   // Dans tout les cas on envoie le code d'erreur au client
  234.   Socket.SendBuf(Erreur,4);
  235.   MemoServeur.Lines.Add('  Code de retour :'+IntToStr(Erreur));
  236. end;


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 10:01
Giovedì, 01/01/2015
Ciao!

Il codice sorgente l' hai scritto tu?
Esattamente che cosa non funziona, o non riesci a capire?

PM Quote
Avatar
Mario84 (Normal User)
Newbie


Messaggi: 8
Iscritto: 24/11/2014

Segnala al moderatore
Postato alle 0:04
Venerdì, 02/01/2015
Salve, il codice non lo scritto io, il codice non presenta errori e funziona perfettamente vorrei soltanto aggiungere una ProgressBar per controllare l'avanzamento del download, Ma non so come fare o provato e riprovato ormai da giorni ma niente da fare.Se puoi aiutarmi a risolvere questo mio problema per favore mi potresti commentare i vari passaggi cosi da poter capire e imparare qualcosa di nuovo.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:39
Venerdì, 02/01/2015
In principio, prova a creare un progetto nuovo, inserisci una ProgressBar, e prova a controllarla da programma.
Quindi, una volta appreso le funzionalità, potrai inserirla nel programma.

PM Quote