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 einApplication->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
