GuictrlcreateListviewItem - Doppelklick Funktion

  • Mahlzeit,

    vorerst einmal der Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <ListviewConstants.au3>

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

    GUICreate("", 750, 450)
    $lview = GUICtrlCreateListView("Full HD |Pfad", 0, 0, 500, 300)
    $1080p = _FileListToArray(@ScriptDir & "\Movies\1080p\", "*", "2")
    For $i = 1 To $1080p[0]
    GUICtrlCreateListViewItem($1080p[$i] & "|" & _PathFull($1080p[$i]), $lview)
    Next
    ;_Arraydisplay($1080p)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

    [/autoit]

    Ich habe hier ein kleines Listview erstellt, wo ich mir meine Filme und den Pfad anzeigen lasse.
    Pfad war nur Testweise..

    ich möchte nun, sobald ein doppelklick auf das Item erfolgt, der Pfadgeöffnet wird. via Shellexecute oder whatever ;)

    Ist auch alles nur kein Problem, bloß wie sag ich dem Ding, das es ne Funktion bzw etwas ausführen soll, sobald ich da nen doppelklick drauf mache ;)

    greez

    Kev

    //edit

    bzw. unterm Win7 64bit funktioniert das mitm OnEvent Mode irgendwie nicht....
    Falls das gleichn Vorschlag ist ^^

    Einmal editiert, zuletzt von Kev (12. Juli 2011 um 14:07)

  • jut thx ^^ hab mir da ma was gebastelt aber es hapert nochn bisschen

    Spoiler anzeigen
    [autoit]


    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>
    #include <File.au3>

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

    GUICreate("", 750, 450)
    $lview = GUICtrlCreateListView("Full HD |Pfad", 0, 0, 500, 300, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_TRACKSELECT))
    $1080p = _FileListToArray(@ScriptDir & "\Movies\1080p\", "*", "2")
    $hListView = GUICtrlGetHandle($lview)

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

    _GUICtrlListView_SetColumnWidth($hListView, 0, 180)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)

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

    For $i = 1 To $1080p[0]
    GUICtrlCreateListViewItem($1080p[$i] & "|" & _PathFull($1080p[$i]), $lview)
    $crt = _PathFull($1080p[$i])
    Next

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

    ;_Arraydisplay($1080p)

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

    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom ; Control
    Case $hWndListView ; If Control = ListView
    Switch $iCode ; Event
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    msgbox(0,"",$crt) ;----- WAT PASSIERN SOLL
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

    der soll mir bei

    [autoit]

    msgbox(0,"",$crt) ;----- WAT PASSIERN SOLL

    [/autoit]

    in $crt
    den richtigen pfad ausgeben von dem selektierten listviewitem..
    gibt mir aber nur logischerweise das letzte aus ^^ wegen der for schleife weil der zähler dann am ende ist..
    aber iwie ich raffs einfach nich mehr ^^

  • also ich hab sowas ähnliches in meinem script auch drin, der ermittelt bei mir welche zeile und welche spalte es ist und ich weiß somit welche eintrag im array ich nehmen muss.

    nimm doch noch die _LeftDblClick() funktion mit rein. mit $currentItem[0] und $currentItem[1] habe ich die koordinaten rausgeholt, musst mal rumspielen ob man noch +1 addieren muss oder nicht, habe gerade mein script nicht da.
    bei mir sahs dann so aus:

    [autoit]

    $array[$currentItem[0]+1][$currentItem[1]+1]

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($GUI)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($GUI), $posLV = ControlGetPos($GUI, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($GUI, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

    [/autoit]
  • Also Kev da hätte ich schon mehr erwartet :P
    Einfach ID auslesen und dann den Text verarbeiten

    (musste auf @Systemdir umsteigen, da ich deine Filme nicht habe ^^ )

    Spoiler anzeigen
    [autoit]

    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>
    #include <File.au3>

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

    GUICreate("", 750, 450)
    $lview = GUICtrlCreateListView("Full HD |Pfad", 0, 0, 500, 300, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_TRACKSELECT))
    $1080p = _FileListToArray(@SystemDir, "*.msc")
    $hListView = GUICtrlGetHandle($lview)

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

    _GUICtrlListView_SetColumnWidth($hListView, 0, 180)
    _GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)

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

    For $i = 1 To $1080p[0]
    GUICtrlCreateListViewItem($1080p[$i] & "|" & _PathFull($1080p[$i]), $lview)
    Next

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

    ;_Arraydisplay($1080p)

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

    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    Do
    $msg = GUIGetMsg()
    Until $msg = $GUI_EVENT_CLOSE

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom ; Control
    Case $hWndListView ; If Control = ListView
    Switch $iCode ; Event
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    $id = GUICtrlRead($lview)
    $text = GUICtrlRead($id)
    $path = StringTrimRight(StringTrimLeft($text, StringInStr($text, "|")), 1)
    msgbox(0,"",$path) ;----- WAT PASSIERN SOLL
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]

  • Dat is bei mir einfach zu lang her..

    ID auslesen dann fang mal an ^^ wie? ;D
    zum systemdir ^^ bin hier auch nur auf arbeit un hab ma die ordner struktur nachgebaut ^^

    //edit

    du bistn schatz ^^