# Fortschritt anzeigen



## Nicole (2. Dezember 2003)

Hallo

Wie kann ich in VB 6.0 eine Wartezeit grafisch darstellen.
Ich dachte z.b. an so etwas wie eine sich drehende Sanduhr.

Eine ProgressBar habe ich bereits in Verwendung, die ist allerdings nicht optimal da die dauer des Prozesses unterschiedlich ist und dann die Progressbar oft nicht bis zum Ende durchläuft.

Ciao 
Nicole


----------



## ANI (2. Dezember 2003)

hallo Nicole,

der Fehler mit deinem ProgressBar liegt daran, daß du den Max-Wert des Controls nicht an jeden Warteprozess anpasst.

Der Max-Wert ist immer gleich Wartezeit. Damit zeigt das Control immer bis Maximum an.

Um Wartezeit grafisch darstellen zu können, kannst du auch diese Möglichkeit mit hinzuziehen:

Screen.MousePointer = 11 'Drehende Sanduhr
Screen.MousePointer = 0 'Normaler Zeiger

Es gibt noch andere Möglichkeiten:
z.B. Einzelbilder einer Animation als Pictureboxen in deine Form legen und diese dann mittels Timer-Control zusammenhängend anzeigen zu lassen.

usw.....

Die Welt der Erfindungen ist unbegrenzt!

ANI


----------



## Nicole (3. Dezember 2003)

Vielen Dank für Deine Antwort 
wenn Du mir aber bitte nich sagen könntest wie ich den Max Wer am besten anpasse. irgendwie krieg ich das nicht vernünftig hin.

Nachfolgend findest du einen Ausschnitt aus meinem Code
Z wird solange hochgezählt bis der Prozess im Hintergrund fertig ist und dies kann eben unterschiedlich lange dauern die Progressbar sollte aber immer bis zum Ende laufen.


Grüsse Nicole


```
Z = 1
    Fehler = False
    Do While Z < 100
        Z = Z + 1

        Form1.sbrStatus.Panels(2).Text = " Bitte warten! "
        
        Form1.ProgressBar1.Min = 0
        Form1.ProgressBar1.Max = Z
        Form1.ProgressBar1.Value = 1
            
            If fso.FileExists("\\pre-wap-konv1\wrdxls-in\" & FileX & "." & ExtensionX) = False Then
                            Exit Do
                    End If
                    Sleep (1000)
                    DoEvents
             Loop


        Case "gl2", "GL2", "ps", "PS", "plt", "PLT", "hp2", "HP2", "hpl", "HPL", "tif", "TIF", "eps", "PS", "jpg"
            QuellPath = Fullpath
            ZielPath = "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FilenameX
                FileCopy QuellPath, ZielPath
            ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FileX & ".rdy"
      
    Z = 1
    Fehler = False
    Do While Z < 100
        Z = Z + 1
       
        Form1.sbrStatus.Panels(2).Text = " Bitte warten! "
        Form1.ProgressBar1.Value = Z
            If fso.FileExists("\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FileX & "." & ExtensionX) = False Then
                            Exit Do
                    End If
                    Sleep (1000)
                    DoEvents
             Loop
                
    End Select

    ChDir "\\pre-wap-konv1\Konvertierung\"
    'Form1.Drive1.Drive = "\\pre-wap-konv1\Konvertierung\"
    Form1.Dir1.Path = "\\pre-wap-konv1\Konvertierung\pdfout"
        
        
'
'    Form1.ProgressBar1.Visible = True
'    Form1.Label4.Visible = True
'
'            Z = 1
'            Fehler = False
'            Do While Z < 30
'                Z = Z + 1
'
'                Form1.ProgressBar1.Value = Z
'
'                    If fso.FileExists("\\pre-wap-konv1\Konvertierung\pdfout\" & FileX & ".pdf") Then
'                            Exit Do
'                    End If
'                    Sleep (1000)
'                    DoEvents
'             Loop
'
'       For zr = 1 To 35
'            Sleep (1000)
'            DoEvents
'
'                Form1.Label4.Visible = False
'                Form1.Label5.Visible = True
'                Form1.ProgressBar1.Value = zr
'
'
'       Next
'
    Form1.ProgressBar1.Visible = False
'    Form1.MousePointer = Default
```


----------



## ANI (3. Dezember 2003)

hallo Nicole,

auf die Schnelle habe ich keine Lösung. Doch ich werde mir deinen Code etwas genauer vornehmen und dir eine Lösung präsentieren.

Wenn ich das richtig verstanden habe, ist der entscheidene Faktor der Kopierprozess deiner Files! 
Also: Solange das Files nicht existiert, soll der Progressbar hochzählen!

Ich hoffe, so soll es sein!

ANI


----------



## Nicole (3. Dezember 2003)

Hallo

Ich habe Dir hier nochmal einen Codeauszug der etwas früher beginnt und eine genauere Erklärung:

