automatisch Progressbars erstellen

  • Hallo,

    ich möchte mir gerne eine Übersicht mit Progressbars erstellen.
    Kurze Erklärung:
    In meinem Hauptscript habe ich eine For Schleife.
    Für die Anzahl sollen nun automatisch Progressbars erstellt werden.

    Beispiel Hauptscript

    [autoit]


    $Anzahl = 100
    For $i =1 to $Anzahl
    ;hier folgt der Code in meinem Hauptscript
    Sleep(200)
    next

    [/autoit]

    Damit ich nun eine Übersicht erhalte
    möchte ich das ganze mit einer neuen Gui
    und Progressbars anzeigen
    Beispiel Übersicht

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    $Form1 = GUICreate("Form1", 437, 440, 332, 198, BitOR($WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CLIPCHILDREN,$DS_SETFOREGROUND))
    $Progress1 = GUICtrlCreateProgress(52, 28, 150, 9)
    $Progress2 = GUICtrlCreateProgress(52, 44, 150, 9)
    $Progress3 = GUICtrlCreateProgress(240, 28, 141, 9)
    $Label1 = GUICtrlCreateLabel("Seite 1", 8, 24, 37, 17)
    $Label2 = GUICtrlCreateLabel("Seite 2", 8, 40, 37, 17)
    $LblProzent = GUICtrlCreateLabel("%", 212, 28, 12, 17)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Anzahl = 100
    For $i =1 to $Anzahl

    [/autoit][autoit][/autoit][autoit]

    GUICtrlSetData ($Progress1,$i)
    GUICtrlSetData ($LblProzent,$i & '%')
    Sleep(100)
    next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]

    Das ganze sollte so ablaufen:

    Beispiel Hauptscript:
    Anzahl = 50

    • Dann soll automatisch eine Übersicht mit 50 Progressbars in einer neuen Gui (m. Scrollbar) angelegt werden
    • Startet der Loop Nr. 1 vom Hauptscript dann soll Progressbar 1 der neuen Gui mit % Anzeige laufen
    • Startet der Loop Nr. 2 vom Hauptscript dann soll Progressbar 2 der neuen Gui laufen....

    Wäre die Anzahl im Hauptscript 80, dann sollen 80 Progressbars erzeugt werden

    Habt Ihr eine Idee wie man das am besten lösen kann ?


    Viele Grüße
    Ilse ;)

  • Moin Ilse!

    Ich würde am Anfang ein globales Array deklarieren:

    [autoit]

    Global $Progresses[$Anzahl]

    [/autoit]

    In einer For-Schleife befüllst du selbiges dann mit Progresses. Dabei würde ich folgendes (sinngemäß, bitte anpassen, nur grob abgeschätzt) machen:

    [autoit]

    Global $GUI = GUICreate("Titel", 500, 30 * $Anzahl)
    For $i = 0 To $Anzahl - 1
    $Progresses[$i] = GUICtrlCreateProgress(5, 5 + $i * 25, 490, 25)
    Next

    [/autoit]

    Ich habe es nicht getestet, aber das Grundprinzip ist, dass die Progresses über eine kleine mathematische Berechnung (5 + $i * 25) untereinander erscheinen.

    Viel Erfolg!
    Matthias

  • Anstatt 50 oder gar 100 Progressbars zu erstellen wäre es doch aber auch eine Überlegeung wert nur 2 Progressbars zu benutzen.

    Progressbar 1 zeigt den Gesamtverlauf an, also wird nach jedem Durchlauf der For Schleife prozentual erhöht (bei 100 Durchgängen also jeweils 1%).
    Progressbar 2 zeigt den Verlauf des jeweils aktuellen Durchgangs an und wird zu Beginn jedes Durchgangs auf 0 zurückgesetzt und innerhalb der Schleife je nachdem was da gemacht wird eben erhöht.

    Wäre jedenfalls übersichtlicher und leichter umzusetzen ;)

  • Hallo Matthias,

    hab das ganze probiert, aber es klappt irgendwie nicht!
    Es gibt also nur ein Script das alles erzeugt?

    Ich glaube in deinem Script wird die Progressbar nacheinander erzeugt.
    Es war aber so gedacht, daß man direkt die Übersicht sieht (50 Progressbars)
    und die Progressbars Synchron mit dem LOOP nacheinander loslegen.

    Grüße
    Ilse ;)

  • Hallo Ilse,

    zunächst ist misterspeeds Idee gar nicht mal schlecht, sie wird auch bei gängigen Installationsprogrammen verwendet.

    Hier mal ein Minimalbeispiel meiner Idee:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Anzahl = 50
    ; Die Anzahl

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $GUI = GUICreate("Titel des Fensters", 500, $Anzahl * 15 + 5)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ; ==== INTERESSANT AB HIER
    Global $Progresses[$Anzahl]
    ; Deklarieren des Arrays mit $Anzahl Plätzen

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $Anzahl
    $Progresses[$i - 1] = GUICtrlCreateProgress(5, ($i - 1) * 15 + 5, 490, 10)
    Next
    ; ==== INTERESSANT ENDE

    [/autoit] [autoit][/autoit] [autoit]

    Global $Zaehler = 0, $Wert

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If $Zaehler < $Anzahl Then
    $Wert = GUICtrlRead($Progresses[$Zaehler])
    GUICtrlSetData($Progresses[$Zaehler], $Wert + 5)
    If $Wert = 95 Then $Zaehler += 1
    EndIf
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Hallo Misterspeed,

    schön daß du dich meldest.

    Zitat

    2 Progressbars....wäre jedenfalls übersichtlicher und leichter umzusetzen

    auch eine gute Idee.
    Kann man irgendwie eine Berichtsseite machen?
    Ich meine wenn bei 10 abgebrochen wurde, daß dann in der Liste die ersten 10 mit 100% stehen?
    ...das wäre schon wieder die nächste Aufgabe!

    Was auch wichtig wäre: kann man den Loop zwischendrin abbrechen?

    Grüße
    Ilse ;)


    http://www.autoit.de/index.php?page=User&userID=204683

    Einmal editiert, zuletzt von Ilse (24. November 2010 um 18:31)

  • Ja, schau dir mal mein Beispiel ab. Die Daten fütterst du ja an die Progress, du gibst eine Zahl an, die die Progress darstellt (Üblicherweise von 0 - 100 (%)).

    Gruß,
    Matthias


  • Kann man irgendwie eine Berichtsseite machen?
    Ich meine wenn bei 10 abgebrochen wurde, daß dann in der Liste die ersten 10 mit 100% stehen?
    ...das wäre schon wieder die nächste Aufgabe!

    Was auch wichtig wäre: kann man den Loop zwischendrin abbrechen?

    Kann man beides machen.

    Schleifen komplett abbrechen geht mit exitloop
    Den aktuellen Durchgang einer Schleife abbrechen und mit dem nächsten Wert weiter machen geht mit continueloop

    Zum Bericht:

    Da wäre ein vollständiges Script hilfreich. Möglichkeiten hast du viele, sei es eine msgbox, oder eine editbox, die mit Text gefüllt wird oder die Erstellung einer HTML Seite die im Browser geöffnet wird. Letzteres ist wohl übertrieben aber durchaus machbar. Du musst in jedem Fall in jedem Schleifen Durchgang ein Ergebnis speichern um später einen Bericht zu erstellen. Dazu bietet sich ein Array an.

  • misterspeed
    dank dir für die Tipps!
    exitloop, continueloop...probier ich mal einzubauen.

    Aber das mit den 2 Progressbars, hm...ich glaub das schaff ich noch nicht!

    Grüße
    Ilse
    @Matthias, merci nochmal für dein Beispiel

    P.S.: Muß schon wieder los... :( schade
    Melde mich später nochmal

  • Hier mal ein Beispiel mit den zwei angesprochenen Progressbars und einem live "Bericht/Log" in einer Editbox. Die Progressbars wurden gerade provisorisch von mir eingebaut und machen so nicht viel Sinn, aber denke das sollte reichen um das ganze zu verstehen. Das Script löscht btw keine Dateien, also keine Sorge. ;)

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <StaticConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Deinstaller", 625, 443, 192, 124)
    $Edit1 = GUICtrlCreateEdit("" & @CRLF & @CRLF, 66, 95, 513, 273, $ES_MULTILINE + $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL)
    $progress1 = GUICtrlCreateProgress(66, 20, 513, 20)
    $progress2 = GUICtrlCreateProgress(66, 50, 513, 20)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    fakefiledeleting(); löscht KEINE Dateien...

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func fakefiledeleting() ; löscht KEINE Dateien...

    [/autoit] [autoit][/autoit] [autoit]

    $folder = @SystemDir & "\drivers"

    [/autoit] [autoit][/autoit] [autoit]

    $FileList=_FileListToArray($folder,"*.*",1)

    [/autoit] [autoit][/autoit] [autoit]

    $index = 1
    $data = ""
    GUICtrlSetData($Edit1,"Starte Löschvorgang..." & @CRLF & @CRLF)
    Sleep(2000)

    [/autoit] [autoit][/autoit] [autoit]

    While $index <= $FileList[0]
    GUICtrlSetData( $progress1, 100*($index/$FileList[0]) ) ; Gesamt Verlauf der Schleife
    GUICtrlSetData( $progress2, 0 ) ; Verlauf der aktuellen Datei auf 0 setzen

    $data = $folder & "\" & $FileList[$index] & " ... successfully deleted" & @CRLF
    GUICtrlSetData($Edit1,$data,1) ; Aktualisiert die Editbox
    $index = $index + 1

    GUICtrlSetData( $progress2, 50 ) ; Verlauf der aktuellen Datei
    Sleep(100) ; wurde zur Veranschaulichung eingebaut, ansonsten ist die Veränderung der Progressbar nicht zu sehen
    GUICtrlSetData( $progress2, 100 ) ; Verlauf der aktuellen Datei
    Sleep(100) ; wurde zur Veranschaulichung eingebaut, ansonsten ist die Veränderung der Progressbar nicht zu sehen
    WEnd
    GUICtrlSetData($Edit1, @CRLF & $FileList[0] & " Dateien erfolgreich gelöscht.", 1)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    4 Mal editiert, zuletzt von misterspeed (26. November 2010 um 20:28)

  • Hallo Misterspeed,

    ...konnte mich erst heute wieder melden.
    merci für dein Beispiel. Mit der EditBox sieht das richtig gut aus.

    Ich habe noch folgende Probleme mit der Progressbar.
    Kurze Erklärung:
    Es gibt 2 Loops
    1. Loop erstellt die Progressbars
    2. Loop ist der Ablauf der die Progressbars ausfüllt.
    So habe ich die Bars erstellt
    1. Loop

    [autoit]


    For $i = 1 To $Anzahl
    $Progresses[$i - 1] = GUICtrlCreateProgress(5, ($i - 1) * 15 + 5, 490, 10)
    Next

    [/autoit]


    so, also 10 Progressbars wurden erstellt. Prima
    Darunter habe ich dann erneut einen Loop eingefügt.
    Also der Programmteil
    2. Loop

    [autoit]


    For $i=1 to $Anzahl Step +1
    GUICtrlSetData($Progresses[$i],100)
    ; ab kommt ProgrammCode: Dauer ca. 1 Minute
    ;Seite wird geladen...
    next

    [/autoit]

    Das Problem:
    Wie kann ich die Progressbar ca. 1 Minute hochzählen
    ohne daß der kpl.Code zeitlich verlängert wird.
    Ich meine wenn Die ForSchleife 1 beendet ist, daß dann die Progressbar bei 100% ist!
    Muß man das auch mit AdlibRegister und einer Funktion machen?

    Grüße
    Ilse ;)

  • Poste doch mal den Programmcode dessen Verlauf du angeben willst. Es macht kaum Sinn auf gut Glück einen 1 Minuten Counter laufen zulassen um die Progressbar zu aktualisieren wenn du nicht 100% sicher bist, dass die Funktion immer genau 1 Minute Zeit benötigt. Sinnvoller und genauer wäre es den Verlauf wirklich abhängig von der Funktion zu aktualisieren. Dazu müsste man aber wissen was da genau so zeitintensives getan wird. Sind da noch weiter Schleifen in der Funktion selbst? Wenn ja wäre das ideal um den Verlauf anzuzeigen, wenn nein gibt es evtl andere Anhaltspunkte durch die man ermitteln kann wie weit er ist.

    EDIT: In meinem Beispiel oben macht die 2. Progressbar btw keinen Sinn, weil meine Funktion nur wenige ms benötigt, deswegen wurden auch die Pausen eingebaut. Bei dir sollte das auch ohne Pausen möglich sein, da deine Funktion ja sehr lange braucht.

    2 Mal editiert, zuletzt von misterspeed (26. November 2010 um 16:05)

  • guten Morgen,

    konnte mich am Wochenende leider nicht mehr melden.
    Dank euch nochmals für eure Tipps!
    Ich habe mal das wesentliche im Code zusammengefasst,
    damit man es etwas besser nachvollziehen kann,

    Kurze Info:
    Die Adressen kommen aus der ini

    [autoit]


    [Link]
    1=www.ebay.de
    2=www.google.de
    3=www.amazon.de
    [Titel]
    1=Ebay
    2=Google
    3=Amazon

    [/autoit]

    Hier das Script

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>

    [/autoit][autoit][/autoit][autoit]

    _IEErrorHandlerRegister()

    [/autoit][autoit][/autoit][autoit]

    $oIE = _IECreateEmbedded()
    $SinkObject = ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents2")

    [/autoit][autoit][/autoit][autoit]

    _IEErrorHandlerRegister()
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 440, 489, 197)
    $Edit1 = GUICtrlCreateEdit("", 372, 12, 225, 217)
    GUICtrlSetData(-1, "Bericht")
    $Progress1 = GUICtrlCreateProgress(424, 252, 150, 17)
    $Label1 = GUICtrlCreateLabel("Label1", 380, 252, 36, 17)
    $Label2 = GUICtrlCreateLabel("%", 584, 252, 12, 17)
    $Start = GUICtrlCreateButton("Start", 504, 364, 75, 25)
    $GUIActiveX = GUICtrlCreateObj($oIE, 12, 32, 349, 377)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit]

    $openini = @ScriptDir & "\Meine.ini"

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit][autoit][/autoit][autoit]

    Case $Start

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $i=1 to 3 Step +1
    $WebAnzeiger = IniRead($openini, "Link", $i, "NotFound")
    MsgBox(4,"Anzeige",$WebAnzeiger)
    _IENavigate($oIE, $WebAnzeiger)

    [/autoit][autoit][/autoit][autoit]

    next
    MsgBox(4,"Fertig","Beendet")
    EndSwitch

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit]

    Wenn ich auf Start klicke
    sollen 3 oder mehrere Progressbars erzeugt werden! (alle 0 %)
    Label1 soll mit dem Titel der ini ersetzt werden und % hochgezählt werden.

    Und die Progressbars sollte man scrollen können!
    Im Edit Feld wird das ganze protokolliert:
    Ebay ........> ok
    Google ....>ok....

    Im Prinzip eine Mischung von Autobert und Misterspeed

    P.S. ich habe meine Versuche alle rausgelöscht

    Grüße
    Ilse ;)