Wie arbeitet man richtig mit functionen (func)?

  • So also ich habe jetzt schon alles abgesucht und rumgebastet, und auch in der Hilfe geschaut, habe zwar einiges gefunden aber nicht womit ich richtig klar komme. Ich möchte gerne eigene standart Funktionen schrieben, ich glaube man nennt die hier UDF, aber irgendwie klappt das nicht. Den Syntax von Func habe ich schon irgendwie verstanden, aber nicht sorichtig wie ich damit umgehe. Meine Fragen:

    Mein Fall: Button wird gedrückt, damit will ich was ausühren und ein Log schreiben. Und das mit einigen vielen Buttons.

    [autoit]

    Func func_logWrite() $logWrite = FileOpen ("installLog.txt", 1)
    FileWriteLine ($logWrite, "(" & @MDAY & "." & @MON & "." & @YEAR & " - " & @Hour & ":" & @Min & ") " & $logText)
    FileClose ($logWrite)GUICtrlSetState ( $button_name, $GUI_DISABLE )
    MsgBox(0, "Information", $logText)
    EndFunc

    [/autoit]


    Diese Funktion will ich aufrufen und will einige Variablen übergeben wie den $logText und den namen des buttons den ich gerade angeklickt habe.

    Vielleicht hat auch jemand ein Tut oder so für mich.

    Vielen Dank!

    • Offizieller Beitrag

    Die Angaben, die von der Funktion verarbeitet werden sollen, werden im Funktionsaufruf als Parameter übergeben. Dazu werden in der Funktion entsprechende Platzhalter deklariert. Eine Funktion sollte entweder einen Ergebniswert zurückgeben oder einen Wert für Erfolg(1 bzw. >0)/Mißerfolg(0)

    [autoit]

    ; Bsp. 1
    Func _Addieren($Param_1, $Param_2)
    Return $Param_1 + $Param_2
    EndFunc

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

    ; Anwendung:
    $Summe = _Addieren(120, 70)
    $Summe = _Addieren(10, 200)

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

    ; Bsp. 2
    #include <File.au3>
    Func _Log($LOGFILE, $TEXT)
    Return _FileWriteLog($LOGFILE, $TEXT)
    EndFunc

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

    ; Anwendung:
    _Log(@ScriptDir & '\Event.log', 'Programm Start')
    _Log(@ScriptDir & '\Event.log', 'Error blabla')

    [/autoit]
  • Hallo,

    also wenn du Variablen an Funktionen übergeben willst geht das auch so:

    [autoit]

    Func func_logWirte($logText) ...

    [/autoit]

    Die übergebene Variable kannste dann in deiner Funktion benutzen.
    Wenn das ganze jetzt über einen Button ausgelöst werden soll, geht das glaube ich (Achtung: Halbwissen :)) nicht über die Event-Mode, sondern nur über den Messageloop-Modus (wenn falsch: Bitte klärt mich auf :))

    Viel wichtiger wäre jetzt mal für mich zu wissen: Wo kommt den dein $logText her?
    Du kannst in Funktionen auch auf globale Variablen zugreifen und müsstest auch net unbedingt was übergeben.

    mfg

  • Es geht darum ein Script zu schrieben womit ich eine Installationsprotokoll erstellen kann.

    Ich gebe als erstes die Rechnerdaten ein, und dann habe ich für jeden Arbeitsschritt ein Button, den ich drücken kann, und der soll dann ein Log-Eintrag erstellen und den Button eingrauen.

    • Offizieller Beitrag

    Wenn das ganze jetzt über einen Button ausgelöst werden soll, geht das glaube ich (Achtung: Halbwissen :)) nicht über die Event-Mode, sondern nur über den Messageloop-Modus (wenn falsch: Bitte klärt mich auf :))


    Achtung: Aufklärung! :rofl:
    Das geht selbstredend sowohl im GUIGetMsg- als auch im OnEventMode ;) .
    Unterschied: Im Event-Mode wird bei Erstellung des Ctrl ein Funktion zugeordnet (GUICtrlSetOnEvent), die durch ein Event dieses Ctrl aktiviert wird. Im GUIGetMsg-Mode wird ständig die GUI abgefragt, ob und welches Ctrl denn gerade ein Event ausgelöst hat. Die entsprechende ID wird dann weiterverarbeitet.

    Es geht darum ein Script zu schrieben womit ich eine Installationsprotokoll erstellen kann.


    Füge doch hinter jede Codezeile, die du loggen willst einfach ein: _FileWriteLog("Datei", Text)

  • Ja klar. Wenn ich jetzt

    [autoit]

    GUICtrlSetOnEvent($button, "func_logWrite")

    [/autoit]


    mache, klappt das schon.

    Aber was ist, wenn ich jetzt eine Funktion hat, die Parameter braucht? Geht das auch über SetOnEvent?
    So meinte ich das :)

    €: Lux, zeig doch noch ein wenig mehr Code, dann kann man dir besser helfen :)

    • Offizieller Beitrag

    Aber was ist, wenn ich jetzt eine Funktion hat, die Parameter braucht? Geht das auch über SetOnEvent?
    So meinte ich das :)


    Geht auch. Du weist z.B. mehreren Button dieselbe Funktion zu. In Abhängigkeit des gedrückten Buttons rufst du von dort eine Funktion mit Parameter auf:

    [autoit]

    ; Button-Funktion
    Func _ButtonClicked()
    Switch @GUI_CtrlHandle
    Case $Button1
    _Button('Bla')
    Case $Button2
    _Button('Blabla')
    Case $Button3
    _Button('Blub')
    EndSwitch
    EndFunc

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

    Func _Button($Parameter)
    ; der Code, zb.:
    GUICtrlSetData($ctrl, $Parameter)
    EndFunc

    [/autoit]