GUICtrlSetOnEvent <- event abfangen im neu ersteller GUI

  • Problem ! Problem ! ;)

    ich fange neuerdings (nach anraten einiger leute hier) die events der knöpfe bzw controles mit GUICtrlSetOnEvent ab.
    nun stosse ich jedoch auf das problem, dass alle events die ich in einem neu erstellten fenster (GUICreate) nicht
    funktionieren bzw der event/funktion wird nicht ausgelöst. mein beispiel ist leider etwas zu lang zum posten, deshalb
    hier auszugsweise:

    Spoiler anzeigen
    [autoit]


    Opt('GUIOnEventMode', 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)

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

    ;erste form:
    $Form1 = GUICreate("XY", 400, 200, 568, 419)
    $Edit1 = GUICtrlCreateEdit("", 0, 65, 399, 100, BitOR($ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_VSCROLL,$ES_READONLY))
    GUICtrlSetData(-1, "")
    $Button1 = GUICtrlCreateButton("Refresh", 8, 8, 121, 49, 0)
    GUICtrlSetState($Button1, $GUI_HIDE)
    $Button2 = GUICtrlCreateButton("Save/Send log", 8, 8, 121, 49, 0)
    $Lable1 = GUICtrlCreateLabel("", 100, 170, 350, 35, 0)
    $Lable2 = GUICtrlCreateLabel("", 100, 183, 350, 35, 0)
    $Lable3 = GUICtrlCreateLabel("Status:", 10, 173, 60, 35, 0)
    GUICtrlSetFont($Lable1, 8, 700)
    GUICtrlSetFont($Lable2, 8, 700)
    GUICtrlSetFont($Lable3, 12, 700)
    $checkbox1 = GUICtrlCreateCheckbox("Debugmode", 140, 10, 150, 15, 0)
    GUICtrlSetFont($checkbox1, 8, 700)

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

    ;zweite form:
    Global $Form4 = GUICreate("Describe the bug ( german or english please)", 300, 300,-1, -1)
    Global $Edit4 = GUICtrlCreateEdit("", 10, 10, 280, 250, 0)
    Global $Button3 = GUICtrlCreateButton("Send",100, 265, 100, 30)

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

    GUISetState(@SW_HIDE, $Form4)
    GUISwitch($Form1)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit'); geht, da aus Form1
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize') ; geht, da aus Form1
    GUICtrlSetOnEvent($Button2, "_save_and_send"); geht, da aus Form1
    GUICtrlSetOnEvent($checkbox1, "_checkbox1"); geht, da aus Form1
    GUICtrlSetOnEvent($Button3, "_sendpressed"); PROBLEM HIER ! - GEHT NICHT!!!
    TraySetOnEvent( -7, '_Restore')

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

    GUISetState(@SW_SHOW, $Form1)

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

    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc

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

    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc

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

    ;PROBLEM: hier kommt er nie an bzw wird nie ausgelöst:
    Func _sendpressed()
    MsgBox(0,"1", $ok_was_clicked)
    $enteredshit = GUICtrlRead($Edit4)
    GUISetState(@SW_HIDE, $Form4)
    $ok_was_clicked = 1
    EndFunc

    [/autoit]


    Danke im Voraus!!!

    Einmal editiert, zuletzt von WhiteLion (30. März 2013 um 18:13)

  • 1. Der OnEvent-Mode ist nicht "besser". Im Normalfall ist es besser den Message-Loop zu wählen, da die Aktualisierungsrate der GUI automatisch heruntergeregelt wird, wenn der Nutzer nichts tut

    2. Global ist hier nicht nötig und sollte nicht benutzt werden. Ein "Local" außerhalb von Funktionen IST ein Global ^^

    3. In Zeile 27 switcht du die GUI Befehle auf die erste GUI. So gelten die nachfolgenden Befehle NICHT für die neue GUI ($Form4), sondern für die alte ($Form1)

  • danke für die antwort und die infos.
    leider habe hat mir punkt 3 nicht bei meinem problem weitergeholfen... ich habe es so verstanden, dass ich den event aus zeile 33 dann definieren muss, wenn die form4 aktiv ist . ich habe also folgendes gemacht, aber der event wird nach wie vor nicht ausgeführt:

    Spoiler anzeigen
    [autoit]

    Opt('GUIOnEventMode', 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)

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

    ;erste form:
    $Form1 = GUICreate("XY", 400, 200, 568, 419)
    $Edit1 = GUICtrlCreateEdit("", 0, 65, 399, 100, BitOR($ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_VSCROLL,$ES_READONLY))
    GUICtrlSetData(-1, "")
    $Button1 = GUICtrlCreateButton("Refresh", 8, 8, 121, 49, 0)
    GUICtrlSetState($Button1, $GUI_HIDE)
    $Button2 = GUICtrlCreateButton("Save/Send log", 8, 8, 121, 49, 0)
    $Lable1 = GUICtrlCreateLabel("", 100, 170, 350, 35, 0)
    $Lable2 = GUICtrlCreateLabel("", 100, 183, 350, 35, 0)
    $Lable3 = GUICtrlCreateLabel("Status:", 10, 173, 60, 35, 0)
    GUICtrlSetFont($Lable1, 8, 700)
    GUICtrlSetFont($Lable2, 8, 700)
    GUICtrlSetFont($Lable3, 12, 700)
    $checkbox1 = GUICtrlCreateCheckbox("Debugmode", 140, 10, 150, 15, 0)
    GUICtrlSetFont($checkbox1, 8, 700)

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

    ;zweite form:
    Global $Form4 = GUICreate("Describe the bug ( german or english please)", 300, 300,-1, -1)
    Global $Edit4 = GUICtrlCreateEdit("", 10, 10, 280, 250, 0)
    Global $Button3 = GUICtrlCreateButton("Send",100, 265, 100, 30)
    GUISwitch($Form4)
    GUICtrlSetOnEvent($Button3, "_sendpressed"); PROBLEM HIER ! - GEHT NICHT!!!

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

    GUISetState(@SW_HIDE, $Form4)
    GUISwitch($Form1)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit'); geht, da aus Form1
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize') ; geht, da aus Form1
    GUICtrlSetOnEvent($Button2, "_save_and_send"); geht, da aus Form1
    GUICtrlSetOnEvent($checkbox1, "_checkbox1"); geht, da aus Form1
    TraySetOnEvent( -7, '_Restore')

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

    GUISetState(@SW_SHOW, $Form1)

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

    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc

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

    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc

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

    ;PROBLEM: hier kommt er nie an bzw wird nie ausgelöst:
    Func _sendpressed()
    MsgBox(0,"1", $ok_was_clicked)
    $enteredshit = GUICtrlRead($Edit4)
    GUISetState(@SW_HIDE, $Form4)
    $ok_was_clicked = 1
    EndFunc

    [/autoit]
  • Code
    AutoIt v3 Script (neu).au3 - 4 error(s), 8 warning(s)
    !>21:25:42 AU3Check ended. Press F4 to jump to next error.rc:2

    Nächstesmal poste bitte ein Script, das auch lauffähig ist. Ich gehe daher einfachmal davon aus, dass Minx richtig liegt (Punkt 3).

    minx

    Was die Global/Local Sache angeht sehe ich ehrlich gesagt keinen Grund das als Local zu deklarieren. Schließlich handelt es sich um globale Variablen, wenn diese ausserhalb von Funktionen initialisiert oder deklariert werden, also warum nicht auch als solche kennzeichnen? Klar ist eine Deklaration nicht notwendig, aber wenn man sauber programmiert sollte man das schon tun. Da verstehe ich deine Kritik nicht ganz sorry. Wenn schon würde ich sie garnicht deklarieren, keine Ahnung wieso du sie als lokal deklarieren würdest und was dich an der globalen Deklaration stört.

  • WhiteLion, so gehts ^^ :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)

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

    ;erste form:
    $Form1 = GUICreate("XY", 400, 200, 568, 419)
    $Edit1 = GUICtrlCreateEdit("", 0, 65, 399, 100)
    GUICtrlSetData(-1, "")
    $Button1 = GUICtrlCreateButton("Refresh", 8, 8, 121, 49, 0)
    GUICtrlSetState($Button1, $GUI_HIDE)
    $Button2 = GUICtrlCreateButton("Save/Send log", 8, 8, 121, 49, 0)
    $Lable1 = GUICtrlCreateLabel("", 100, 170, 350, 35, 0)
    $Lable2 = GUICtrlCreateLabel("", 100, 183, 350, 35, 0)
    $Lable3 = GUICtrlCreateLabel("Status:", 10, 173, 60, 35, 0)
    GUICtrlSetFont($Lable1, 8, 700)
    GUICtrlSetFont($Lable2, 8, 700)
    GUICtrlSetFont($Lable3, 12, 700)
    $checkbox1 = GUICtrlCreateCheckbox("Debugmode", 140, 10, 150, 15, 0)
    GUICtrlSetFont($checkbox1, 8, 700)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit'); geht, da aus Form1
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize') ; geht, da aus Form1
    ;~ GUICtrlSetOnEvent($Button2, "_save_and_send"); geht, da aus Form1
    ;~ GUICtrlSetOnEvent($checkbox1, "_checkbox1"); geht, da aus Form1
    TraySetOnEvent( -7, '_Restore')
    GUISetState(@SW_SHOW, $Form1)

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

    ;zweite form:
    Global $Form4 = GUICreate("Describe the bug ( german or english please)", 300, 300,-1, -1)
    Global $Edit4 = GUICtrlCreateEdit("", 10, 10, 280, 250, 0)
    Global $Button3 = GUICtrlCreateButton("Send",100, 265, 100, 30)
    GUICtrlSetOnEvent($Button3, "_sendpressed"); PROBLEM HIER ! - GEHT NICHT!!!
    GUISetState(@SW_SHOW, $Form4)

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

    While 1
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc

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

    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc

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

    ;PROBLEM: hier kommt er nie an bzw wird nie ausgelöst:
    Func _sendpressed()
    MsgBox(0,"1", "Button 3 gedrückt")
    $enteredshit = GUICtrlRead($Edit4)
    GUISetState(@SW_HIDE, $Form4)
    $ok_was_clicked = 1
    EndFunc

    [/autoit]
  • Hier nochmal lauffähig, der send knof geht trotzdem nicht :(

    Spoiler anzeigen
    [autoit]


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

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

    Global $ok_was_clicked = ""

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

    Opt('GUIOnEventMode', 1)
    Opt('TrayOnEventMode', 1)
    Opt('TrayMenuMode', 1)

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

    ;erste form:
    $Form1 = GUICreate("XY", 400, 200, 568, 419)
    $Edit1 = GUICtrlCreateEdit("", 0, 65, 399, 100, BitOR($ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_VSCROLL,$ES_READONLY))
    GUICtrlSetData(-1, "")
    $Button2 = GUICtrlCreateButton("Save/Send log", 8, 8, 121, 49, 0)
    $Lable1 = GUICtrlCreateLabel("", 100, 170, 350, 35, 0)
    $Lable2 = GUICtrlCreateLabel("", 100, 183, 350, 35, 0)
    $Lable3 = GUICtrlCreateLabel("Status:", 10, 173, 60, 35, 0)
    GUICtrlSetFont($Lable1, 8, 700)
    GUICtrlSetFont($Lable2, 8, 700)
    GUICtrlSetFont($Lable3, 12, 700)
    $checkbox1 = GUICtrlCreateCheckbox("Debugmode", 140, 10, 150, 15, 0)
    GUICtrlSetFont($checkbox1, 8, 700)

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

    ;zweite form:
    Global $Form4 = GUICreate("Describe the bug ( german or english please)", 300, 300,-1, -1)
    Global $Edit4 = GUICtrlCreateEdit("", 10, 10, 280, 250, 0)
    Global $Button3 = GUICtrlCreateButton("Send",100, 265, 100, 30)
    GUISwitch($Form4)
    GUICtrlSetOnEvent($Button3, "_sendpressed"); PROBLEM HIER ! - GEHT NICHT!!!

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

    GUISetState(@SW_HIDE, $Form4)
    GUISwitch($Form1)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit'); geht, da aus Form1
    GUISetOnEvent($GUI_EVENT_MINIMIZE, '_Minimize') ; geht, da aus Form1
    GUICtrlSetOnEvent($Button2, "_save_and_send"); geht, da aus Form1
    TraySetOnEvent( -7, '_Restore')

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

    GUISetState(@SW_SHOW, $Form1)

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

    While 1
    Sleep(20)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func _Minimize()
    TraySetState(1)
    GUISetState(@SW_HIDE)
    EndFunc

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

    Func _Restore()
    TraySetState(2)
    GUISetState(@SW_SHOW)
    EndFunc

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

    ;PROBLEM: hier kommt er nie an bzw wird nie ausgelöst:
    Func _sendpressed()
    MsgBox(0,"1", $ok_was_clicked)
    $enteredshit = GUICtrlRead($Edit4)
    GUISetState(@SW_HIDE, $Form4)
    $ok_was_clicked = 1
    EndFunc

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

    Func _save_and_send()
    GUISwitch($Form4)
    GUISetState()
    Do
    Sleep(10)
    Until $ok_was_clicked = 1
    GUISwitch($Form1)
    EndFunc

    [/autoit]
  • Danke, mein problem ist gelöst. allerdings hab ich noch eine frage zu dieser aussage:

    Zitat

    1. Der OnEvent-Mode ist nicht "besser". Im Normalfall ist es besser den Message-Loop zu wählen, da die Aktualisierungsrate der GUI automatisch heruntergeregelt wird, wenn der Nutzer nichts tut


    ... wenn ich mich also in einer schleife befinde wie hier:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    EndSwitch
    Sleep(20)
    WEnd

    [/autoit]


    ...dann regelt autoit(?) automatisch die schleifenfrequenz runter und ist somit performanter oder wie soll das gehen ?
    das gleiche schafft aber die eventbasierende methode, die ja (soweit mir bekannt) vom OS abgefangen wird nicht bzw ist weniger performant ?
    weiterhin würde ich gerne wissen welche bugs bei globals entstehen können, da ich in einem script ein problem habe was ich seit monaten nicht finde... evtl. ist es das ja ?

  • Der OnEvent-Modus feuert immer auf Hochtouren. Wenn du nicht gerade ein Spiel machst und/oder eine eigene CPU Regelung einbauen möchtest, ist kommt dir der Messageloop schon entgegen. Sobald der Nutzer Maus & Tastaturaktivitäten einstellt, läuft das Skript entsprechend langsamer.

    • Offizieller Beitrag

    2. Global ist hier nicht nötig und sollte nicht benutzt werden.


    Woraus ziehst du diesen Schluß?
    Wenn du in AutoIt eine Variable erstellst ohne speziellen Namespace wird diese automatisch als Global behandelt.

    Zitat von AutoIt Hilfe

    A variable's scope is controlled by when and how you declare the variable. If you declare a variable at the start of your script and outside any functions it exists in the Global scope


    Folgende Situation im Hauptskript ist vom Namensraum daher absolut identisch:

    [autoit]


    $Variable1 = "Wert"
    Global $Variable2 = "Wert"

    [/autoit]

    Ich stimme dir zu, dass die Anwendung Globaler Variablen möglichst minimiert sein soll (wobei die Meinungen dazu auch weit auseinandergehen, ich hatte einen Thread aus dem EN-Forum dazu mal hier im Forum eingebracht). Seit der Möglichkeit mit Static-Variablen zu arbeiten ist dieses auch wesentlich einfacher geworden. Ich habe das z.T. so gelöst, dass ich in einer Verwaltungs-Funktion alle global erforderlichen Variablen statisch lokal ablege und mit entsprechendem Aufrufparameter den Wert einer jeweiligen Variable abfrage oder setze. So kann man die Variablen ausschließlich im Localen Namespace halten und trotzdem im gesamten Skript darauf zugreifen. Wenn das Skript allerdings sehr auf Geschwindigkeit orientiert ist, werden wohl die ms zum Abfragen/Setzen schon wieder zu viel sein. ;)

  • Hast du meine Beiträge überhaupt gelesen :D

    Du hast prinzipiell nur wiederholt. Ich habe nichts anderes gesagt als du, den Artiket hab ich auch verlinkt, den Scope hab ich auch erklärt ... Was wolltest du jetzt genau sagen? ^^

    • Offizieller Beitrag

    Hast du meine Beiträge überhaupt gelesen


    Selbstverständlich.
    Und nachdem er das Skript postete hast du gesagt, dass Global nicht nötig sei und nicht verwendet werden sollte. Dann hättest du konsequenterweise auch sagen müssen, dass er keinerlei Variablen im Hauptskript verwenden soll (da undeklariert auch Global) :rofl: -- Denn genau das ist die logische Konsequenz deiner Aussage in Bezug auf das gezeigte Skript. :P

  • Ich verstehs nachwievor nicht, was damit nun gemeint war, denn egal wie man die Variablen ausserhalb von Funktionen deklariert bleibt das Verhalten identisch. Sie werden immer als globale Variablen behandelt und sind durch Funktionen global veränderbar, ausser man deklariert sie erneut lokal innerhalb der Funktion myFuncDeclareLocal(), was sich wiederum nicht auf die globale Eigenschaft auswirkt, siehe erneuter Aufruf von myFunc(). Somit sehe ich nachwievor keinen Grund sie nicht ausdrücklich als Global zu deklarieren, da dies ohnehin im Hintergrund geschieht.

    Spoiler anzeigen
    [autoit]


    Global $global = 1
    Local $local = 1
    Dim $dim = 1
    $nothing = 1

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

    ConsoleWrite("outside function before call:" & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)
    myFunc()
    ConsoleWrite("outside function after call:" & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)
    myFuncDeclareLocal()
    ConsoleWrite("outside function after call:" & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)
    myFunc()
    ConsoleWrite("outside function after call:" & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)

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

    Func myFunc()
    $global+=1
    $local+=1
    $dim+=1
    $nothing+=1
    ConsoleWrite("inside function:" & @TAB & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)
    EndFunc

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

    Func myFuncDeclareLocal()
    Local $global = 5
    Local $local = 5
    Local $dim = 5
    Local $nothing = 5
    ConsoleWrite("inside function:" & @TAB & @TAB & $global & @TAB & $local & @TAB & $dim & @TAB & $nothing & @CRLF)
    EndFunc

    [/autoit]