Progress Bar beim Einlesen aktualisieren...



  • Hi!

    Wie kann ich es schaffen, dass die Progress Bar mitläuft beim Einlesen einer Datei? Quasi wie beim Downloadmanager.



  • Hallo

    Siehe die Eigenschaften TProgressBar::Min, Max und Pos.
    Um die Änderungen just-in-Time zu verarbeiten ist eventuell nach jedem Setzen von Pos ein

    Application->ProcessMessages();
    

    nötig.

    bis bald
    akari



  • Nur wie bekomm ich die Zeigerposition beim Einlesen bei jeder Zeigeränderung mit?



  • Hallo,
    ich setze vor der Schleife Min auf =0, Max = maximale Anzahl von Datensätzen (RecCount) und Pos = Zählervariable. Nach jeder Pos ein Refresh() und die ProgressBar läuft. (zumindest bei mir)

    mfg
    Traugott



  • Das Just in Time ist nicht das Problem.

    Jedoch läuft das Einlesen komplett in einer Methode einer anderen Klasse statt. Und ich müsste irgendwie an die Zeigerposition beim Ein-/Auslesen kommen...



  • Wenn Du Hilfe möchtest, mußt Du schon mit mehr Informationen herausrücken. So kann Dir keiner helfen...



  • Engine.cpp

    ...
    //Gibt 0 zurück wenn ein Fehler auftrat, 1 wenn nicht
    int Engine::einlesen(AnsiString datei)
    {
    //----Stream-initialisieren----
      ifstream ifl(datei.c_str(), ios::in|ios::binary);
    //----Fehler?----
      if(!ifl)
      {
        return 0;
      }
    //----Länge-bestimmen----
      unsigned int ende;
      ifl.seekg(0, ios::end);
      ende = ifl.tellg();
      ifl.seekg(0, ios::beg);
    //----Array-initialisieren----
      delete array;
      array = new char[ende];
    //----Daten-einlesen----
      ifl.read((char*)array, ende);
    //----Stream-schließen----
      ifl.close();
    //----Info-vorbereiten----
    if(m_ArrayLength > 0)
    {
      extendArray();
    }
    //----Info-setzen----
      info[m_ArrayLength].groesse = ende;
    //----Alles-OK----
      return 1;
    }
    

    Main (GUI)

    ...
    void __fastcall TForm1::DateiHinzufuegenClick(TObject *Sender)
    {
      StatusBar->Panels->Items[0]->Text = "Warte auf Benutzer...";
    //----Form-anzeigen----
      Form2->setMode(0);
      Form2->ShowModal();
    //----Abbruch?----
      if(Form2->getAbbruch())
      {
        StatusBar->Panels->Items[0]->Text = "Bereit...";
        return;
      }
      Application->ProcessMessages();
    
      Form3->setMode(0);
      Form3->Show();
      Form3->setForm(this);
      this->Enabled = false;
      Application->ProcessMessages();
      Form3->CheckBox5->Checked = TRUE;
      Application->ProcessMessages();
      Form3->setPfeil(1);
      Application->ProcessMessages();
    //----Ein-Item-mehr----
      items ++;
    //----updaten----
      int err1 = cg.einlesen(Form2->Pfad->Text);
      if(err1 == 0)
      {
        Form3->Image1->Visible = false;
        Form3->Image3->Visible = true;
        Form3->Button1->Enabled = true;
        return;
      }
      Form3->CheckBox2->Checked = TRUE;
      Application->ProcessMessages();
      Form3->ProgressBar1->Position = 100;
    
      Form3->setPfeil(2);
      Application->ProcessMessages();
      Form3->CheckBox3->Checked = TRUE;
      Application->ProcessMessages();
      Form3->setPfeil(3);
      Application->ProcessMessages();
    
      AnsiString a2 = Form2->Version->Text;
      AnsiString a3 = Form2->Typ->Text;
      AnsiString a4 = Form2->Autor->Text;
      AnsiString a5 = Form2->Beschreibung->Text;
      if(a2.Length() == 0) {a2 = "-";}
      if(a3.Length() == 0) {a3 = "-";}
      if(a4.Length() == 0) {a4 = "-";}
      if(a5.Length() == 0) {a5 = "-";}
      cg.verifizieren(a2, a3, a4, a5);
    
      int err2 = cg.speichern(savePfad);
      if(err2 == 0)
      {
        Form3->Image1->Visible = false;
        Form3->Image3->Visible = true;
        Form3->Button1->Enabled = true;
        return;
      }
    
      Form3->CheckBox4->Checked = TRUE;
      Application->ProcessMessages();
      Form3->ProgressBar2->Position = 100;
      Application->ProcessMessages();
      Form3->Image1->Visible = FALSE;
      Application->ProcessMessages();
      Form3->Image2->Visible = TRUE;
      Application->ProcessMessages();
      Form3->Button1->Enabled = TRUE;
      Application->ProcessMessages();
      Form3->setPfeil(4);
    
      StatusBar->Panels->Items[0]->Text = "Bereit...";
      geaendert = true;
      updatePanel2();
    
    //----Hinzufügen----
      updateListe();
    
      Form2->Pfad->Clear();
      Form2->Spiel->Clear();
      Form2->Version->Clear();
      Form2->Typ->Clear();
      Form2->Autor->Clear();
      Form2->Beschreibung->Clear();
    }
    

    -cg ist Engine.cpp instanziert
    -Form2 ist ein Dialog um Daten vom Benutzer abzufragen
    -Form3 ist ein Dialog um den Fortschritt anzuzeigen, hier befindet sich auch die zu aktualisierende ProgressBar



  • Bei diesem Aufbau ist eine Fortschrittsanzeige nicht möglich. Um das zu erreichen, musst Du die Daten blockweise einlesen, also zB in 1 MB Blöcken, anstatt komplett in einem Rutsch. Dann hast Du auch eine Stelle, an der sich die Progressbar aktualisieren läßt.



  • Hab ich mir schon fast gedacht, trotzdem thx 🙂


Anmelden zum Antworten