InputBox Inhalt an Funktion geben

  • Hallo,

    ich habe gerade erst mit AutoIT angefangen und würde gerne ein simples Script schreiben, was einen Dienst remote neu startet. Als erste Aufgabe muss der Hostname über eine Inputbox ermittelt und an eine Funktion übergeben werden (hier Func StartButton). Leider wird die Variable $host nicht übergeben. Was mache ich falsch?

    Code
    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)$mainwindow = GUICreate("Dienst Reset", 200, 100)GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")GUICtrlCreateLabel("Bitte den Hostnamen eingeben:", 10, 10)$host = GUICtrlCreateInput("", 10, 30, 180, 20)$startbutton = GUICtrlCreateButton("Start", 70, 65, 60)GUICtrlSetOnEvent($host, "StartButton")GUISetState(@SW_SHOW)
    While 1  Sleep(1000)WEnd
    Func StartButton($host)   MsgBox(0, "Nachricht", $host)EndFunc
    Func CLOSEClicked()  ExitEndFunc

    Einmal editiert, zuletzt von peddy (14. Dezember 2012 um 12:29)

  • Soweit ich dein Skript entziffern kann, rufst du per OnEvent eine Funktion auf.
    Bei einer Eventfunktion kann man jedoch keine Parameter übergeben (Wie bei HotKeySet etc...).

    Dein Skript (In ordentlicher Form & mit Kommentaren):

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)
    $mainwindow = GUICreate("Dienst Reset", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlCreateLabel("Bitte den Hostnamen eingeben:", 10, 10)
    $host = GUICtrlCreateInput("", 10, 30, 180, 20)
    $startbutton = GUICtrlCreateButton("Start", 70, 65, 60)
    GUICtrlSetOnEvent($host, "StartButton") ;Du setzt ein Event für das Input - Gewollt?
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func StartButton($host)
    MsgBox(0, "Nachricht", $host) ;Du gehst wahrscheinlich davon aus, dass $host dein Input darstellt. Du müsstest es also mit GUICtrlRead auslesen.
    EndFunc ;==>StartButton

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit]

    So etwas ist für den Anfang leichter im sogenannten MessageLoop-Modus zu lösen (Du verwendest den OnEvent-Modus:(

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    $hGUI = GUICreate("Dienst Reset", 200, 100) ;Hauptfenster erstellen und Handle in $hGUI ablegen
    GUICtrlCreateLabel("Bitte den Hostnamen eingeben:", 10, 10) ;Label erstellen
    $hHost = GUICtrlCreateInput("", 10, 30, 180, 20) ;Input erstellen und Control-ID in der Variable $hHost ablegen
    $hStartbutton = GUICtrlCreateButton("Start", 70, 65, 60) ;Button erstellen und Control-ID in der Variable $hStartbutton ablegen
    GUISetState(@SW_SHOW) ;Fenster sichtbar machen

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

    While 1
    $iMsg = GUIGetMsg() ;Die Control-ID von dem mit der Maus angeklickten Control erhalten. Wenn nichts angeklickt = 0
    Switch $iMsg ;Den Wert "switchen", d.h. mit allen Werten hinter Case vergleichen (Wie If).
    Case $GUI_EVENT_CLOSE ;Wenn der Schließen-Button gedrückt wurde...
    Exit
    Case $hStartbutton ;Wenn der Button "Start" gedrückt wurde...
    StartButton($hHost) ;Funktion StartButton mit Parameter $hHost (Control-ID von dem Input) aufrufen.
    EndSwitch ;Ende des Switch-Blockes
    WEnd

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

    Func StartButton($host)
    MsgBox(0, "Nachricht", GUICtrlRead($host))
    EndFunc ;==>StartButton

    [/autoit]

    lg chess

  • Hey,
    bei GUICtrlSetOnEvent muss eine Funktion verwendet werden, die keine Parameter enthält.

    [autoit]

    Func StartButton() ;~ Parameter entfernt!
    ;~ GUICtrlCreateInput gibt nur die ID zurück.
    ;~ -> So wird der Inhalt ausgelesen:
    MsgBox(0, "Nachricht", GUICtrlRead($host))
    EndFunc ;==>StartButton

    [/autoit]

    €dit:
    chesstiger : Was verwendet wird ist irrelevant.

    Zitat

    [...] etwas ist für den Anfang leichter [...]


    An sich geschmackssache. Aber "leichter" ist es auch nicht.

    Ich persönlich finde es aufwendiger und unübersichtlicher. Da packe ich lieber alles seperat in Funktionen!
    So hat man kleine eigene Codes für sich die dann schneller (und einfacher) zu lesen sind.

    Das ist zmd. Meine Meinung dazu :)

    Was ich aber damit sagen will:
    >> Es bleibt sich (beinahe) gleich.

    @peddy: Ich würde dir den OnEvent-Modus empfehlen :thumbup:

    3 Mal editiert, zuletzt von Yjuq (13. Dezember 2012 um 16:26)

  • @Make Ich meinte, das Aufrufen von Funktionen mit Parametern ist im MessageLoop-Modus einfacher (Sonst wird ja noch ein Eventhandler o.Ä. benötigt). ;)
    Und wenn man strukturiert programmiert, ist es auch nicht unübersichtlich.
    Ich persönlich verwende lieber den MessageLoop-Modus. :P

    Aber wie du gesagt hast: Jeder wie er will. ^^

    lg chess