Mehrere GUIs -> Bei einem Script geht es und bei einem anderen nicht...

  • Ich finde es etwas seltsam.

    Ich versuche schon seit gestern ein Script zum laufen zu bringen, der mehrere GUIs nutzt. Da es nicht geklappt hat, habe ich ein kleineren Script gebastelt und dieser läuft.
    Gibt es in Autoit einige Funktionen die die Switch Methode blockieren?

    Weil der hier funktioniert einwandfrei:

    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 247, 168, 192, 114)
    $Button1 = GUICtrlCreateButton("Button1", 70, 60, 81, 31, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form2", 270, 168, 445, 115)
    $Button2 = GUICtrlCreateButton("Button2", 60, 60, 101, 31, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"1","btn 1")
    Case $Button2
    MsgBox(0,"2","btn 2")
    EndSwitch
    WEnd

    [/autoit]

    Sobald es aber komplexer wird, kann ich auf die Buttons drücken wie ich will und es passiert nichts.
    Ich habe dann mal das ganze mit Func() ausprobiert und es hat auch nicht wirklich geklappt.

    Es wurden zwar die Buttons erkannt, aber ich weiß nicht wie ich eine bestimmte Funktion einen Button zuordnen kann.
    Nur eine Funktion habe ich hinbekommen:

    [autoit]

    Func CloseAll()
    Exit
    EndFunc

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

    Wie mache ich das jetzt, dass zB:

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

    Func $Button1()
    MsgBox(0,"1","btn 1")
    ;Platzhalter
    EndFunc

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

    Func $Button2()
    MsgBox(0,"2","btn 2")
    ;Platzhalter
    EndFunc

    [/autoit]

    Auch beim klick auf button 1: "btn 1" als Messagebox und
    klick auf button 2: "btn 2" als Messageboxausgegeben wird ?

    Ich glaube (und hoffe) das dies mein Problem lösen wird =D

    mfg Taliis

  • Da dein script oben funktioniert wäre es vielleicht sinnvoller von dir gewesen eines zu posten das nicht funktioniert. Davon ab solltest du vielleicht mal in die Hilfe schauen und dir den advanced Mode von guigetmsg ansehen, darüber erhältst du dann nämlich auch Informationen von welchem Fenster das Event stammt. Ich vermute aber, dass dein Problem eher mit doppelt verwendeten Variablennamen oder aber mit weiteren Schleifen / langsamen Funktionen zu tun hat, welche die GUI blockieren. Dazu müsstest du aber mal dein echtes Script mit dem Problem posten.

    Was deine Funktionen unten angeht, diese sind syntaktisch falsch. Im Funktionskopf darf keine Variable verwendet werden:


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

    while 1
    ;...
    case $button1
    funktionsname()
    ;...
    wend

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

    Func funktionsname()
    ; richtig
    endfunc

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

    func $variablenname()
    ; falsch
    endfunc

    [/autoit]
  • //Edit: Misst, zuspät ;)

    Du kannst eine Funktion nicht mit einem Variablen namen belegen, also muss das so:

    [autoit]

    Func Button1()
    MsgBox(0,"1","btn 1")
    ;Platzhalter
    EndFunc

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

    Func Button2()
    MsgBox(0,"2","btn 2")
    ;Platzhalter
    EndFunc

    [/autoit]


    und dann machst du das einfach so:

    [autoit]

    ;...
    Case $Button1
    Button1()
    ;...

    [/autoit]


    müsste gehen.

    mfg
    Hauke

  • Das mit der Funktions Methode scheint nur beim Schließen zu funktionieren.
    Der Fehler muss wo anders liegen, also nochmal zurück zur Switch methode:

    Ich hab das ganze Paket jetzt mal auf 17 Zeilen beschränkt.
    Bei mir geht das nicht, obwohl es nahezu identisch mit dem anderen Script ist.

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("GUI", 630, 450, 191, 116)
    $BTN_1 = GUICtrlCreateButton("BTN", 220, 240, 127, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $BTN_1
    MsgBox(1,"1","test")
    EndSwitch
    WEnd

    [/autoit]

    Edit:
    Langsam versteh ich AutoIT nicht mehr...
    Der Kleine Script hier geht zwar immer noch nicht, aber als ich STRG-Z gedrückt habe um den vollständigen Script wiederherzustellen geht dieser wieder.
    Es kommt noch besser: Dann Speicher ich diesen ab und starte SCITE neu, weil ich dachte das hätte sich irgendwo aufgehangen und auf einmal geht der vollständige script wieder nicht...

    Ich glaub das ist heute einfach nicht mein Tag :s

    Ich downloade AutoIT einfach nochmal neu... Ich glaube da hat sich irgendwas verhaspelt...

    2 Mal editiert, zuletzt von Taliis (28. Januar 2012 um 14:34)

  • hallo, so müsste es gehen, ich hab das aus den beiden vorschlägen ( von mir und dir ) zusammengebaut:

    [autoit]

    $GUI1 = GUICreate("GUI1", 200, 100)
    $Button1 = GUICtrlCreateButton("Button1", 10, 10, 50, 50)
    GUISetState()
    $GUI2 = GUICreate("GUI2", 100, 200)
    $Button2 = GUICtrlCreateButton("Button2", 10, 10, 50, 50)
    GUISetState()
    while 1
    $msg = GUIGetMsg()
    Select
    case $msg = $Button1
    _Funktion1()
    case $msg = $Button2
    _Funktion2()
    case $msg = -3 ; das gleiche wie $GUI_EVENT_CLOSE
    exit
    EndSelect
    WEnd
    func _Funktion1()
    MsgBox(0, "", "Sie haben button 1 Gedrückt")
    Return
    EndFunc
    func _Funktion2()
    MsgBox(0, "", "Sie haben Button2 gedrückt")
    Return
    EndFunc

    [/autoit]

    mfg
    Hauke

  • Hallo Taliis.

    beim arbeiten mit mehreren Guis verwendet man im GuiGetMsg-Mdus idealerweise den Extended Modus von GuiGetMsg():

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include<WindowsConstants.au3>

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

    Global $idGui1, $idGui2=-99, $idMsgBox, $idZurueck, $idbtnExit2
    _CreateGui2() ;entweder hier oder erst wenn benötigt ($idbtmToGui2 Klick)

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

    $idGui1 = GUICreate('GUI 1', 400, 280, 140, 150, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    ;erzeugt eine GUI die zurückgebebene ID wird in der Variablen $idGui1 gespeichert
    ;die GUI hat BOXen für Mininmieren, Maximieren und ist in der Größe frei änderbar
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

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

    $idbtnToGui2 = GUICtrlCreateButton('&Aufruf GUI 2', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnICQ = GUICtrlCreateButton('&ICQ', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "ICQ" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnExit1 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "Afruf Gui 2" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    GUISetState(@SW_SHOW, $idGui1)

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

    While 1
    $nMsg = GUIGetMsg(1) ;extended Modus wichtig!!
    Switch $nMsg[1] ;für welches Fenster ist die Message
    Case $idGui1 ;ab hier ist Gui 1 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idbtnToGui2
    ;GUISetState(@SW_Hide, $idGui1) ;Gui 1 verstecken, damit nur Gui2 sichtbar ist und bearbeitet werden kann
    GUISetState(@SW_DISABLE, $idGui1) ;oder Gui 1 disablen, damit nur Gui2 bearbeitet werden kann
    ;If $idGui2 = -99 Then _CreateGui2() ;nur wenn nicht am Anfang bereits erzeugt nötig, dann auf Vorbelegung der Variable in Global achten)
    GUISetState(@SW_SHOW, $idGui2) ;Gui 2 anzeigen
    Case $idbtnICQ
    MsgBox(0,"","Jetzt würde ICQ gestartet",0,$idGui1)
    ;Run("C:\Program Files\ICQ7.0\ICQ.exe")
    Case $idbtnExit1, $GUI_EVENT_CLOSE
    _end()
    EndSwitch
    Case $idGui2 ;ab hier ist Gui 2 dran
    Switch $nMsg[0] ;welche Message wurde ausgelöst
    Case $idMsgBox
    MsgBox(0, 'Test', 'Test', 0, $idGui2)
    Case $idZurueck, $GUI_EVENT_CLOSE
    ;GUISetState(@SW_Show, $idGui1) ;Gui 1 wieder anzeigen
    GUISetState(@SW_ENABLE, $idGui1) ;oder Gui 1 wieder zur Bearbeitung zulsassen
    GUISetState(@SW_HIDE, $idGui2) ;Gui 2 verstecken
    Case $idbtnExit2
    _end()
    EndSwitch
    EndSwitch
    WEnd

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

    Func _CreateGui2()
    $idGui2 = GUICreate('GUI 2', 500, 300, 200, 50, -1, -1, $idGui1) ;wichtig ist der letzte Parameter falls beide gleichzeitig sichtbar sein sollen
    ;erzeugt eine GUI als Child von Gui1, die zurückgebebene ID wird in der Variablen $idGui2 gespeichert

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

    $idMsgBox = GUICtrlCreateButton('&MsgBox', 20, 20, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "MsgBox" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idZurueck = GUICtrlCreateButton('&Zurück zu GUI 1', 20, 50, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "zurück" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand

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

    $idbtnExit2 = GUICtrlCreateButton('be&enden', 20, 80, 100, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKSIZE + $GUI_DOCKLEFT + $GUI_DOCKTOP)
    ;verankert den Button "beenden" links und oben und fixiert die Größe
    ;beim Resizen bleibt es dadurch auf seiner Position am rechten Rand
    EndFunc ;==>_CreateGui2

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

    Func _end()
    GUIDelete($idGui2)
    GUIDelete($idGui1)
    Exit
    EndFunc ;==>_end

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

    wichtig ist natürlich auch alle Variablen müssen eindeutig sein, nicht dass du dir beim Erstellen einer weiteren Gui die Variablen einer vorhergehenden überschreibst,

    mfg autoBert

  • wenn ich 2 guis habe, würde ich mit dem EventMode arbeiten, da dies (meiner Meinung nach) dann am übersichtlichsten bleibt und auch am einfachsten, sonnst musst du in einer while schleife alle GUIGetMsg() anchrichten abfangen und der gui zurodnen, von der sie gekommen ist