$GUI_EVENT_CLOSE kann nicht abgefangen werden

  • hallo,

    hab ein weiteres problem mit meinem script:

    [autoit]


    #Include <WindowsConstants.au3>
    #Include <GuiConstantsEx.au3>
    #Include <File.au3>
    #Include <EditConstants.au3>
    #NoTrayIcon
    Opt("TrayMenuMode", 1)
    Opt("GUIResizeMode", 0)
    If Not FileExists(@ScriptDir & "\data.ini") Then
    _FileCreate(@ScriptDir & "\data.ini")
    $sectionSystem="AnzahlNotizen=0" & @LF & "AnzahlErinnerungen=0" & @LF & "DesktopWidth=" & @DesktopWidth & @LF & "DesktopHeight=" & @DesktopHeight
    IniWriteSection("data.ini", "SYSTEM", $sectionSystem)
    Else
    __rebuildNotes()
    EndIf
    $new=TrayCreateMenu("Neu")
    $newNote=TrayCreateItem("Notiz", $new)
    $newReminder=TrayCreateItem("Erinnerung", $new)
    TrayCreateItem("")
    $deleteAllItems=TrayCreateItem("Alle Einträge löschen")
    TrayCreateItem("")
    $exitTray=TrayCreateItem("Beenden")
    TraySetState()
    While True
    __checkDesktopSize(@DesktopWidth, @DesktopHeight)
    $msgT=TrayGetMsg()
    Select
    Case $msgT=0
    ContinueLoop
    Case $msgT=$exitTray
    If IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")>0 Then
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    $textBeforeReplace=ControlGetText("Notiz " & $i, "", "Edit1")
    $text=StringReplace($textBeforeReplace, @CRLF, Chr(160))
    $pos=WinGetPos("Notiz " & $i)
    $sectionGUI="PosX=" & $pos[0] & @LF & "PosY=" & $pos[1] & @LF & "Width=" & $pos[2] & @LF & "Heigth=" & $pos[3] & @LF & "Text=" & $text
    IniWriteSection(@ScriptDir & "\data.ini", $i, $sectionGUI)
    Next
    EndIf
    ExitLoop
    Case $msgT=$newNote
    __createNewNote()
    EndSelect
    $msgG=GUIGetMsg()
    Select
    Case $msgG=$GUI_EVENT_CLOSE
    MsgBox(0,"","Test")
    EndSelect
    WEnd
    Exit
    Func __createNewNote()
    GUICreate("Notiz " & IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", ""), 200, 200, -1, -1, $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit("", 0, 0, 198, 198, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    IniWrite(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")+1)
    EndFunc
    Func __rebuildNotes()
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    GUICreate("Notiz " & $i, IniRead(@ScriptDir & "\data.ini", $i, "Width", ""), IniRead(@ScriptDir & "\data.ini", $i, "Heigth", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosX", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosY", ""), $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit(StringReplace(IniRead(@ScriptDir & "\data.ini", $i, "Text", ""), Chr(160), @CRLF), 0, 0, IniRead(@ScriptDir & "\data.ini", $i, "Width", "")-2, IniRead(@ScriptDir & "\data.ini", $i, "Heigth", "")-2, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    Next
    EndFunc
    Func __checkDesktopSize($dWidth, $dHeight)
    If $dWidth<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopWidth", "") Or $dHeight<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopHeight", "") Then
    ; Fenster an neue Desktopgröße anpassen
    EndIf
    EndFunc

    [/autoit]

    die messagebox wird nicht angezeigt, wenn ich eines der erstellten guis per klick auf das X schließen will (zeile 46)

    was mach ich falsch???

    2 Mal editiert, zuletzt von oliverh (2. Februar 2009 um 14:41)

  • Das kann ja gar nicht gehen wenn du das im hauptscript abfrägst
    ich glaube dass man sowas was du da machen willst nicht so einfach hinbekommt^^
    den Guis wird ja gar keine Variable zugeordnet also kannst du eig auch keine $GUI_EVENT_CLOSE abfragen :D

    Padmak

    • Offizieller Beitrag

    as

    Das kann ja gar nicht gehen wenn du das im hauptscript abfrägst
    ich glaube dass man sowas was du da machen willst nicht so einfach hinbekommt^^
    den Guis wird ja gar keine Variable zugeordnet also kannst du eig auch keine $GUI_EVENT_CLOSE abfragen :D

    Padmak


    Das ist absoluter Quatsch . Der Fehler liegt daran da in der Massageabfrage folgendes steht.

    [autoit]

    Case $msgT=0
    ContinueLoop

    [/autoit]


    Das ist absoluter Blödsinn, einfach rausnehmen und schon funzt die Massageabfrage .
    Wenn du mal genau schaust wird auch die GuiMessage abgefragt.

    Edit : Das ganze sollte dann so aussehen :

    Spoiler anzeigen
    [autoit]

    #Include <WindowsConstants.au3>
    #Include <GuiConstantsEx.au3>
    #Include <File.au3>
    #Include <EditConstants.au3>
    #NoTrayIcon
    Opt("TrayMenuMode", 1)
    Opt("GUIResizeMode", 0)
    If Not FileExists(@ScriptDir & "\data.ini") Then
    _FileCreate(@ScriptDir & "\data.ini")
    $sectionSystem="AnzahlNotizen=0" & @LF & "AnzahlErinnerungen=0" & @LF & "DesktopWidth=" & @DesktopWidth & @LF & "DesktopHeight=" & @DesktopHeight
    IniWriteSection("data.ini", "SYSTEM", $sectionSystem)
    Else
    __rebuildNotes()
    EndIf
    $new=TrayCreateMenu("Neu")
    $newNote=TrayCreateItem("Notiz", $new)
    $newReminder=TrayCreateItem("Erinnerung", $new)
    TrayCreateItem("")
    $deleteAllItems=TrayCreateItem("Alle Einträge löschen")
    TrayCreateItem("")
    $exitTray=TrayCreateItem("Beenden")
    TraySetState()
    While True
    __checkDesktopSize(@DesktopWidth, @DesktopHeight)
    $msgT=TrayGetMsg()
    Select
    Case $msgT=$exitTray
    If IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")>0 Then
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    $textBeforeReplace=ControlGetText("Notiz " & $i, "", "Edit1")
    $text=StringReplace($textBeforeReplace, @CRLF, Chr(160))
    $pos=WinGetPos("Notiz " & $i)
    $sectionGUI="PosX=" & $pos[0] & @LF & "PosY=" & $pos[1] & @LF & "Width=" & $pos[2] & @LF & "Heigth=" & $pos[3] & @LF & "Text=" & $text
    IniWriteSection(@ScriptDir & "\data.ini", $i, $sectionGUI)
    Next
    EndIf
    ExitLoop
    Case $msgT=$newNote
    __createNewNote()
    EndSelect
    $msgG=GUIGetMsg()
    Select
    Case $msgG=$GUI_EVENT_CLOSE
    MsgBox(0,"","Test")
    EndSelect
    WEnd
    Exit
    Func __createNewNote()
    GUICreate("Notiz " & IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", ""), 200, 200, -1, -1, $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit("", 0, 0, 198, 198, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    IniWrite(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")+1)
    EndFunc
    Func __rebuildNotes()
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    GUICreate("Notiz " & $i, IniRead(@ScriptDir & "\data.ini", $i, "Width", ""), IniRead(@ScriptDir & "\data.ini", $i, "Heigth", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosX", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosY", ""), $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit(StringReplace(IniRead(@ScriptDir & "\data.ini", $i, "Text", ""), Chr(160), @CRLF), 0, 0, IniRead(@ScriptDir & "\data.ini", $i, "Width", "")-2, IniRead(@ScriptDir & "\data.ini", $i, "Heigth", "")-2, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    Next
    EndFunc
    Func __checkDesktopSize($dWidth, $dHeight)
    If $dWidth<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopWidth", "") Or $dHeight<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopHeight", "") Then
    ; Fenster an neue Desktopgröße anpassen
    EndIf
    EndFunc

    [/autoit]


    HAb nur den Fehler bei der Messageabfrage getilgt nicht den ganzen Quellcode durchgesehen ob noch Fehler drin sind .

  • Zitat

    Das ist absoluter Quatsch

    ok geb ich zu^^
    aber was macht er denn jetzt bei dem codeteil rein unter $GUI_EVENT_CLOSE um die Gui zu verstecken?
    ...
    Ich würds so machen

    [autoit]


    GUISetState(@SW_HIDE, @GUI_WinHandle)

    [/autoit]


    Aber da krieg ich nen fehler: ==> Unknown macro.:
    Und @oliverh
    ich würd mal die variablen deklarieren
    des mit den ganzen warnungen ist ja furchtbar :D

    Padmak

  • Wunderbar! Danke! Man lernt immer wiewder was dazu...

    Wie kann ich jetzt noch das handle des Fensters ermitteln, bei welchem auf X gedrückt wurde? in dem moment wo ich auf das x klicke wird ja dieses fenster "active" ... vllt so irgendwie?

    • Offizieller Beitrag

    @Padmak Einfach GuiDelete aufrufen .
    @oliverh: Einfach die erweiterte Abfrage von GuiGetMsg nutzen . Hilfe dazu lesen .Und vor allem der Gui eine Variable zuordnen . Dann kannst du mir der Variable auch geziehlt auf die Gui zugreifen .

    • Offizieller Beitrag

    Am besten ist es im Hauptscript schon die Gui´s zu erstellen, und sie nur zu verstecken wenn man sie nicht braucht . Ist für die Messageabfrage auch einfacher .

  • [autoit]


    $msgG=GUIGetMsg(1)
    Select
    Case $msgG[0]=$GUI_EVENT_CLOSE
    GUIDelete($msgG[1])
    EndSelect

    [/autoit]

    so?

  • Zitat

    @Padmak Einfach GuiDelete aufrufen .

    dann wird abers programm beendet-.-

    Zitat

    @oliverh: Einfach die erweiterte Abfrage von GuiGetMsg nutzen . Hilfe dazu lesen .Und vor allem der Gui eine Variable zuordnen . Dann kannst du mir der Variable auch geziehlt auf die Gui zugreifen .

    wie will er des denn zuordnen??
    sind ja variable zahlen an guis^^

    Padmak

  • also, mein script sieht nun so aus...

    [autoit]


    #Include <WindowsConstants.au3>
    #Include <GuiConstantsEx.au3>
    #Include <File.au3>
    #Include <EditConstants.au3>
    #NoTrayIcon
    Opt("TrayMenuMode", 1)
    Opt("GUIResizeMode", 0)
    If Not FileExists(@ScriptDir & "\data.ini") Then
    _FileCreate(@ScriptDir & "\data.ini")
    $sectionSystem="AnzahlNotizen=0" & @LF & "AnzahlErinnerungen=0" & @LF & "DesktopWidth=" & @DesktopWidth & @LF & "DesktopHeight=" & @DesktopHeight
    IniWriteSection("data.ini", "SYSTEM", $sectionSystem)
    Else
    __rebuildNotes()
    EndIf
    $new=TrayCreateMenu("Neu")
    $newNote=TrayCreateItem("Notiz", $new)
    $newReminder=TrayCreateItem("Erinnerung", $new)
    TrayCreateItem("")
    $deleteAllItems=TrayCreateItem("Alle Einträge löschen")
    TrayCreateItem("")
    $exitTray=TrayCreateItem("Beenden")
    TraySetState()
    While True
    __checkDesktopSize(@DesktopWidth, @DesktopHeight)
    $msgT=TrayGetMsg()
    Select
    Case $msgT=$exitTray
    If IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")>0 Then
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    $textBeforeReplace=ControlGetText("Notiz " & $i, "", "Edit1")
    $text=StringReplace($textBeforeReplace, @CRLF, Chr(160))
    $pos=WinGetPos("Notiz " & $i)
    $sectionGUI="PosX=" & $pos[0] & @LF & "PosY=" & $pos[1] & @LF & "Width=" & $pos[2] & @LF & "Heigth=" & $pos[3] & @LF & "Text=" & $text
    IniWriteSection(@ScriptDir & "\data.ini", $i, $sectionGUI)
    Next
    EndIf
    ExitLoop
    Case $msgT=$newNote
    __createNewNote()
    EndSelect
    $msgG=GUIGetMsg(1)
    Select
    Case $msgG[0]=$GUI_EVENT_CLOSE
    GUIDelete($msgG[1])
    EndSelect
    WEnd
    Exit
    Func __createNewNote()
    GUICreate("Notiz " & IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", ""), 200, 200, -1, -1, $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit("", 0, 0, 198, 198, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    IniWrite(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")+1)
    EndFunc
    Func __rebuildNotes()
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    GUICreate("Notiz " & $i, IniRead(@ScriptDir & "\data.ini", $i, "Width", ""), IniRead(@ScriptDir & "\data.ini", $i, "Heigth", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosX", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosY", ""), $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit(StringReplace(IniRead(@ScriptDir & "\data.ini", $i, "Text", ""), Chr(160), @CRLF), 0, 0, IniRead(@ScriptDir & "\data.ini", $i, "Width", "")-2, IniRead(@ScriptDir & "\data.ini", $i, "Heigth", "")-2, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    Next
    EndFunc
    Func __checkDesktopSize($dWidth, $dHeight)
    If $dWidth<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopWidth", "") Or $dHeight<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopHeight", "") Then
    ; Fenster an neue Desktopgröße anpassen
    EndIf
    EndFunc

    [/autoit]

    das problem ist nun, es funktioniert beim ersten mal immer, wenn ich aber weitere guis schließen will, verhaspelt sich das dann manchmal und schließt dann gleich 2 fenster auf einmal usw... sehr komisch das ganze *g*

    einer ne lösung?

    • Offizieller Beitrag


    Warum soll das nicht gehen ? Probier mal aus :

    Spoiler anzeigen
    [autoit]

    #Include <WindowsConstants.au3>
    #Include <GuiConstantsEx.au3>
    #Include <File.au3>
    #Include <EditConstants.au3>
    #NoTrayIcon
    Opt("TrayMenuMode", 1)
    Opt("GUIResizeMode", 0)
    If Not FileExists(@ScriptDir & "\data.ini") Then
    _FileCreate(@ScriptDir & "\data.ini")
    $sectionSystem="AnzahlNotizen=0" & @LF & "AnzahlErinnerungen=0" & @LF & "DesktopWidth=" & @DesktopWidth & @LF & "DesktopHeight=" & @DesktopHeight
    IniWriteSection("data.ini", "SYSTEM", $sectionSystem)
    Else
    __rebuildNotes()
    EndIf
    $new=TrayCreateMenu("Neu")
    $newNote=TrayCreateItem("Notiz", $new)
    $newReminder=TrayCreateItem("Erinnerung", $new)
    TrayCreateItem("")
    $deleteAllItems=TrayCreateItem("Alle Einträge löschen")
    TrayCreateItem("")
    $exitTray=TrayCreateItem("Beenden")
    TraySetState()
    While True
    __checkDesktopSize(@DesktopWidth, @DesktopHeight)
    $msgT=TrayGetMsg()
    Select
    Case $msgT=$exitTray
    If IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")>0 Then
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    $textBeforeReplace=ControlGetText("Notiz " & $i, "", "Edit1")
    $text=StringReplace($textBeforeReplace, @CRLF, Chr(160))
    $pos=WinGetPos("Notiz " & $i)
    $sectionGUI="PosX=" & $pos[0] & @LF & "PosY=" & $pos[1] & @LF & "Width=" & $pos[2] & @LF & "Heigth=" & $pos[3] & @LF & "Text=" & $text
    IniWriteSection(@ScriptDir & "\data.ini", $i, $sectionGUI)
    Next
    EndIf
    ExitLoop
    Case $msgT=$newNote
    __createNewNote()
    EndSelect
    $msgG=GUIGetMsg()
    Select
    Case $msgG=$GUI_EVENT_CLOSE
    GuiDelete()
    EndSelect
    WEnd
    Exit
    Func __createNewNote()
    GUICreate("Notiz " & IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", ""), 200, 200, -1, -1, $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit("", 0, 0, 198, 198, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    IniWrite(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")+1)
    EndFunc
    Func __rebuildNotes()
    For $i=0 To IniRead(@ScriptDir & "\data.ini", "SYSTEM", "AnzahlNotizen", "")-1
    GUICreate("Notiz " & $i, IniRead(@ScriptDir & "\data.ini", $i, "Width", ""), IniRead(@ScriptDir & "\data.ini", $i, "Heigth", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosX", ""), IniRead(@ScriptDir & "\data.ini", $i, "PosY", ""), $WS_SIZEBOX, $WS_EX_TOOLWINDOW)
    GUICtrlCreateEdit(StringReplace(IniRead(@ScriptDir & "\data.ini", $i, "Text", ""), Chr(160), @CRLF), 0, 0, IniRead(@ScriptDir & "\data.ini", $i, "Width", "")-2, IniRead(@ScriptDir & "\data.ini", $i, "Heigth", "")-2, BitOR($ES_MULTILINE, $ES_WANTRETURN))
    GUISetState()
    Next
    EndFunc
    Func __checkDesktopSize($dWidth, $dHeight)
    If $dWidth<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopWidth", "") Or $dHeight<>IniRead(@ScriptDir & "\data.ini", "SYSTEM", "DesktopHeight", "") Then
    ; Fenster an neue Desktopgröße anpassen
    EndIf
    EndFunc

    [/autoit]

    Bei aufruf von GuiDelete ohne PArameter wird die zuletzt erstellte Gui gekillt und sonst gar nix. Steht aber auch in der Hilfe .

  • Zitat

    Steht aber auch in der Hilfe .

    sag bloß
    ich hatte nochn exit drunter :cursing:
    deshalb
    aber bei mir schließt sich nur das erste fenster oO

    Padmak

  • ich verwende doch als parameter $msgG[1] (die variable enthält laut hilfe ja das handle des fensters von welchem das event gesendet wurde...)

    mach ich was falsch?

  • ok jez gehts oO
    wenn ichs aber beende kommt der fehler hier

    Code
    ==> Subscript used with non-Array variable.:
    $sectionGUI="PosX=" & $pos[0] & @LF & "PosY=" & $pos[1] & @LF & "Width=" & $pos[2] & @LF & "Heigth=" & $pos[3] & @LF & "Text=" & $text
    $sectionGUI="PosX=" & $pos^ ERROR


    ...

    Padmak

  • ja, du solltest die data.ini mal löschen... hab ja derzeit noch nichts eingebaut, was die entsprechenden einträge in der ini löscht....

  • ist es denn bei euch auch so, dass wenn noch 2 fenster übrig sind, und man das vorletzte anklickt, beide geschlossen werden??!?!?! ich blick da so langsam nemme durch...

    • Offizieller Beitrag

    ich verwende doch als parameter $msgG[1] (die variable enthält laut hilfe ja das handle des fensters von welchem das event gesendet wurde...)

    mach ich was falsch?

    Es funzt doch , hab dein Script bei mir laufen und es macht was es soll .
    Edit: Nee, doch nicht . Wenn mehrere Fenster offen sind werden alle gekillt. Das Liegt an GuiDelete das will als Parameter nicht das WinHandle sondern das Handle aus GuiCreate .

    Zitat aus der Hilfe : winhandle [optional] Windows handle as returned by GUICreate (default is the previous used).