Abbrechbaren-Fortschritts-Dialog

Scrapy

Mitglied
Ich tüftle schon eine ganze Weile an einem Dialog, der ein TProgressBar anzeigt und aktualisieren soll. Soweit ganz gut, nur kann man den Dialog über den Abbrechen-Button nicht beenden, da dieser erst nach fertigem Durchlauf der Schleife angezeigt wird.
Man kommt erst gar nicht auf den Button und wenn ich den Dialog mit Refresh()/Update() anzeigen lasse erscheint ein Button der nicht funktioniert.

So sieht die Strukur aus:
<code>
//[...]

//Beim starten des Codes:
TfrmKopieren *frmKopieren = new TfrmKopieren(Application);
frmKopieren->ShowModal();

while(i <= 100)
{
frmKopieren->prgStatus->Position = i;

//Dateien kopieren[...]

i ++;
}

//[...]
</code>

Irgendwie muß ich hier einen "Hänger" haben... - so schwer kann doch das nicht sein, oder!? ;)

Danke schonmal für eure schnellen Antworten! :)
 
Lagere das Kopieren doch in einen extra Thread aus und überprüfe in der Schleife ob der Abbrechen-Button geklickt wurde.
 
Ups hatte was vergessen... - ob der Button gedrückt wurde, frage ich natürlich schon in der Schleife ab. ;)

Mmmh... ich hatte in Java mal was mit Threads gemacht - aber im C++ Builder!? Mit der Hilfe dazu komm ich nicht ganz klar!

In Java hätte man da 2 Instanzen von Thread erstellt... - aber hier irgendwie mit 2 Dateien!? Bei mir klappt ja nicht mal das Beispiel! :(

Aber danke für den genialen Hinweis - ich glaub' darauf wäre ich nicht so schnell gekommen! :)
 
Ist eigentlich nicht sehr schwer. Hier mal ein kleines Tutorial:
1. Neues Projekt anfangen
2. Neues Threadobjekt hinzufügen (Klassenname: CMeinThread)
3. auf der Form 2 Buttons (Starten, Beenden) und einen ProgressBar erstellen
4. in Unit1.h die Unit2.h und in Unit2.h die Unit1.h includieren
5. in der CMeinThread::Execute Methode der Unit2.cpp folgenden Code eintragen:
Code:
while(Terminated==false)
        {
         Form1->ProgressBar1->StepIt();
         Sleep(1000);
        }
6. in Unit1.h ein Pointer Attribut auf die Threadklasse erstellen
Code:
CMeinThread* pMeinThread;
7. in der OnClick-Methode des Startbuttons diesen Code eintragen:
Code:
pMeinThread=new CMeinThread(false);
8. in der OnClick-Methode des Abbrechenbutton diesen Code eintragen:
Code:
pMeinThread->Terminate();

So das wars auch schon!
 
Noch ein Tip:

Du kannst auch nach jedem kopierten File die Funktion

Application->ProcessMessages()

rufen. Dann erhält deine ProgressBar auch die Messages,
damit Sie sich updaten kann...
 
Ah, danke vielmals für die Antworten - hatte in der letzten Zeit noch was anderes wichtiges zu tun! Das Programm läuft super!

@Test: Hab nur ein kleines Problemchen noch, also ich kann "CMeinThread *pMeinThread;" nicht im Header von Unit1.h deklarieren, da kommt dann immer: "Typ erwartet". Naja mit "Trick 17" funktioniert es schon, wenn ich es in die Unit1.cpp am Anfang mit reinschreibe. - Sollte ja eigentlich das gleiche sein - aber es funktioniert nur so. :(
 
Zurück