BCB 6 - Fortschrittsbalken



  • Hallo Leute,

    ich habe leider bei der Suche nur zwei unzufriedenstellende Ergebnisse bekommen, also habe ich mir gedacht, ich erstelle für mein Problem einen Thread.

    Was will ich machen?
    Ich habe ein Programm geschrieben, dass nach einem Klick auf einen Button eine Verbindung zu einem FTP-Server (mittels TNFTP - Komponente) aufbaut, die Verzeichnisnamen mit einem Wert aus der Registry abgleich, ein Verzeichnis öffnet, alle Dateien ausliest und dann alle Dateien in diesem Verzeichnis runterläd.
    Visualisiert wird das durch zwei Fortschrittsbalken:
    barDatei = Fortschritt der momentan übertragenen Datei
    barAll = Gesamtfortschritt

    Wo ist das Problem?
    Das Programm findet zwei Dateien, die eine ein wenig größer als die andere. Der Download beginnt, beide Balken füllen sich, doch nachdem die Datei fertiggeladen ist und die zweite Datei transfreriert wird, bleibt der Fortschrittsbalken des Gesamtdownloads bei etwas mehr als der Hälfte stehen und füllt sich nicht weiter, während der Dateifortschrittsbalken wieder von vorne anfängt und voll läuft.
    Ich möchte aber, das der Gesamtdownloadbalken weiterläuft und erst das Ende erreicht, wenn alle Dateien übertragen wurden (und nicht bei 51 % einfach aufhört).

    Unterstützend vielleicht ein wenig Code:
    (FTPClient = TNFTP - Komponente)

    Wird gestartet, nachdem das FTP-Verzeichnis betreten wurde...
    (j = Anzahl der Dateien)

    // Gesamtdateigröße auslesen
            int iTempCount = 0;
            int ibarAllGesamt = 0;
            while(iTempCount <= j)
                    {
                    ibarAllGesamt = ibarAllGesamt + StrToInt(FTPClient->FTPDirectoryList->Size->Strings[iTempCount]);
                    iTempCount++;
                    }
    
            // Länge der Gesamtprogressbar anpassen und diese initialisieren
            barAll->Visible = true;
            barAll->Max = ibarAllGesamt;
    

    ibarAllGesamt hat als Wert bei den beiden Dateien 2352319 - das ist korrekt

    Wird ausgeführt, während ein Transfer läuft (hier vermute ich einen Fehler...)

    void __fastcall TFormMain::FTPClientPacketRecvd(TObject *Sender)
    {
    // Fortschrittsanzeige dynamisch anpassen
    barDatei->Position = FTPClient->BytesRecvd;
    barAll->Position   = FTPClient->BytesRecvd;
    
    Label1->Caption = IntToStr(barAll->Min);
    Label2->Caption = IntToStr(barAll->Max);
    
    // Anzeigewerte formatieren (Statt Bytes, KiloBytes)
    float fBytesRecvd    = FTPClient->BytesRecvd/1024;
    float fBytesTotal    = FTPClient->BytesTotal/1024;
    float fPos           = barAll->Position;
    float fMax           = barAll->Max;
    float fStatusCurrent = (fPos/fMax)*100;
    
    // Fortschritt im Label anzeigen
    lblTransfer->Caption = FloatToStrF(fBytesRecvd,ffFixed,12,0)+" KB von "+FloatToStrF(fBytesTotal,ffFixed,12,0)+" KB empfangen";
    lblAllDownloadStatus->Caption = "Gesamtfortschritt: "+FloatToStrF(fStatusCurrent,ffFixed,3,0)+" %";
    
    }
    

    Ich glaube ich habe einfach einen Denkfehler bei der Behandlung des Gesamtfortschritts. Das Programm an sich läuft wunderbar, ist halt schon sehr scary, dass es dann an einer Progressbar scheitert ...
    Über Hilfe und / oder Tipps wäre ich sehr dankbar. Hat schon Mal so gut geklappt hier im Board.

    mfg



  • Hallo

    Ist doch klar, das der Forstschritt der zweiten Datei nicht angezeigt wird. Du must bei barAll nämnlich nicht einfach den neuen Received-Wert übergeben, sondern zusätzlich noch den Received-Wert der vorhergehenden Dateien draufrechnen. Am besten machst du dir eine Integer-Member (bei mir iOldOverallPosititon), in die du nach Download jeder einzelnen Datei erstmal den Wert in barAll->Position speicherst. Vor dem Start der ganzen Downloads setzt du den Member natürlich auf 0.
    Dann kannst du während des Downloads die Position so bestimmen :

    barDatei->Position = FTPClient->BytesRecvd;
    barAll->Position   = iOldOverallPosititon + FTPClient->BytesRecvd;
    

    bis bald
    akari



  • Hallo akari,

    ja, sowas ist mir vorm Schlafengehen auch eingefallen. Vielen Dank für deine Antwort! Ich habe eine globale Integervariable erzeugt und in dem Ereignis "onTransactionStop" die Position von barAll in die Integervariable gespeichert.

    Vor dem Downloaden einer Datei wird barAll->Position auf 0 gesetzt und während der Dateiübertragung (onPacketRecvd) auf Integer+FTPClient->BytesSent (so wie Du es in deinem Beispiel aufgezeigt hast). Funktioniert wunderbar!

    Vielen Dank für die Hilfestellung!

    mfg


Anmelden zum Antworten