Absturz nach Listview Notify Event

  • Hi,
    ich stehe heute vor einem Merkwürdigen Problem.
    Wenn ich $NM_DBLCLK auf eine Listview registriere und die Event Funktion eine Funktion startet die eine GUI erzeugt ,dann freezen die gesamten GUIs auf ein mal und es werden keine Controls von dem Child angezeigt.
    Ich habe den Fehlercode aus meinem Projekt mal in ein einfaches Beispiel umgewandelt weil es einfach zu groß ist. (Das Problem ist in dem Beispiel auch noch vorhanden ;) )

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "RegisterNotify_UDF.au3"
    #include <GUIListview.au3>

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

    $Form1 = GUICreate("", 633, 454, 192, 114)
    $ListView = GUICtrlCreateListView("", 88, 48, 393, 257, BitOR($LVS_NOCOLUMNHEADER, $LVS_REPORT, $WS_HSCROLL))
    _GUICtrlListView_AddColumn(GUICtrlGetHandle($ListView), "", 280)
    GUISetState(@SW_SHOW)

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

    For $x = 0 To 10
    GUICtrlCreateListViewItem($x, $ListView)
    Next

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

    _Notify_SetNotifytoFunc(GUICtrlGetHandle($ListView), $NM_DBLCLK, "_2")
    ;~ _Notify_SetHandletoFunc(GUICtrlGetHandle($ListView), "_2",$NM_DBLCLK)
    _StartUp_Notify(True); Registrieren von $WM_NOTIFY

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    WEnd

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

    Func _2($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    If $iNotifyCode = $NM_DBLCLK Then _1()
    EndFunc ;==>_2

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

    Func _1()
    $hGui_SchuelerAntwort = GUICreate("Nachricht von beantworten", 295, 200, -1, -1, -1, $WS_EX_TOOLWINDOW);, $hGui_Lehrer)
    GUICtrlCreateEdit("", 0, 0, 289, 73, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $WS_VSCROLL), 0)
    $SchuelerMsg_Lehrer = GUICtrlCreateEdit("", 0, 80, 289, 73, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL))
    $SchuelerMsg_Absenden = GUICtrlCreateButton("Absenden", 0, 160, 289, 33)
    ;~ _IconNameToID_SetA(-1, "C_MSG")
    GUISetState(@SW_SHOW, $hGui_SchuelerAntwort)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    ExitLoop
    Case $SchuelerMsg_Absenden

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

    EndSwitch
    WEnd
    ;~ GUIDelete($hGui_SchuelerAntwort)
    ;~ SubMode(0)
    EndFunc ;==>_1

    [/autoit]

    Ich habe das benötigte UDF angehängt und hoffe auf schnelle Hilfe.
    Schon mal Danke im Vorraus!

    • Offizieller Beitrag

    Ja, die Notify-Funktion muss so schnell wie möglich wieder verlassen werden. Eine MsgBox oder wie hier eine GUI mit Schleife ist "tödlich".

    Siehe auch:

    Zitat

    Warning: blocking of running user functions which executes window messages with commands such as "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!

  • Gut danke Oscar das war der Knackpunkt.
    Wenn ich es so umänder funktioniert es super.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "RegisterNotify_UDF.au3"
    #include <GUIListview.au3>

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

    $Form1 = GUICreate("", 633, 454, 192, 114)
    $ListView = GUICtrlCreateListView("", 88, 48, 393, 257, BitOR($LVS_NOCOLUMNHEADER, $LVS_REPORT, $WS_HSCROLL))
    _GUICtrlListView_AddColumn(GUICtrlGetHandle($ListView), "", 280)
    GUISetState(@SW_SHOW)

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

    $Clicked = False

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

    For $x = 0 To 10
    GUICtrlCreateListViewItem($x, $ListView)
    Next

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

    _Notify_SetNotifytoFunc(GUICtrlGetHandle($ListView), $NM_DBLCLK, "_2")
    ;~ _Notify_SetHandletoFunc(GUICtrlGetHandle($ListView), "_2",$NM_DBLCLK)
    _StartUp_Notify(True); Registrieren von $WM_NOTIFY

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit

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

    EndSwitch
    If $Clicked = True Then _1()
    WEnd

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

    Func _2($hWndFrom, $iIDFrom, $iNotifyCode, $wParam, $lParam)
    $Clicked = True
    EndFunc ;==>_2

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

    Func _1()
    $hGui_SchuelerAntwort = GUICreate("Nachricht von beantworten", 295, 200, -1, -1, -1, $WS_EX_TOOLWINDOW);, $hGui_Lehrer)
    GUICtrlCreateEdit("", 0, 0, 289, 73, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $WS_VSCROLL), 0)
    $SchuelerMsg_Lehrer = GUICtrlCreateEdit("", 0, 80, 289, 73, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL))
    $SchuelerMsg_Absenden = GUICtrlCreateButton("Absenden", 0, 160, 289, 33)
    ;~ _IconNameToID_SetA(-1, "C_MSG")
    GUISetState(@SW_SHOW, $hGui_SchuelerAntwort)

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

    While 1
    Switch GUIGetMsg()
    Case -3
    ExitLoop
    Case $SchuelerMsg_Absenden

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

    EndSwitch
    WEnd
    ;~ GUIDelete($hGui_SchuelerAntwort)
    ;~ SubMode(0)
    $Clicked = False
    EndFunc ;==>_1

    [/autoit]


    [Gelöst]