Mit GUI Events Unterprogramme mit Parametern aufrufen.

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

    GUICtrlSetOnEvent($OKButton1, "MacheIrgendwas")


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


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


    funktioniert irgenwie nicht so ganz.


    Viele Grüsse
    MaDeBuVie

  • Zitat von der Hilfe

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

    :rolleyes:


    Jedenfalls, du könntest es mit einer MessageLoop machen:
    $hGUI = GUICreate("Test", 140, 100)
    $idOkayButton = GUICtrlCreateButton("Test-Button", 20, 20, 100, 50)


    GUISetState()


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


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

    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

  • Funktioniert ja super.
    (siehe Anhang).


    Gibt es eigentlich auch die Möglichkeit statt einem Child-CUI in einem neuen Fenster zu öffnen,
    die GUI in einem Bereich der Main-GUI anzeigen zu lassen und wieder zu schliessen?


    Viele Grüße
    MaDeBuVie

  • 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):


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


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