Mit GUI Events Unterprogramme mit Parametern aufrufen.

  • Hallo zusammen,
    bin mal wieder mit einer Frage hier.
    Ich habe folgenden Aufruf:

    [autoit]

    GUICtrlSetOnEvent($OKButton1, "MacheIrgendwas")

    [/autoit]

    Wie müsste ich den Aufruf gestalten, damit ich das Unterprogramm "MacheIrgenwas" mit Parametern aufrufen kann.

    [autoit]

    GUICtrlSetOnEvent($OKButton1, "MacheIrgendwas(3,'abc'')"

    [/autoit]

    funktioniert irgenwie nicht so ganz.

    Viele Grüsse
    MaDeBuVie

    Einmal editiert, zuletzt von MaDeBuVie (16. Oktober 2013 um 19:21)

  • Zitat von der Hilfe

    Es kann keine Funktion aufgerufen werden die Parameter enthält.

    :rolleyes:

    Jedenfalls, du könntest es mit einer MessageLoop machen:

    [autoit]

    $hGUI = GUICreate("Test", 140, 100)
    $idOkayButton = GUICtrlCreateButton("Test-Button", 20, 20, 100, 50)

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3 ;$GUI_EVENT_CLOSE
    Exit

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

    Case $idOkayButton
    ; dein Code
    _DeineButtonFunktion($par1, $par2)
    EndSwitch
    WEnd

    [/autoit]

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Mit einer Message Loop habe ich es auch schon einmal versucht...
    Was mache ich aber, wenn ich eine GUI in einem neuen Fenster aufrufe? Muß ich dann in jedem
    Fenster eine eigene Message-Loop einbauen (z.B. Dialogfenster oder Detailfenster usw), oder wird
    dann alles in einer Loop erledigt?

    Zitat

    Oder du rufst deine Funktion auf die eine andere Funktion mit Parametern aufruft.


    Ist glaube ich auch nicht so die elegante Lösung.

    Mfg
    MaDeBuVie

  • Mit einer Message Loop habe ich es auch schon einmal versucht...
    Was mache ich aber, wenn ich eine GUI in einem neuen Fenster aufrufe? Muß ich dann in jedem
    Fenster eine eigene Message-Loop einbauen (z.B. Dialogfenster oder Detailfenster usw), oder wird
    dann alles in einer Loop erledigt?


    Das kannst du dir im Prinzip aussuchen.
    Entweder eine Funktion, wo die GUI erstellt wird + MessageLoop oder eine Funktion, wo nur die GUI (+ Controls) erstellt wird und du verarbeitest dann alles mit der Main-Loop, und falls nötig, schau dir mal den Parameter von GUIGetMsg() in der Hilfe an ;)

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ist glaube ich auch nicht so die elegante Lösung.


    Geht so. Eigentlich schon. Diese "Wrapper"-Funktionen sind gar nicht so unüblich. Und wenn es ganz hübsch sein soll, kannst du ja eine OnEvent-Handler-Funktion nach diesem Prinzip schreiben: Alle Controls werden via GUICtrlSetOnEvent mit einer Funktion (z.B. "_Handler()") verknüpft. In dieser Funktion selbst steckt eine Switch/Case-Anweisung, mit welcher du @GUI_CtrlId abfragst und mit deinen Control-ID's abgleichst. Je nachdem von welchen Control das Event kam, rufst du die entsprechende Funktion dazu auf - oder übergibst die entsprechenden Parameter. So weit klar?

    Funktioniert ja super.


    Problematisch wird es hier, wenn die erste GUI auch noch reagieren soll, solange die zweite offen ist. Ich würde das Coding eventuell so gestalten (Alle GUI-Fenster zu Anfang erstellen, und zu geeigneter Zeit ein- bzw. ausblenden):

    Spoiler anzeigen
    [autoit]

    Global $mainwindow
    Global $childwin1
    Global $Button_Main1
    Global $Button_Child1

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

    _main()

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

    Func _main()
    $mainwindow = GUICreate("Test", 340, 500)
    $Button_Main1 = GUICtrlCreateButton("Öffne Dialog", 20, 20, 100, 50)
    GUISetState()

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

    $childwin1 = GUICreate("Child GUI", 350, 350, 100, 100, -1, -1, $mainwindow)
    $Button_Child1 = GUICtrlCreateButton("Mach Was", 20, 20, 100, 50)

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

    While 1
    $aMsg = GUIGetMsg(1)
    Switch $aMsg[0] ; ctrl id
    Case -3
    If $aMsg[1] = $mainwindow Then Exit ; window
    GUISetState(@SW_HIDE, $aMsg[1])
    Case $Button_Main1
    _Childwin1()
    Case $Button_Child1
    _MachWas("Hallo")
    EndSwitch
    WEnd
    EndFunc

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

    Func _Childwin1()
    GUISetState(@SW_SHOW, $childwin1)
    EndFunc

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

    Func _MachWas($Ausgabetext)
    MsgBox(0,"Info",$Ausgabetext)
    EndFunc

    [/autoit]

    Gibt es eigentlich auch die Möglichkeit statt einem Child-CUI in einem neuen Fenster zu öffnen,

    [autoit]

    #include <WinAPI.au3>
    ;...
    _WinAPI_SetParent($childwin1, $mainwindow)

    [/autoit]