SUB und ControlID

  • Hallo,

    ich wollte heute mal anfangen mit AutoIT und der GUI und stelle mir nun zwei fragen.
    1. (hat nix mit der GUI zu tun) wie kann ich mit AutoIT eigentlich Prozeduren (SUBs) also Unterprogramme realisieren (der Übersicht wegen)? Ich habe jetzt mal eine Func Bla(), also eine Funktion ohne Rückgabewert, dazu benutzt aber weiß nicht ob das geht.
    2. Ich habe ein Fenster mit einem Button und der Rückgabewert eines Buttons wenn man ihn klickt ist ja seine ControlID, wie bekomme ich denn die ControlID des Buttons raus?
    Wenn ich abfragen möchte ob dieser gedrückt worden ist, brauch ich die ja dann offensichtlich.

    Ich komme aus der VB Ecke und dort gibts Events für Controls, deshalb sind meine Fragen hier vieleicht für die meissten etwas kleingeistig.

    Vielen Dank.

    mfg Fire

    • Offizieller Beitrag

    Hi,

    mit Funktionen

    Func bla()
    Endfunc

    ist schon richtig.

    2. Frage sieht man aus dem Helpfile bsp:

    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("My GUI Button") ; will create a dialog box that when displayed is centered

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

    Opt("GUICoordMode",2)
    $Button_1 = GUICtrlCreateButton ("Run Notepad", 10, 30, 100)
    $Button_2 = GUICtrlCreateButton ( "Button Test", 0, -1)

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

    GUISetState () ; will display an dialog box with 2 button

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

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $Button_1
    Run('Notepad.exe') ; Will Run/Open Notepad
    Case $msg = $Button_2
    MsgBox(0, 'Testing', 'Button 2 was pressed') ; Will demonstrate Button 2 being pressed
    EndSelect
    Wend

    [/autoit]

    So long,

    Mega

  • Zu Frage 2:


    [autoit]


    $button = GUICtrlCreateButton("Klick mich",1,1)

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

    While 1
    $msg = GUIGetMsg() ; <= Hier kommt das "Signal" an, dass jemand den Button geklickt hat
    Switch $msg
    Case $button
    FunktionsAufruf()
    EndSwitch
    WEnd

    [/autoit]

    2 Mal editiert, zuletzt von Sn0opy (27. Juni 2007 um 10:22)

  • Ok, herzlichen Dank erst mal.
    So schnell wie man hier eine Antwort bekommt, dass ist ja absoluter Wahnsinn.

    Ich habe wahrscheinlich etwas genauer schreiben müssen was ich tue.

    Ich habe einen Textfeld und einen Button welcher mir die eingaben des Textfeldes an eine Funktion übergibt, welche wiederum ständig etwas machen soll. Das ganze soll so lange laufen bis ich mit dem zweiten Button unterbreche oder ggf. damit sogar einfach das Programm beende.
    Also der zweite Button soll irgendwie auf Standby warten bis er gedrückt wird und dann quasi eine Schleife unterbricht.

    Mit Events kein Thema, aber ohne... ;)

    Vielen Dank.

    mfg Fire

    • Offizieller Beitrag

    Hallo,

    es gibt auch einen OnEvent-Modus. In der Hilfe unter "GUI Reference" -> "OnEvent Mode"!

    @it: *to lahm*, @Mega war mal wieder schneller!

  • $btnAUS ist das Problem...


    [autoit]

    #include <GUIConstants.au3>
    #Include <date.au3>

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

    Dim $z = 0
    Dim $msg
    Dim $Host

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

    GUICreate("Dauerping")

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

    $Host = GUICtrlCreateInput ("", 10, 35, 300, 20)

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

    $btnAN = GUICtrlCreateButton ("Ok", 10, 5, 70,)
    $btnAUS = GUICtrlCreateButton ("Beenden", 90, 5, 70)

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

    GUISetState ()

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

    $msg = 0
    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
    Select
    Case $msg = $btnAUS
    exit
    Case $msg = $btnAN
    SUB()
    EndSelect

    Wend

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

    Func SUB()

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

    $var = Ping($Host,250)

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

    If $var Then

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

    ;Log schreiben
    $file = FileOpen("test.txt", 1)
    ;If $file = -1 Then
    ;MsgBox(0, "Error", "Kann Datei nicht öffnen,möglicherweise ist sie schon von einem anderen Prozess geöffnet.")
    ;Exit
    ;EndIf
    FileWriteLine($file, _Now() & " " & $Host & " wurde erreicht !!!" & @CRLF)
    FileClose($file)

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

    Else

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

    ;Log schreiben
    $file = FileOpen("test.txt", 1)
    ;If $file = -1 Then
    ;MsgBox(0, "Error", "Kann Datei nicht öffnen,möglicherweise ist sie schon von einem anderen Prozess geöffnet.")
    ;Exit
    ;EndIf
    FileWriteLine($file, _Now() & " " & $Host & " wurde NICHT erreicht !!!" & @CRLF)
    FileClose($file)

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

    EndIf

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

    Sleep(5000)

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

    EndFunc

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

    msgbox(0,"ende","")

    [/autoit]

    Einmal editiert, zuletzt von Firestone (27. Juni 2007 um 10:58)

  • Hmm, auch nicht schlecht, danke.
    Komisch das Komma hat nicht gestört.

    Nun ist zwar der Code kürzer und schöner aber wie könnte ich nun das Log schreiben lassen bis ich den Beenden-Button drücke?

    mfg Fire

    Einmal editiert, zuletzt von Firestone (27. Juni 2007 um 11:42)

  • Schon, aber noch ist es ja auch kein Dauerping. Alles was in der Func SUB() ist soll natürlich in einer Schleife laufen bis der Beenden Button gedrückt wird.
    Wenn ich da jetzt eine Schleife drum bastle komme ich zur Laufzeit ja nie wieder an die Stelle mit dem Beenden Button.

    mfg Fire

  • BugFix
    Das funzt nur manchmal und auch nur wenn ich auf dem Beenden Button rumhämmere wie wild.

    Hier der Code:

    Spoiler anzeigen

    #include <file.au3>
    #include <GUIConstants.au3>
    #Include <date.au3>


    Dim $msg
    Dim $Host
    Dim $started

    $mainwindow = GUICreate("Dauerping")
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

    $Host = GUICtrlCreateInput ("", 10, 35, 300, 20)

    ;Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus

    $btnAN = GUICtrlCreateButton ("Ok", 10, 5, 70)
    $btnAUS = GUICtrlCreateButton ("Beenden", 90, 5, 70)


    GUISetState ()

    $msg = 0
    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
    Select
    Case $msg = $btnAUS
    exit
    Case $msg = $btnAN
    SUB()

    EndSelect

    Wend

    Func SUB()

    $var = Ping($Host,250)
    msgbox(0,$Host,"");zum testen
    If $var Then

    ;Log schreiben
    _FileWriteLog(@ScriptDir & "\my.log", $Host & " wurde erreicht !!!")


    Else

    ;Log schreiben
    _FileWriteLog(@ScriptDir & "\my.log", $Host & " wurde NICHT erreicht !!!")

    EndIf


    Sleep(5000)

    EndFunc

    msgbox(0,"ende","")

  • Du könntest es ganz primitv machen und eine weitere Funktion für btAus machen. In diese Funktion schreibst du einfach Sleep(2147483647). Dann pausiert das Script solange, bis du wieder den anderen Knopf startest und somit die andere Funktion wieder anschaltest.

    Wie gesagt, sehr primitiv, aber es funktioniert :D

  • versteh ich nicht, wenn er in sleep steht wartet er doch nicht auf eine Eingabe, dann pausiert doch das gesamte Script, oder?

    Eigentlich suche ich doch nur nach einer Möglichkeit eine endlose While-WEnd Schleife mit einem Button zu unterbrechen.
    Gibt es da keine saubere Lösung?

    mfg Fire

    Einmal editiert, zuletzt von Firestone (27. Juni 2007 um 13:25)

    • Offizieller Beitrag

    OK, war nicht ideal ;)
    Sollte so besser klappen:

    Edit: dann können wir noch eine Variable sparen

    Spoiler anzeigen
    [autoit]

    While $msg <> $GUI_EVENT_CLOSE
    $msg = GUIGetMsg()
    Select
    Case $msg = $btnAUS
    exit
    Case $msg = $btnAN
    SUB()
    $begin = TimerInit()
    EndSelect
    If TimerDiff($begin) > 5000 Then; alle 5 Sekunden
    SUB()
    $begin = TimerInit()
    EndIf
    Wend

    [/autoit]