List View + OnEventModus

  • Hallo,
    ich arbeite jetzt zum ersten Mal mit dem OnEventModus und würde gerne Klicks auf ein ListViewItem registrieren, was mache ich falsch?
    Script:

    Spoiler anzeigen
    [autoit]


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

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

    Opt("GUIOnEventMode", 1)

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

    $hGUI = GUICreate("Registry Auslesen", 900, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Ex")
    $listview = GUICtrlCreateListView("Name |Pfad ", 10, 10, 880, 300)
    _GUICtrlListView_SetColumnWidth($listview, 0, 200)
    _GUICtrlListView_SetColumnWidth($listview, 1, 670)

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

    GUISetState(@SW_SHOW)

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

    Read()

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

    Func Read()
    Dim $Array[1]
    Dim $Array2[1]
    Dim $Eintrag[30]; nur provisorisch
    For $i = 1 To 100
    $key = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", $i)
    If @error <> 0 Then
    ExitLoop
    EndIf
    $key2 = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", $key)
    _ArrayAdd($Array, $key)
    _ArrayAdd($Array2, $key2)
    $Eintrag[$i] = GUICtrlCreateListViewItem($key & "|" & $key2, $listview)
    GUISetOnEvent($Eintrag[$i], "ID");Das funktioniert nicht
    Next
    ;$ii = _ArrayMaxIndex($Array)
    ;GUICtrlCreateLabel($ii, 10, 400)
    EndFunc ;==>Read

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

    Func ID()
    MsgBox(0, "Test", "Name " & @GUI_CtrlId)
    EndFunc ;==>ID

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

    Func Ex()
    Exit
    EndFunc ;==>Ex

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

    While 1
    Sleep(100)
    WEnd

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

    Einmal editiert, zuletzt von xp_fan (10. Dezember 2009 um 17:45)

  • Eine Listview arbeitet anders als ein normales Control. Du kannst einen klick auf die Listview nur über Umwege "abfragen". Die Ctrl_ID wird aber immer die selbe sein, egal welches Listview Item du wählst. Denn die komplette Listview, samt Listviewitems, ist ein zusammengefasstes Control. Du hast allerdings die Möglichkeit in der Hauptschleife sowas hier zu machen:

    [autoit]

    If Not $selected = _GUICtrlListView_GetSelectionMark($ListView) Then
    $selected = _GUICtrlListView_GetSelectionMark($ListView)
    MsgBox(0,"","Anderes ListviewItem ausgewählt, die neue auswahl hat den Index :"&$selected)
    EndIf

    [/autoit]

    Alternativ (und wahrscheinlich professioneller) gehen auch Sachen mit GUIRegisterMsg() aber davon hab ich keine Ahnung

  • Klicks kannst du so auswerten. Funktioniert im OneventModus genauso.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    ;Globals für die Funktion:

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

    $MainGui = GUICreate("DBClick test", 616, 395, 192, 120)
    ;GUISetBkColor(0x0)

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

    $ListView = GUICtrlCreateListView("Produkt Name", 8, 8, 498, 214);Das ListView mit $LVS_LIST...
    $TestItem = GUICtrlCreateListViewItem("TEST1", $ListView);Test 1
    $TestItem = GUICtrlCreateListViewItem("TEST2", $ListView);Test 2
    $hEdit = GUICtrlCreateInput("edit", 1,300 , 177, 21)
    $hbutton = GUICtrlCreateButton("edit", 150,300 , 177, 21)

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

    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_notify, "_DoubleClickOnListView");Die Funktion wird bei einem Klick auf die GUI aufgerufen!

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

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

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

    Func _DoubleClickOnListView($hWndGUI, $MsgID, $wParam, $lParam);Die Eigentliche Funktion
    Local $tagNMHDR, $event, $hwndFrom, $code
    ConsoleWrite( $hWndGUI& @CRLF& $MsgID& @CRLF& $wParam& @CRLF& $lParam& @CRLF)
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3); Checkt wie das EVENT aussieht
    If $wParam = $ListView Then;Wenn der Klick auf das ListView ging..
    If $event = $NM_DBLCLK Then;.. Wenn es ein DoppelKlick war
    ; Hier kommt hin was er machen soll:
    ConsoleWrite("Doppelklick ins Listview " & @CRLF)
    EndIf
    EndIf
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>_DoubleClickOnListView

    [/autoit]

    edit \
    Hab hier noch eine etwas erweiterte mit Pfeiltasten:

    Spoiler anzeigen
    [autoit]


    Func _SHLV_WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    ; Prog@ndy
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hListView1
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    ;Local $ItemText = _GUICtrlListView_GetItemText($hListView1, _GUICtrlListView_GetSelectedIndices($hListView1), 0)
    ;_Browse($ItemText)

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

    Case $LVN_KEYDOWN
    ;Nuts Zusatz ohne Garantie ;)
    Local $tagLVKEYDOWN = $tagNMHDR & "; USHORT wVKey; UINT flags;"
    $tNMHDR = DllStructCreate($tagLVKEYDOWN, $ilParam)
    Switch DllStructGetData($tNMHDR, "wVKey")
    Case 0x27; rechte Pfeiltaste
    ;Local $ItemText = _GUICtrlListView_GetItemText($hListView1, _GUICtrlListView_GetSelectedIndices($hListView1), 0)
    ;_Browse($ItemText)
    Case 0x25 ;linke Pfeiltaste
    ;_Browseback()
    EndSwitch
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_SHLV_WM_NOTIFY

    [/autoit]

    Einmal editiert, zuletzt von nuts (10. Dezember 2009 um 17:42)