UDFs - externe Funktion aufrufen

  • Die UDF and der ich im Moment arbeite hat an sich keinen großen nutzen, aber es ist nur als Übung gedacht.

    [autoit]

    Func _Repeat($dtimes,$dfunction) ;$dtimes ist die Anzahl der Wiederholungen oder 0 für eine Schleife, $dfunction ist die Funktion z.B. Sleep(100)
    $rtimes = Int($dtimes)
    If $rtimes = 0 Then
    While 1
    $dfunction ;Klar, funktioniert zwar nicht, aber hier soll automatisch die Funktion ausgeführt werden...
    WEnd
    ElseIf $rtimes >= 0 Then
    For $i = 0 to $rtimes
    $dfunction ;selbes Szenario wie oben
    Next
    EndIf
    EndFunc

    [/autoit]

    Run, etc. funktioniert logischerweise nicht...

    Irgendeine Idee?

    Einmal editiert, zuletzt von mipez (11. August 2010 um 21:37)

  • Call klappt wunderbar^^

    Gibt es eigentlich einen Befehl der erkennt, ob ein Parameter ein String ist?

  • Spoiler anzeigen
    [autoit]

    #include-once

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Repeat
    ; Description ...: Repeats a function
    ; Syntax.........: _Repeat($dtimes, $dfunction)
    ; Parameters ....: $dtimes - Times to repeat
    ; $dfunction - Function to repeat
    ; Return values .: Success - The integer of $times
    ; Failure - -1, sets @error
    ; |1 - $dtimes is not an integer
    ; Author ........: mipez
    ; Modified.......: mipez
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _Repeat($dtimes,$dfunction)
    If IsString($dtimes) Then Return SetError(1, 0, -1)
    $rtimes = Int($dtimes)
    If $rtimes = 0 Then
    While 1
    Call($dfunction)
    WEnd
    ElseIf $rtimes >= 0 Then
    For $i = 0 to $rtimes
    Call($dfunction)
    Next
    EndIf
    Return $rtimes
    EndFunc ;==>_Repeat

    [/autoit]
    [autoit]

    #include <Repeat.au3>

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

    _Repeat(2,MsgBox(0,"","Hello"))

    [/autoit]

    MsgBox taucht nur einmal auf, normalerweise wird doch das Script erst fortgesetzt, wenn Ok geklickt wurde oder? :x

  • Ja aber wenn du Funktionen mit Parametern etc aufrufst dann arbeite mit Execute.
    Außerdem muss die Befehlszeile in ' ' gesetzt werden weil _Repeat(2,MsgBox(0,"","Hello")) nur die rückgabe der Msgbox in die Parameterliste setzt dauaus folgt es wird nur 1x aufgerufen

    Deshalb

    [autoit]


    #include <Repeat.au3>

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

    _Repeat(2,'MsgBox(0,"","Hello")')

    [/autoit]

    und

    [autoit]

    Execute($dfunction)

    [/autoit]
  • Hier das funzt einwandfrei

    [autoit]

    Repeat('MsgBox(0,"","Huhu")', 2)

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

    Func Repeat($FunctionString, $count)
    ;By Sprenger120
    If $FunctionString = "" Or Int($count) < 1 Then Return SetError(-1, 0, -1)
    For $x = 1 To $count
    Execute($FunctionString)
    Next
    Return 1
    EndFunc ;==>Repeat

    [/autoit]
  • Ich hab wie du die Funktion in '' gesetzt und die Parameter getauscht, klappt^^

    Danke an alle die geholfen haben :)

    EDIT:

    Hier nochmal die fertige UDF:

    [autoit]

    #include-once

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Repeat
    ; Description ...: Repeats a function
    ; Syntax.........: _Repeat($dfunction, $dtimes)
    ; Parameters ....: $dtimes - Times to repeat, 0 for endless
    ; $dfunction - Function to repeat as a String, example: 'MsgBox(0,"","Hello")'
    ; Return values .: Success - The integer of $times
    ; Failure - -1, sets @error
    ; |1 - $dtimes is not an integer
    ; Author ........: mipez
    ; Modified.......: mipez
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _Repeat($dfunction, $dtimes)
    If IsString($dtimes) Then Return SetError(1, 0, -1)
    $rtimes = Int($dtimes)
    If $rtimes = 0 Then
    While 1
    Execute($dfunction)
    WEnd
    ElseIf $rtimes >= 0 Then
    For $si = 1 to $rtimes
    Execute($dfunction)
    Next
    EndIf
    Return $rtimes
    EndFunc ;==>_Repeat

    [/autoit]

    Einmal editiert, zuletzt von mipez (11. August 2010 um 21:38)

  • Muss das nicht heißen If Not IsString? Es muss doch ein String sein.

    If NOT IsString würde bedeuten, dass SetError nur ausgeführt wird, wenn es kein String is.

  • Ah Sorry hab mich verlesen. Dann nimm doch Not IsInt, weil man kann ja auch eine Floatzahl angeben.

  • Ah Sorry hab mich verlesen. Dann nimm doch Not IsInt, weil man kann ja auch eine Floatzahl angeben.

    Ein wenig Intelligenz sollte man beim Benutzen schon mitbringen, etwas 2,5 mal wiederholen, mitten im Code aufhören? xD