Endloser Fortschrittsbalken

  • Weiß jemand, ob es möglich ist, den Fortschrittsbalken in einer GUI als endlos laufenden Fortschrtsbalken darzustellen? Um zu zeigen, das ein Programm arbeitet, aber nicht bekannt ist, wie lange das noch dauern wird.
    Derartige Fortschrittsbalken trifft man ja mit unter auch in anderen Windows Programmen an... z. B. bei der Suche nach Windows-Updates.

    Einmal editiert, zuletzt von jans16 (16. Januar 2010 um 21:01)

  • Machs mit GUICtrlSetData()
    Und ner kleinen If-Abfrage.
    Kleines Beispiel:

    [autoit]

    $gui = GUICreate("Endlos Progressbar", 400, 100)
    $bar = GUICtrlCreateProgress(55, 20, 200, 30)
    $i = 0
    GUISetState()

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

    While 1
    GUICtrlSetData($bar, $i)
    $i += 1
    If $i > 100 Then
    $i = 0
    EndIf
    Sleep(50)
    If GUIGetMsg() = -3 Then Exit
    WEnd

    [/autoit]

    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Hallo Jans16,

    du must den Fortschrittsbalken mit dem Stil $PBS_MARQUEE erzeuen. Hier noch ein kleines Skript dazu:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Global Const $PBS_MARQUEE = 0x08

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

    $main = GUICreate("test", 464, 56, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE,"GUI_CLOSE")
    $Progress = GUICtrlCreateProgress(8, 8, 446, 17,$PBS_MARQUEE)
    $statLabel = GUICtrlCreateLabel("Status: ", 8, 32, 446, 17)
    GUISetState(@SW_SHOW)

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

    _GUICtrlProgressSetMarquee($Progress)

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

    GUICtrlSetData($statLabel,"Status: TrayTip 1 wird angezeigt!")
    TrayTip("test","123",1)
    Sleep(2000)
    TrayTip("","",1)
    GUICtrlSetData($statLabel,"Status: TrayTip 1 wurde angezeigt!")
    Sleep(700)
    GUICtrlSetData($statLabel,"Status: Fertig!")
    _GUICtrlProgressSetMarquee($Progress,0)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func GUI_CLOSE()
    Exit
    EndFunc ;==>GUI_CLOSE

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

    ;===============================================================================
    ;
    ; Function Name: _GUICtrlProgressSetMarquee()
    ; Description: Sets marquee sytle for a progress control
    ; Parameter(s): $h_Progress - The control identifier (controlID)
    ; $f_Mode - Optional: Indicates whether to turn the marquee mode on or off
    ; 0 = turn marquee mode off
    ; 1 = (Default) turn marquee mode on
    ; $i_Time - Optional: Time in milliseconds between marquee animation updates
    ; Default is 100 milliseconds
    ; Requirement(s): AutoIt3 Beta and Windows XP or later
    ; Return Value(s): On Success - Returns whether marquee mode is set
    ; On Failure - Returns 0 and sets @ERROR = 1
    ; Author(s): Bob Anthony
    ;
    ;===============================================================================
    ;
    Func _GUICtrlProgressSetMarquee($h_Progress, $f_Mode = 1, $i_Time = 100)

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

    Local Const $WM_USER = 0x0400
    Local Const $PBM_SETMARQUEE = ($WM_USER + 10)

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

    Local $var = GUICtrlSendMsg($h_Progress, $PBM_SETMARQUEE, $f_Mode, Number($i_Time))
    If $var = 0 Then
    SetError(1)
    Return 0
    Else
    SetError(0)
    Return $var
    EndIf

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

    EndFunc ;==>_GUICtrlProgressSetMarquee

    [/autoit]


    und das Beispiel aus der Hilfe dabei den 2. auf endlos geändert

    Spoiler anzeigen
    [autoit]

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

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

    Opt('MustDeclareVars', 1)

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

    Example()

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

    Func Example()
    Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $m

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

    GUICreate("My GUI Progressbar", 220, 100, 100, 200)
    $progressbar1 = GUICtrlCreateProgress(10, 10, 200, 20)
    GUICtrlSetColor(-1, 32250); not working with Windows XP Style
    $progressbar2 = GUICtrlCreateProgress(10, 40, 200, 20, $PBS_MARQUEE);;Zeile ist gegenüber Original geändert
    $button = GUICtrlCreateButton("Start", 75, 70, 70, 20)
    GUISetState()

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

    $wait = 20; wait 20ms for next progressstep
    $s = 0; progressbar-saveposition
    Do
    $msg = GUIGetMsg()
    If $msg = $button Then
    GUICtrlSetData($button, "Stop")
    For $i = $s To 100
    If GUICtrlRead($progressbar1) = 50 Then MsgBox(0, "Info", "The half is done...", 1)
    $m = GUIGetMsg()

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

    If $m = -3 Then ExitLoop

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

    If $m = $button Then
    GUICtrlSetData($button, "Next")
    $s = $i;save the current bar-position to $s
    ExitLoop
    Else
    $s = 0
    GUICtrlSetData($progressbar1, $i)
    GUICtrlSetData($progressbar2, 1) ;Zeile ist nötig und gegenüber Original geändert
    Sleep($wait)
    EndIf
    Next
    If $i > 100 Then
    ; $s=0
    GUICtrlSetData($button, "Start")
    EndIf
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]


    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (16. Januar 2010 um 19:37)

  • Vielen Dank für die schnelle Antwort, im Endeffekt habe ich nun die folgenden zwei Zeilen verwendet um einen entsprechenden Fortschrittsbalken zu bekommen:

    [autoit]

    $progress = GUICtrlCreateProgress(10, 60, 380, 25, 0x08)
    GUICtrlSendMsg($progress, 0x040A, 1, 10)

    [/autoit]
  • hey,

    habe $BPS_MARQUEE auch benutzt .. mein Problem ist jetzt dass ich balken mit diesem Syle nicht rückwärts (von rechts nach links) laufen lassen kann.

    mit "normalen" ladebalken geht es nur mit $BPS_MARQUEE nicht..

    kann mir jmd helfen?

  • Hallo,

    unter Vista geht's schon:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    GUICreate("Marquee Progress RTL", 400, 200)
    $Progress = GUICtrlCreateProgress(10, 60, 380, 25, 0x08, $WS_EX_LAYOUTRTL)
    GUICtrlSendMsg($Progress, 0x040A, 1, 10)
    GUISetState()
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit

    [/autoit]
  • "unter Vista geht's schon" sollte heißen "unter Vista getestet". Jetzt habe ich es auch mal mit XPProfSP3 probieren können. Was glaubst Du, geht es, oder nicht?

  • -.- habs garnich mehr ausbrobiert funktioniert tatsächlich..^^
    aber wozu das GUICtrlSendMsg?? das macht den balken iwie nur unnötig schnell

    kann man es nun noch irgendwie bewerkstelligen, dass der balken von links nach rechts und wenn er rechts angekommen ist zurück geht?
    so das er sozusagen hinundher geht?

    mein code sieht (abgespeckt) so aus:

    Spoiler anzeigen
    [autoit]

    $hGUI = GUICreate($SetUp & " Installation", 300, 120,-1,-1,$WS_DLGFRAME)
    $progressbar = GUICtrlCreateProgress(5,40,290,20,BitOR(0x08,$PBS_SMOOTH))
    GUISetState()
    While 1
    For $i = 0 To 31
    Sleep(90)
    GUICtrlSetData($progressbar, $i)
    Next
    For $i = 31 To 0
    Sleep(90)
    GUICtrlSetData($progressbar,$i)
    Next
    WEnd

    [/autoit]

    kann man den parameter $WS_EX_LAYOUTRTL irgendwie erst in der zweiten schleife übergeben?!

  • -.- habs garnich mehr ausbrobiert funktioniert tatsächlich..
    aber wozu das GUICtrlSendMsg?? das macht den balken iwie nur unnötig schnell

    Weil es so viel praktischer ist. Da braucht man die For schleifen nicht ^^
    Außerdem kann man die Geschwindigkeit anpassen indem man den 4ten Parameter verändert ;)

  • hmm ok das ist ja nicht schlecht!

    damit is aber leider das problem nicht gelöst, dass der Balken wenn er rechts angekommen ist, sich wieder nach links bewegt...

    hat jemand eine idee?

    • Offizieller Beitrag

    Mit einem Marquee geht es nicht, aber mit einer Standardprogress schon.

    Spoiler anzeigen
    [autoit]

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

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

    Global $progressbar1
    Example()
    Func Example()
    Local $msg
    GUICreate("My GUI Progressbar", 220, 100, 100, 200)
    $progressbar1 = GUICtrlCreateProgress(10, 10, 200, 20)
    GUICtrlSetColor(-1, 32250); not working with Windows XP Style
    GUISetState()
    AdlibRegister("SetData", 10)
    Do
    $msg = GUIGetMsg()

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

    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example
    Func SetData()
    Local Static $iProzent
    Local Static $bdirect
    If $bdirect = False Then
    $iProzent += 1
    GUICtrlSetData($progressbar1, $iProzent)
    If $iProzent > 100 Then
    $bdirect = True
    $iProzent = 100
    Return
    EndIf
    Else
    $iProzent -= 1
    If $iProzent < 0 Then
    $bdirect = False
    $iProzent = 0
    Return
    EndIf
    GUICtrlSetData($progressbar1, $iProzent)
    EndIf
    EndFunc ;==>SetData

    [/autoit]
  • Mit einem Marquee geht es nicht

    schade..

    mit nem standardprogress hab ichs auch schon hinbekommen..

    werde dann einfach den Marquee die ganze zeit von links nach rechts laufen lassen..

    danke euch :)

    edit:
    Warum soll das mit nem Marquee eig nich gehn?? rückwärts laufen kann man ihn doch also muss es doch auch möglich sein, ihn erst rückwärts laufen lassen wenn er am rechten balkenrand angekommen ist???

    Einmal editiert, zuletzt von SetH (17. Februar 2011 um 14:16)

  • Warum soll das mit nem Marquee eig nich gehn?? rückwärts laufen kann man ihn doch also muss es doch auch möglich sein, ihn erst rückwärts laufen lassen wenn er am rechten balkenrand angekommen ist???


    Mann muss ihn nur in die andere Richtung schicken, wenn er ankommt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Richtung = True

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

    GUICreate("Marquee Progress RTL", 400, 200)
    $Progress = GUICtrlCreateProgress(10, 60, 380, 25, 0x08, $WS_EX_LAYOUTRTL)
    GUICtrlSendMsg($Progress, 0x040A, 1, 10)
    GUISetState()
    AdlibRegister("_Umdrehen", 1020)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit

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

    Func _Umdrehen()
    If $Richtung Then
    GUICtrlSetStyle($Progress, 0x08, 0x2000)
    $Richtung = False
    Else
    GUICtrlSetStyle($Progress, 0x08, $WS_EX_LAYOUTRTL)
    $Richtung = True
    EndIf
    EndFunc ;==>_test

    [/autoit]

    Sieht zwar nicht schön aus, aber läuft. ;)

    Magnus

    • Offizieller Beitrag

    Ist aber nich so universell einsetzbar.
    Wenn man z.B. eine Gui hat die Resized werden kann, dann gibt es Probleme mit dem Timing.
    Die Zeit des durchlaufs ist ja nicht fest, sondern Größenabhängig.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Richtung = True

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

    GUICreate("Marquee Progress RTL", 800, 200)
    $Progress = GUICtrlCreateProgress(10, 60, 780, 25, 0x08, $WS_EX_LAYOUTRTL)
    GUICtrlSendMsg($Progress, 0x040A, 1, 10)
    GUISetState()
    AdlibRegister("_Umdrehen", 1020)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit

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

    Func _Umdrehen()
    If $Richtung Then
    GUICtrlSetStyle($Progress, 0x08, 0x2000)
    $Richtung = False
    Else
    GUICtrlSetStyle($Progress, 0x08, $WS_EX_LAYOUTRTL)
    $Richtung = True
    EndIf
    EndFunc ;==>_test

    [/autoit]


    Ansonsten sieht es witzig aus :thumbup:

  • Das mit der Progressbar die immer wieder voll und dann wieder leer wird sieht auf Windows7 ähm.. naja aus...

    Unter Windows7 ist das so, dass wenn man die Progressbar auf 0 setzt und dann sofort wieder auf 100 dann dauert das trotzdem noch ne weile bis die angekommen ist.

    Das heißt konkret, dass die Progressbar in diesem Skript schon auf halbem Wege wieder umdreht:D

    • Offizieller Beitrag

    Ich hatte mir dazu eine "SwipBar" aus Labels gebastelt:

    Spoiler anzeigen
    [autoit]

    Global $gui = GUICreate('test')
    GUISetState()

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

    $arBar = _SwipBarOn(10, 10, 300, 20)
    $t = TimerInit()
    Do
    If TimerDiff($t) > 8000 Then _SwipBarOff($arBar) ; nach 8 Sekunden wird Bar gelöscht
    Until GUIGetMsg() = -3
    _SwipBarOff($arBar)

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

    #region - SwipBar Funktionen
    Func _SwipBarOn($x, $y, $width, $heigth, $iCol=0x000090, $iBkCol=0xD4D0C8)
    Global $SwipBar[3], $aSwipPos[4], $xSwip, $upSwip = True
    Local $swipWidth = Floor($width/4.5)
    $SwipBar[0] = GUICtrlCreateGroup('', $x-1, $y-7, $width+2, $heigth+8)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $SwipBar[1] = GUICtrlCreateLabel('', $x, $y, $width, $heigth)
    GUICtrlSetBkColor(-1, $iBkCol)
    $SwipBar[2] = GUICtrlCreateLabel('', $x, $y+2, $swipWidth, $heigth-1)
    GUICtrlSetBkColor(-1, $iCol)
    $aSwipPos[0] = $x
    $aSwipPos[1] = $y
    $aSwipPos[2] = $swipWidth
    $aSwipPos[3] = $width
    AdlibRegister('_swip', 30)
    Return $SwipBar
    EndFunc

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

    Func _swip()
    If Not IsDeclared('upSwip') Then Global $upSwip = True
    If Not IsDeclared('xSwip') Then Global $xSwip
    If Not IsDeclared('aSwipPos') Then Global $aSwipPos[4]
    If Not IsDeclared('SwipBar') Then Global $SwipBar[3]
    If $upSwip Then
    $xSwip += 4
    Else
    $xSwip -= 4
    EndIf
    If $upSwip And ($xSwip + $aSwipPos[2] >= $aSwipPos[0] + $aSwipPos[3]) Then $upSwip = False
    If Not $upSwip And ($xSwip <= $aSwipPos[0]) Then $upSwip = True
    ControlMove($gui, '', $SwipBar[2], $xSwip, $aSwipPos[1])
    EndFunc

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

    Func _SwipBarOff($arID)
    AdlibUnRegister('_swip')
    GUICtrlDelete($arID[0])
    GUICtrlDelete($arID[1])
    GUICtrlDelete($arID[2])
    EndFunc
    #endregion - SwipBar Funktionen

    [/autoit]
    • Offizieller Beitrag

    Das gefällt mir sogar besser als das Marquee. Kommt gleich mal in in meine Scriptsammlung :thumbup: