prozent-anzeige



  • hallo ich habe folgendes Problem,

    Bei einer schleife möchte ich eine ProgressBar mitlaufen lassen. Funktioniert wunderbar! Aber wenn ich den Fortschritt in Prozenten ausrechnen möchte, dann wird erst am Ende der Schleife der Wert in der StatusBar angezeigt.

    ProgressBar1->Min = 0;
    ProgressBar1->Max = 120;
    ProgressBar1->Position = 0;
    
    for (int k=0;k<ProgressBar1->Max;k++)
    {
    
    // ... der Schleifeninhalt
    
    ProgressBar1->StepBy(1);
    int prozent = ProgressBar1->Max / ProgressBar1->Position * 100;
    StatusBar1->Panels->Items[2]->Text = IntToStr(prozent) + "%";
    
    }
    

    😕 Hat jemand schon einmal ein ähnliches Problem gehabt? 😕

    Das Gleiche Problem tritt auf, wenn ich VOR der Schleife den Text in der StatusBar änderen möchte. Dieser wird auch erst NACH der Schleife angezeigt

    [ Dieser Beitrag wurde am 03.01.2003 um 10:45 Uhr von mgaertner editiert. ]



  • ProgressBar1->Min = 0;
    ProgressBar1->Max = 120;
    ProgressBar1->Position = 0;
    
    for (int k=0;k<ProgressBar1->Max;k++)
    {
    
    // ... der Schleifeninhalt
    
    ProgressBar1->StepBy(1);
    sleep(500);
    int prozent = ProgressBar1->Max / ProgressBar1->Position * 100;
    StatusBar1->Panels->Items[2]->Text = IntToStr(prozent) + "%";
    
    }
    

    😉



  • hallo,

    ich hab das mit dem sleep(...) mal probiert.
    😞 Leider funktioniert das genauso (wenig), wie vorher - LEIDER! 😞

    Das Programm macht zwar die (gewünschte) Pause, aber sonst ändert sich nichts!



  • Application->ProcessMessages();

    -junix



  • :p DANKE! DANKE! DANKE! :p

    das war die Lösung meines Problems!



  • Ich seh nicht ganz den Sinn darin, mitten in der Schleife ne Pause zu machen. Die ProgressBar soll doch den reale realen Fortschritt bei realer Geschwindigkeit anzeigen, oder - das wäre jedenfalls üblich. Was mit dem sleep bewirkt wird, ist ja, dass der Vorgang künstlich verlangsamt wird. Ich glaub nicht, dass das in deinem Sinne ist.



  • Original erstellt von Eßer:
    Ich seh nicht ganz den Sinn darin, mitten in der Schleife ne Pause zu machen.

    Ich denke AndreasW hat gemeint dass die schleife schlicht zu schnell abgearbeitet würde, und deshalb mal eine Pause vorgeschlagen um zu sehen ob dann der fortschritt sichtbar ist. (:

    -junix



  • Dass man Application->ProcessMessages() benutzen muss, ist doch ganz klar, da die Schleife sich in einer Ereignisbehandlungsroutine, also in einer WindowProc, befindet. Während die Schleife läuft, stauen sich die Messages in der Queue der Anwendung und werden nicht verarbeitet. Da hilft auch ein Sleep(xx) nichts!



  • int prozent = ProgressBar1->Max / ProgressBar1->Position * 100;

    Das stimmt ja wohl auch nicht so ganz... andersrum wird ein Schuh draus



  • Original erstellt von WebFritzi:
    Dass man Application->ProcessMessages() benutzen muss, ist doch ganz klar,

    Selbstverständlich kennt jeder Neuling die Interna einer Windows Applikation aus und jeder hat begriffen wie das Message-System von Windows funktioniert und überhaupt weiss auch jeder gleich wie eine Applikation die er in der BCB IDE zusammenklickt rein hierarchisch und technisch aufgebaut ist...

    Wer den Sarkasmus in diesem Artikel findet, darf ihn behalten (-;

    -junix

    <edit>Ausserdem sollten Leute denen bis zum 2. Halbjahr 2002 ProcessMessages() auch noch nicht so sonnen klar war nicht allzu laut rufen, gell? (-;</edit>

    [ Dieser Beitrag wurde am 03.01.2003 um 21:03 Uhr von junix editiert. ]



  • Hm, mein Satz war eher an AndreasW gerichtet. Als Zusatz zu deiner Vermutung:

    Ich denke AndreasW hat gemeint dass die schleife schlicht zu schnell abgearbeitet würde, und deshalb mal eine Pause vorgeschlagen um zu sehen ob dann der fortschritt sichtbar ist. (:

    Der Rest war an alle, speziell an mgaertner, gerichtet um nocheinmal klarzustellen/zu erklären, WARUM Application->ProcessMessages() genutzt werden muss.



  • Ah, dann war dein "ist doch ganz klar" vielleicht etwas verwirrend (:

    -junix



  • Das mag sein, ja. Vielleicht hätte ich es eher direkt an Andreas richten sollen.



  • Hi,

    schon ok. Beruhigt euch 🙂

    Ich hätte eigentlich gedacht, dass

    ProgressBar1->StepBy(1);

    das Neuzeichnen der Komponente erzwingt. Wäre zumindest logisch, da dieses Konponente immer in dieser Problemkombination zu finden ist. Da ich es nicht ausprobiert haben konnte ich auch nicht feststellen, dass die von Borland halt nicht logisch gedacht haben. Junix hat also schon recht gehabt mit seiner Vermutung, weshalb ich sleep eingebaut habe.

    Leider lag ich da falsch.


Anmelden zum Antworten