Die Extension der Datei wird geprüft, danach in dem Verzeichniss eine .RDY Datei erstellt. Anschliessend beginnt ein von meinem Programm unabhängiger Konvertierprozess. Mein Programm prüft wie lange das Originalfile im Verzeicnis ist und genau solange soll die ProgressBar laufen.

Problem ist das die Dateien unterschiedlich lang sein können und daher auch der Konvertierungsprozess immer unterschiedlich lange geht. Das heist wenn ich Beispielsweise für die ProgressBar ein MIN = 0, MAX = 100 und VALUE = 1 nehme läuft mein ProgressBar in den meisten fällen nicht bis zum Ende durch was unschön ist, da dies den Eindruck erwecken könnte dass der Konvertierungsprozess nicht zu Ende ist.

Und nun stellt sich mir eben die Frage wie kann ich das programmieren das egal wie lange der Konvertierungsprozess geht die ProgressBar auch jedesmal voll ausgefüllt wird.


```
Select Case ExtensionX
        Case "doc", "DOC", "xls", "XLS", "rtf", "RTF"
            QuellPath = Fullpath
            ZielPath = "\\pre-wap-konv1\wrdxls-in\" & FilenameX
                FileCopy QuellPath, ZielPath
            ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\wrdxls-in\" & FileX & ".rdy"
  
    Z = 1
    Fehler = False
    Do While Z < 100
        Z = Z + 1

        Form1.sbrStatus.Panels(2).Text = " Bitte warten! "
        
        Form1.ProgressBar1.Min = 0
        Form1.ProgressBar1.Max = Z
        Form1.ProgressBar1.Value = 2
            
            If fso.FileExists("\\pre-wap-konv1\wrdxls-in\" & FileX & "." & ExtensionX) = False Then
                            Exit Do
                    End If
                    Sleep (1000)
                    DoEvents
             Loop


        Case "gl2", "GL2", "ps", "PS", "plt", "PLT", "hp2", "HP2", "hpl", "HPL", "tif", "TIF", "eps", "PS", "jpg"
            QuellPath = Fullpath
            ZielPath = "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FilenameX
                FileCopy QuellPath, ZielPath
            ZielPathA = ZielPath & "a"
                FileCopy ZielPath, ZielPathA
                Name ZielPathA As "\\pre-wap-konv1\Konvertierung\hpgltiffps\" & FileX & ".rdy"
      
    Z = 1
      Form1.ProgressBar1.Max = 20
    Fehler = False
    Do While Z < 100
        Z = Z + 1
```


----------



## Daniel Toplak (3. Dezember 2003)

> Und nun stellt sich mir eben die Frage wie kann ich das programmieren das egal wie lange der Konvertierungsprozess geht die ProgressBar auch jedesmal voll ausgefüllt wird.


Eigentlich gar nicht, denn um einen Status von 0%-100% zu bekommen, musst du wissen, was die Gesamtgröße ist. Z.B. man kopiert 1000 Dateien von A nach B da weiß man das genau 1000 Dateien kopiert werden und das alle 10 Dateien der Status um 1% erhöht wird.
Ergo benötigst du von deinem Konvertierungsprozess eine Information wieviele Einheiten (bytes, Dateien, Orderner oder sonstwas) er konvertieren muss und dann brauchst du natürlich Rückmeldung wenn eine Einheit erledigt wurde um eine Korrekte Statusbar darzustellen.
So jetzt gibt es 2 Möglichekeiten:
1.)
Du machst eine sog. Fake-Progressbar die hochzählt und dann irgendwann wenn der Konvertierungsprozess fertig ist auf 100% springt.
Oder eine Progressbar die hinundher springt.
Beides ist nicht sehr schön, da der Benutzer nicht einschätzen kann, wann das ganze Fertig ist.

2.)
Du brauchst mehr Kontrolle über den Konvertierungsprozess. (Ist der Konvertierungsprozess von dir programmiert und in welcher Sprache?) Man kann das ganze dann über sog. CallBack's realisieren, was allerdings in VB denke ich nicht ganz einfach ist.

Gruß Homer


----------



## ANI (3. Dezember 2003)

hallo Nicole,

leider musste ich beim Kopieren per FileCopy mit einer 160 MB großen Dateifeststellen,  daß der gesamte Prozess nicht abfragbar ist und mein Testprogramm, trotz DoEvents, so lange nicht reagierte, bis der FileCopy-Prozess abgeschlossen war.

Also kannst du den Prozess deines Progressbars nur simulieren, da der Max-Wert nicht steuerbar ist.

Als letzte Alternative würde ich dafür die 'Screen.MousePointer = 11' vor FileCopy und 'Screen.MousePointer = 0' nach FileCopy einsetzen.

Leider kann ich dir bei deinem Problem nicht weiterhelfen.

ANI


----------



## Nicole (4. Dezember 2003)

Besten Dank für Eure Antworten und Tipps
Wird wohl nicht ganz einfach aber ich werd mir was einigermassen vernünftiges einfallen lassen.

Nicole


----------

