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.
Endloser Fortschrittsbalken
-
- [ gelöst ]
-
jans16 -
16. Januar 2010 um 18:47 -
Geschlossen -
Erledigt
-
-
Such mal nach "progress marquee"
-
Machs mit GUICtrlSetData()
[autoit]
Und ner kleinen If-Abfrage.
Kleines Beispiel:$gui = GUICreate("Endlos Progressbar", 400, 100)
[/autoit][autoit][/autoit][autoit]
$bar = GUICtrlCreateProgress(55, 20, 200, 30)
$i = 0
GUISetState()While 1
[/autoit]
GUICtrlSetData($bar, $i)
$i += 1
If $i > 100 Then
$i = 0
EndIf
Sleep(50)
If GUIGetMsg() = -3 Then Exit
WEndMfG. PrideRage
-
Hallo Jans16,
du must den Fortschrittsbalken mit dem Stil $PBS_MARQUEE erzeuen. Hier noch ein kleines Skript dazu:
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
Global Const $PBS_MARQUEE = 0x08$main = GUICreate("test", 464, 56, 193, 115)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE,"GUI_CLOSE")
$Progress = GUICtrlCreateProgress(8, 8, 446, 17,$PBS_MARQUEE)
$statLabel = GUICtrlCreateLabel("Status: ", 8, 32, 446, 17)
GUISetState(@SW_SHOW)_GUICtrlProgressSetMarquee($Progress)
[/autoit] [autoit][/autoit] [autoit]GUICtrlSetData($statLabel,"Status: TrayTip 1 wird angezeigt!")
[/autoit] [autoit][/autoit] [autoit]
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
ExitEndSwitch
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
WEndFunc GUI_CLOSE()
[/autoit] [autoit][/autoit] [autoit]
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)Local Const $WM_USER = 0x0400
[/autoit] [autoit][/autoit] [autoit]
Local Const $PBM_SETMARQUEE = ($WM_USER + 10)Local $var = GUICtrlSendMsg($h_Progress, $PBM_SETMARQUEE, $f_Mode, Number($i_Time))
[/autoit] [autoit][/autoit] [autoit]
If $var = 0 Then
SetError(1)
Return 0
Else
SetError(0)
Return $var
EndIfEndFunc ;==>_GUICtrlProgressSetMarquee
[/autoit]
und das Beispiel aus der Hilfe dabei den 2. auf endlos geändertSpoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <ProgressConstants.au3>Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
[/autoit] [autoit][/autoit] [autoit]
Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $mGUICreate("My GUI Progressbar", 220, 100, 100, 200)
[/autoit] [autoit][/autoit] [autoit]
$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()$wait = 20; wait 20ms for next progressstep
[/autoit] [autoit][/autoit] [autoit]
$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()If $m = -3 Then ExitLoop
[/autoit] [autoit][/autoit] [autoit]If $m = $button Then
[/autoit]
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
mfg (Auto)Bert -
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)
[/autoit]
GUICtrlSendMsg($progress, 0x040A, 1, 10) -
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?
-
Geht nicht. Du kannst di Richtung des Marquee-Balken nicht beeinflussen.
-
Hallo,
unter Vista geht's schon:
[autoit]#include <GUIConstantsEx.au3>
[/autoit]
#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 -
mm schade .. benutze xp - trotzdem danke
-
"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 schnellkann 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)
[/autoit]
$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
WEndkann 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 schnellWeil 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>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <ProgressConstants.au3>Global $progressbar1
[/autoit] [autoit][/autoit] [autoit]
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()Until $msg = $GUI_EVENT_CLOSE
[/autoit]
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 -
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??? -
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>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
$Richtung = TrueGUICreate("Marquee Progress RTL", 400, 200)
[/autoit] [autoit][/autoit] [autoit]
$Progress = GUICtrlCreateProgress(10, 60, 380, 25, 0x08, $WS_EX_LAYOUTRTL)
GUICtrlSendMsg($Progress, 0x040A, 1, 10)
GUISetState()
AdlibRegister("_Umdrehen", 1020)Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSE
ExitFunc _Umdrehen()
[/autoit]
If $Richtung Then
GUICtrlSetStyle($Progress, 0x08, 0x2000)
$Richtung = False
Else
GUICtrlSetStyle($Progress, 0x08, $WS_EX_LAYOUTRTL)
$Richtung = True
EndIf
EndFunc ;==>_testSieht zwar nicht schön aus, aber läuft.
-
- 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>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
$Richtung = TrueGUICreate("Marquee Progress RTL", 800, 200)
[/autoit] [autoit][/autoit] [autoit]
$Progress = GUICtrlCreateProgress(10, 60, 780, 25, 0x08, $WS_EX_LAYOUTRTL)
GUICtrlSendMsg($Progress, 0x040A, 1, 10)
GUISetState()
AdlibRegister("_Umdrehen", 1020)Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSE
ExitFunc _Umdrehen()
[/autoit]
If $Richtung Then
GUICtrlSetStyle($Progress, 0x08, 0x2000)
$Richtung = False
Else
GUICtrlSetStyle($Progress, 0x08, $WS_EX_LAYOUTRTL)
$Richtung = True
EndIf
EndFunc ;==>_test
Ansonsten sieht es witzig aus -
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')
[/autoit] [autoit][/autoit] [autoit]
GUISetState()$arBar = _SwipBarOn(10, 10, 300, 20)
[/autoit] [autoit][/autoit] [autoit]
$t = TimerInit()
Do
If TimerDiff($t) > 8000 Then _SwipBarOff($arBar) ; nach 8 Sekunden wird Bar gelöscht
Until GUIGetMsg() = -3
_SwipBarOff($arBar)#region - SwipBar Funktionen
[/autoit] [autoit][/autoit] [autoit]
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
EndFuncFunc _swip()
[/autoit] [autoit][/autoit] [autoit]
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])
EndFuncFunc _SwipBarOff($arID)
[/autoit]
AdlibUnRegister('_swip')
GUICtrlDelete($arID[0])
GUICtrlDelete($arID[1])
GUICtrlDelete($arID[2])
EndFunc
#endregion - SwipBar Funktionen -
- Offizieller Beitrag
Das gefällt mir sogar besser als das Marquee. Kommt gleich mal in in meine Scriptsammlung
-