Func als Goto ersatz

  • Ich weiß, es ist für euch bestimmt ein alter Hut, aber selbst aus den Forenbeiträgen darüber, die es schon gibt werde ich nicht schlau.
    Es gibt ja kein Goto, sondern Func soll das ganze ja besser ergänzen.
    Gibt es auch eine Möglichkeit die Functions zu verschachteln?

    Ich hab ein mini Progressbar gemacht, der in einem Programm das ich grade mache sozusagen die Sanduhr ersetzen soll.
    D.h. wenn ich das Programm starte, dann läuft die Progressbar einfach immer wieder durch, bis das Skript beendet wird.

    Und daher wollte ich die Progressbar die ich nun schon hinbekommen hab, in eine Funktion packen, damit ich die bei bedarf aufrufen/starten kann. Aber da ich in der Progressbar schon Functions verwendet habe, geht das nicht, bekomme da immer die Meldung
    "Func" statement has no matching "EndFunc"

    Was gibts da für Lösungsansätze?

    P.S. Ihr schlagt euch bestimmt die Hände Überm Kopf zusammen wenn ihr mein Quelltext seht, ist warscheinlich etwas umständlich :D

    [autoit]

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

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

    guicreate("Progressbar",53,10,-1,-1,$WS_POPUP)
    GUISetBkColor(0xffffff)

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

    $name = guictrlcreateprogress(0,0,53,10)
    GUICtrlSetBkColor(-1,0xffffff); Hintergrundfarbe der Progressbar

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

    guisetstate()

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

    $r = 1
    AdlibEnable("_zaehler",10)
    _inprog()

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

    Func _inprog()
    Do
    $msg = GUIGetMsg()
    Until $r = 100

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

    If $r = 100 Then $r = 1
    _inprog()
    EndFunc

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

    Func _zaehler()
    guictrlsetdata($name,$r)
    $r+=1
    EndFunc

    [/autoit]


    EDIT: Hat sich alles in Wohlgefallen aufgelöst, mir ist im Forum mal wieder großartig geholfen worden.

    Einmal editiert, zuletzt von Piccolo1986 (21. April 2009 um 23:21)

    • Offizieller Beitrag

    So etwa?

    [autoit]

    Global $impuls1=0, $impuls2=0
    AdlibEnable('impuls', 100)

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

    $gui = GUICreate('test')
    $progress1 = GUICtrlCreateProgress(20, 10, 200, 20)
    $progress2 = GUICtrlCreateProgress(20, 40, 200, 20)
    GUISetState()

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

    Do
    Until GUIGetMsg() = -3

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

    Func impuls()
    If $impuls1 < 100 Then
    $impuls1 += 10
    GUICtrlSetData($progress1, $impuls1)
    ElseIf $impuls1 = 100 Then
    $impuls1 = 0
    $impuls2 += 10
    GUICtrlSetData($progress2, $impuls2)
    If $impuls2 = 100 Then AdlibDisable()
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Nein Conan10, so wird Dir AutoIt einen Fehler auswerfen. Du darfst nicht gleichzeitig einen Befehl hinter Then schreiben und ein EndIf benutzen.

    Abgesehen davon würde Dein Script, Piccolo1986, nicht lange laufen durch die rekursiven Funktionsaufrufe.

    Man kann das aber viel einfacher lösen:

    [autoit]


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

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

    guicreate("Progressbar",53,10,-1,-1,$WS_POPUP)
    GUISetBkColor(0xffffff)
    $name = guictrlcreateprogress(0,0,53,10)
    GUICtrlSetBkColor(-1,0xffffff); Hintergrundfarbe der Progressbar
    guisetstate()

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

    $r = 1
    AdlibEnable("_zaehler",10)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func _zaehler()
    guictrlsetdata($name,$r)
    $r+=1
    If $r = 100 Then $r = 1
    EndFunc

    [/autoit]
  • Oh - eh zu spät, dann halt noch ne dritte Version:

    Spoiler anzeigen
    [autoit]

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

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

    GUICreate("Progressbar", 53, 10, -1, -1, $WS_POPUP)
    GUISetBkColor(0xffffff)
    Global $hProgress = GUICtrlCreateProgress(0, 0, 53, 10)
    GUICtrlSetBkColor(-1, 0xffffff); Hintergrundfarbe der Progressbar
    GUISetState()

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

    AdlibEnable("_zaehler", 10)

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

    While 1 ;Message Loop
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(50) ; sonst gibts 100% CPU Auslastung
    Wend ;==> Message Loop

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

    Exit
    ;===============================================================================
    Func _zaehler()
    Local $i = GUICtrlRead($hProgress) ; spart nur die globale Variable ...
    If $i >= 100 Then $i = 1
    GUICtrlSetData($hProgress, $i+1)
    EndFunc ;==>_zaehler

    [/autoit]
  • War mir irgendwie klar, dass ich wieder über 5 Ecken denke.
    Danke für Eure Lösungvorschläge.

    @ Oscar: Woran hätte ich die Rekursion erkennen können? (um ehrlich zu sein, musste erstmal nachlesen was des bedeutet, aber jetzt ist mir klar das es ned gut gewesen wär)

    • Offizieller Beitrag

    Wenn innerhalb einer Funktion, diese Funktion wieder aufgerufen wird...

    [autoit]


    Func _inprog()
    Do
    $msg = GUIGetMsg()
    Until $r = 100

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

    If $r = 100 Then $r = 1
    _inprog() ; <-- hier
    EndFunc

    [/autoit]


    ...spricht man von Rekursion. Das ist nicht generell verboten, manchmal ist das sogar erforderlich, aber dann muss man für eine Abbruchbedingung sorgen (nicht wie hier eine unendliche Rekursion).
    Bei AutoIt ist die max. Rekursions-Tiefe auf 5100 festgelegt. Oder anders ausgedrückt, das obige Script hätte sich nach 5100 Aufrufen mit einer Fehlermeldung beendet!