Endlosschleife bei Msgbox beenden

  • Hallo,

    ...etwas schwierig zu erklären.
    Ich fange mal an:

    Wenn ich auf den Startbutton klicke,
    dann sollen 2 Fotos nacheinander immer gezeigt werden.
    Quasi endlos! Der weitere Code soll aber sofort starten.

    Man sieht 2 Bilder die wechseln und die Funktion läuft,
    wenn diese fertig ist kommt die Msgbox
    und dann soll die Schleife beendet werden!

    [autoit]


    Case $Start
    While 1
    $nMsg = GUIGetMsg()
    $Pic1 = GUICtrlCreatePic(@ScriptDir & "\Bild1.jpg", 0, 0, 521, 345)
    GUICtrlSetResizing($Pic1, $GUI_DOCKAUTO + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    Sleep(1000) ; die Pause zwischen den Bildern!
    GUICtrlDelete($Pic1)
    $Pic2 = GUICtrlCreatePic(@ScriptDir & "\Bild2.jpg", 0, 0, 521, 345)
    GUICtrlSetResizing($Pic1, $GUI_DOCKAUTO + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    Sleep(1000) ; die Pause zwischen den Bildern!
    GUICtrlDelete($Pic2)
    wEND
    _MeineFunktion()

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

    MsgBox(4096,"Beendet","Ende")

    [/autoit]

    Ich komme irgendwie nicht weiter...
    Ist die WhileSchleife in Ordnung?

    Grüße
    Ilse ;)

    • Offizieller Beitrag

    Dein Skript ist nicht nur unvollständig, sondern auch syntaktisch fehlerhaft (Anführungszeichen fehlen).

    Aber abgesehen davon ist auch der Ansatz verkehrt. Wenn Du einen bestimmten Code ausführen lassen willst, während im Hintergrund abwechselnd die Bilder geändert werden, dann schau Dir mal AdlibRegister an.
    Damit kannst Du eine Funktion zeitgesteuert aufrufen (hier jede Sekunde), in der Du dann jeweils das andere Bild anzeigen lässt. Du brauchst auch nicht immer wieder ein neues Bild erstellen und dieses dann wieder löschen. Erstelle das Bild einmalig (am Skriptanfang) und lade anschließend nur die Bilder neu (GUICtrlSetImage).

  • @ Oscar
    AdlibRegister kurze Rückfrage:
    Wenn ich meine Code GUICtrlSetImage...in dieser Funktion AdlibRegister drin habe
    benötige ich dann trotzdem den Loop?
    Oder reicht dieser Aufruf

    [autoit]


    Case $Start
    _AdlibRegister() ; wird hier dann ständig das Bild gesetzt? Alle X Sekunden?
    _eineFunktion () ; während diese Funktion bereits läuft?
    Msgbox(4,"Ende","Beendet")

    [/autoit]


    Ich habe folgendes gefunden was so ähnlich wäre!

    [autoit]


    #include <GUIConstantsEx.au3>
    $ani1 = GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 165, 50, 10)

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

    Case $Start
    GUICtrlSetState($ani1, 1)
    ;_meineFunktion()
    MsgBox(4096,"Beendet","Ende")
    GUICtrlSetState($ani1, 0)

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

    EndSwitch
    WEnd

    [/autoit]

    Eine Frage hierzu: shell32.dll

    Kann man sich seine Bilderanimation als dll selbst machen.
    Größer wäre prima!

    Grüße
    Ilse ;)

    • Offizieller Beitrag

    Ich habe Dir mal ein Beispiel erstellt:

    Spoiler anzeigen
    [autoit]


    Global $aChange[2] = [-14, -15], $iChange = True

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

    $hGui = GUICreate('Test', 200, 200)
    $hIcon = GUICtrlCreateIcon('shell32.dll', $aChange[$iChange], 40, 40, 32, 32)
    $hCounter = GUICtrlCreateLabel('1', 40, 100, 100, 20)
    GUISetState()
    AdlibRegister('_ChangeIcon', 1000)
    Do
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1) ; <- nur als Beispiel für das nebenbei laufende Script
    Until GUIGetMsg() = -3

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

    Func _ChangeIcon()
    $iChange = Not $iChange
    GUICtrlSetImage($hIcon, 'shell32.dll', $aChange[$iChange])
    EndFunc

    [/autoit]
  • Hi
    Prima Beispiel
    Aber wie ist die Zählfrequenz zu beeinflussen ?
    Und wieso zählt der überhaupt so schnell

    • Offizieller Beitrag

    Bei dem Beispiel bestimmt GUIGetMsg die Zählfrequenz (je schneller Du die Maus bewegst, umso schneller zählt das Script). Das hat mit dem dynamischen "Sleep" des MessageLoop-Modus zu tun.
    Wenn Du den Sleepwert selbst bestimmen willst, musst Du den OnEvent-Modus benutzen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Global $aChange[2] = [-14, -15], $iChange = True
    Opt('GUIOnEventMode', 1)

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

    $hGui = GUICreate('Test', 200, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hIcon = GUICtrlCreateIcon('shell32.dll', $aChange[$iChange], 40, 40, 32, 32)
    $hCounter = GUICtrlCreateLabel('1', 40, 100, 100, 20)
    GUISetState()
    AdlibRegister('_ChangeIcon', 1000)
    While True
    Sleep(100)
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1) ; <- nur als Beispiel für das nebenbei laufende Script
    WEnd

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

    Func _ChangeIcon()
    $iChange = Not $iChange
    GUICtrlSetImage($hIcon, 'shell32.dll', $aChange[$iChange])
    EndFunc

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

    Func _End()
    Exit
    EndFunc

    [/autoit]
  • Hier nochmal zur Veranschaulichung. Hab in Oscars Script noch ein Label eingefügt wo die Anzahl der Zählschritte in der Sekunde drinstehen. Damit ganz genau sieht, welche Auswirkungen das Bewegen der Maus hat.

    Spoiler anzeigen
    [autoit]

    Global $iLastCount, $aChange[2] = [-14, -15], $iChange = True

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

    $hGui = GUICreate('Test', 200, 200)
    $hIcon = GUICtrlCreateIcon('shell32.dll', $aChange[$iChange], 40, 40, 32, 32)
    $hCounter = GUICtrlCreateLabel('1', 40, 100, 100, 20)
    $hCountsPerSec = GUICtrlCreateLabel('', 40, 150, 100, 20)
    GUISetState()
    AdlibRegister('_ChangeIcon', 1000)
    Do
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1) ; <- nur als Beispiel für das nebenbei laufende Script
    Until GUIGetMsg() = -3

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

    Func _ChangeIcon()
    $iChange = Not $iChange
    GUICtrlSetImage($hIcon, 'shell32.dll', $aChange[$iChange])
    GUICtrlSetData($hCountsPerSec, GUICtrlRead($hCounter) - $iLastCount & " Counts/Sec")
    $iLastCount = GUICtrlRead($hCounter)
    EndFunc

    [/autoit]
  • Hier das ganze im OnEventMode:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    AutoItSetOption("GUIOnEventMode", 1)

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

    Global $__label1 = 0, _
    $__label1_i = 0, _
    $__nebenbei = 0, _
    $__time = 0, _
    $__icon = 0, _
    $__bilder[2] = [-14, -15], _
    $__gewaehltesbild = 0

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

    Main()

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

    Func Main()
    GUICreate("Foobar", 200, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    Local $start = GUICtrlCreateButton(" Start ", 10, 10)
    GUICtrlSetOnEvent($start, "_button_start")
    $__icon = GUICtrlCreateIcon('shell32.dll', $__bilder[$__gewaehltesbild], 10, 50, 32, 32)
    $__label1 = GUICtrlCreateLabel("00000000", 10, 90)
    GUICtrlSetData(-1, "")
    GUISetState()
    While 1
    Sleep(100)
    If $__nebenbei Then _tuwas_nebenbei()
    WEnd
    EndFunc

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

    Func _button_start()
    AdlibRegister("_tuwas_immerwieder", 250)
    $__nebenbei = 1
    EndFunc

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

    Func _tuwas_nebenbei()
    If TimerDiff($__time) < 1000 Then Return
    GUICtrlSetData($__label1, $__label1_i)
    If $__label1_i >= 10 Then
    AdlibUnRegister("_tuwas_immerwieder")
    $__nebenbei = 0
    $__label1_i = 0
    MsgBox(0, "Nachricht", "Fertig!")
    Return
    EndIf
    $__label1_i += 1
    $__time = TimerInit()
    EndFunc

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

    Func _tuwas_immerwieder()
    $__gewaehltesbild = Not $__gewaehltesbild
    GUICtrlSetImage($__icon, 'shell32.dll', $__bilder[$__gewaehltesbild])
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

    [/autoit]
  • @ Alle

    ihr seid die besten!

    DANKE!

    Zitat

    Wie kann man sich seine Bilderanimationen als dll selbst machen.

    Oder kann man sich irgendwo vielleicht fertige dll Animationen herunterladen.
    Mach mich mal auf die Suche.
    Vielleicht kennt ja jemand ein gutes Archiv.

    Liebe Grüße
    Ilse ;)

  • Muß mich wieder melden,

    ich habe noch etwas rumprobiert.
    Statt den Icons habe ich eine gif-Animation benutzt.

    Die gif animation wird also in einer eigenen gui geladen.
    Diese gui legt sich über alle anderen Guis.
    Kann man diese Beispiele auch einer Gif Animation machen?
    Mit z.B.
    #include "gifAnimation.au3"

    Der Code gifAnimation.au3

    [autoit]


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

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

    $hGui = GUICreate("", 640, 350, -1, -1, $WS_POPUP,$WS_EX_TOPMOST)
    $oIE = ObjCreate("Shell.Explorer.2")
    GUICtrlCreateObj($oIE, 0, 0, 640, 350)
    $oIE.navigate("about:blank")
    $oIE.document.body.style.border = "0px"
    $oIE.document.body.background = @ScriptDir& "\MeineAnimation.gif"
    $oIE.document.body.scroll = "no"
    GUISetState()

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

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

    [/autoit]

    Ich habe das Fenster mit $WS_EX_TOPMOST ganz oben
    Wenn ich nun auf Start klicke
    dann sollte die Animation in der Gui erscheinen
    aber der Code im Hintergund auf der anderen Gui gleichzeitig ablaufen.

    Irgendwie So:

    [autoit]


    Func _button_start()
    AdlibRegister
    ;Gif Animation...
    EndFunc

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

    So, jetzt brauche ich Zeit um das alles in Ruhe zu kapieren!
    War heute ein bisschen viel! ?(


    Liebe Grüße
    Ilse ;)

  • Hab mein Skript, an die gif-animation angepasst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    AutoItSetOption("GUIOnEventMode", 1)

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

    Global $__label1 = 0, _
    $__label1_i = 0, _
    $__nebenbei = 0, _
    $__time = 0, _
    $__gif = 0, _
    $__gif_bild = @ScriptDir & "\MeineAnimation.gif", _
    $__gif_bild_breite = 335, _
    $__gif_bild_hoehe = 335

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

    Main()

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

    Func Main()
    GUICreate("Foobar", 400, 500)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    Local $start = GUICtrlCreateButton(" Start ", 10, 10)
    GUICtrlSetOnEvent($start, "_button_start")

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

    Local $oIE = ObjCreate("Shell.Explorer.2")
    $__gif = GUICtrlCreateObj($oIE, 0, 50, $__gif_bild_breite, $__gif_bild_hoehe)
    $oIE.navigate("about:blank")
    $oIE.document.body.style.border = "0px"
    $oIE.document.body.scroll = "no"
    $oIE.document.body.background = $__gif_bild
    GUICtrlSetState($__gif, $GUI_HIDE)

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

    $__label1 = GUICtrlCreateLabel("00000000", 10, 90+$__gif_bild_hoehe)
    GUICtrlSetData($__label1, "")

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

    GUISetState()
    While 1
    Sleep(100)
    If $__nebenbei Then _tuwas_nebenbei()
    WEnd
    EndFunc

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

    Func _button_start()
    _gif_an_aus(1)
    $__nebenbei = 1
    EndFunc

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

    Func _tuwas_nebenbei()
    If TimerDiff($__time) < 1000 Then Return
    GUICtrlSetData($__label1, $__label1_i)
    If $__label1_i >= 10 Then
    ;_gif_an_aus(0) ; Funktion oben oder unten auskommentieren, je nachdem ob das bild während der msgbox angezeigt werden soll!
    $__nebenbei = 0
    $__label1_i = 0
    MsgBox(0, "Nachricht", "Fertig!")
    _gif_an_aus(0) ; Funktion oben oder unten auskommentieren, je nachdem ob das bild während der msgbox angezeigt werden soll!
    Return
    EndIf
    $__label1_i += 1
    $__time = TimerInit()
    EndFunc

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

    Func _gif_an_aus($mode)
    Switch $mode
    Case 0
    GUICtrlSetState($__gif, $GUI_HIDE)
    Case 1
    GUICtrlSetState($__gif, $GUI_SHOW)
    EndSwitch
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    Exit

    [/autoit]
  • Hallo Cyberdyne,

    ich konnte mich leider erst heute wieder melden.
    (Die liebe Arbeit...)

    SAGE NOCHMALS MERCI

    Werd jetzt alles mal in Ruhe probieren

    Liebe Grüße
    Ilse ;)