Rechtsklick auf Listview

  • Hallo Community!

    Mein Chef hätte gerne ein Programm von mir benutzerfreundlicher.

    Er hätte es nun gerne so:

    Wenn ich in einer ListView auf ein Item rechtsklicke das sich dann ein menü öffnet ( wie beim Explorer halt).


    Bloß hab ich nun keine Ahnung wie ich das antstellen soll.


    Für hilfe von euch wäre ich sehr dankbar!

    Mfg Aiden

    • Offizieller Beitrag

    Hi,

    hier ein Anfang:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiConstants.au3>
    #include <GuiListView.au3>

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

    Global $ListView
    Global Const $WM_NOTIFY = 0x004E
    Global Const $DebugIt = 1

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

    ;ListView Events
    Global Const $NM_FIRST = 0
    Global Const $NM_LAST = (-99)
    Global Const $NM_OUTOFMEMORY = ($NM_FIRST - 1)
    Global Const $NM_CLICK = ($NM_FIRST - 2)
    Global Const $NM_DBLCLK = ($NM_FIRST - 3)
    ;~ Global Const $NM_RETURN = ($NM_FIRST - 4)
    Global Const $NM_RCLICK = ($NM_FIRST - 5)
    ;~ Global Const $NM_RDBLCLK = ($NM_FIRST - 6)
    ;~ Global Const $NM_SETFOCUS = ($NM_FIRST - 7)
    ;~ Global Const $NM_KILLFOCUS = ($NM_FIRST - 8)
    ;~ Global Const $NM_CUSTOMDRAW = ($NM_FIRST - 12)
    ;~ Global Const $NM_HOVER = ($NM_FIRST - 13)
    ;~ Global Const $NM_NCHITTEST = ($NM_FIRST - 14)
    ;~ Global Const $NM_KEYDOWN = ($NM_FIRST - 15)
    ;~ Global Const $NM_RELEASEDCAPTURE = ($NM_FIRST - 16)
    ;~ Global Const $NM_SETCURSOR = ($NM_FIRST - 17)
    ;~ Global Const $NM_CHAR = ($NM_FIRST - 18)
    ;~ Global Const $NM_TOOLTIPSCREATED = ($NM_FIRST - 19)
    #endregion End Global variables

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

    Opt("WinTitleMatchMode", 2)

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

    $main_GUI = GUICreate("GuiRegisterMsg Test", 225, 400, 300, 10, BitOR($WS_THICKFRAME, $WS_SIZEBOX))

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

    $ListView = GUICtrlCreateListView("Entry Name|Category", 5, 75, 195, 280, BitOR($LVS_SORTASCENDING, $LVS_SINGLESEL))
    _GUICtrlListViewSetColumnWidth($ListView, 0, 100)
    _GUICtrlListViewSetColumnWidth($ListView, 1, 100)
    GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlCreateListViewItem("Name 1|Category 1", $ListView)
    GUICtrlCreateListViewItem("Name 2|Category 2", $ListView)
    GUISetState()

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

    ;Register WM_NOTIFY events
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    ;-----------------------------------------------------------------------------------------
    ;This case statement exits and updates code if needed
    Case $GUI_EVENT_CLOSE
    Exit
    Case Else
    ;;;
    EndSwitch
    WEnd

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

    ; WM_NOTIFY event handler
    Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    Case $wParam = $ListView
    Select
    Case $event = $NM_CLICK
    ConsoleWrite("Single LinksClick" & @LF)
    Case $event = $NM_DBLCLK
    MsgBox(0, "Double Clicked", _GUICtrlListViewGetItemText($ListView, _GUICtrlListViewGetSelectedIndices($ListView)))
    Case $event = $NM_RCLICK
    MsgBox(0, "Rechts Clicked", _GUICtrlListViewGetItemText($ListView, _GUICtrlListViewGetSelectedIndices($ListView)))
    EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>WM_Notify_Events

    [/autoit]

    So long,

    Mega

    • Offizieller Beitrag

    Alternativ kannst du auch mit Kontextmenü arbeiten.
    Hier mal ein Beispiel zum Editieren und Löschen (auch von einzelnen Werten) in einem ListView.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #Include <GuiList.au3>
    Dim $arItem[8], $arChange

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

    $Form1 = GUICreate("AForm1", 633, 265, -1, -1)
    $ListView1 = GUICtrlCreateListView("1|2|3|4|5|6|7|8|9|10|11|12|13|14", 16, 16, 601, 225)
    GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    For $i = 0 To 7
    $arItem[$i] = GUICtrlCreateListViewItem("",$ListView1)
    For $k = 0 To 13
    _GUICtrlListViewSetItemText($ListView1, $i, $k, "Zeile"&$i+1 & "/Spalte"&$k+1)
    _GUICtrlListViewSetColumnWidth($ListView1, $k, 86)
    Next
    Next
    $lvContext = GUICtrlCreateContextMenu($ListView1)
    $conEdit = GUICtrlCreateMenuitem("Edit", $lvContext)
    $conDelAll = GUICtrlCreateMenuItem("Lösche kpl. Eintrag", $lvContext)
    ; GUI für Edit
    $Form2 = GUICreate("AForm2", 328, 432, -1, -1, BitOR($WS_POPUP, $WS_BORDER))
    $List1 = GUICtrlCreateList("", 20, 20, 285, 370, BitOR($WS_HSCROLL,$WS_BORDER))
    $btnOK = GUICtrlCreateButton("OK", 196, 400, 109, 21, 0)
    $lContext = GUICtrlCreateContextMenu($List1)
    $conEdit_l = GUICtrlCreateMenuitem("Editieren", $lContext)
    $conDel_l = GUICtrlCreateMenuitem("Löschen", $lContext)

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

    GUISetState(@SW_SHOW, $Form1)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $conDelAll
    _GUICtrlListViewDeleteItem($ListView1, _GUICtrlListViewGetSelectedIndices($ListView1))
    Case $conEdit
    $lvIndex = _GUICtrlListViewGetSelectedIndices($ListView1)
    $arChange = _GUICtrlListViewGetItemTextArray($ListView1, $lvIndex)
    For $i = 1 To $arChange[0]
    _GUICtrlListAddItem($List1, $arChange[$i])
    Next
    GUISetState(@SW_SHOW, $Form2)
    Case $btnOK
    For $i = 0 To _GUICtrlListCount($List1) -1
    _GUICtrlListViewSetItemText($ListView1, $lvIndex, $i, _GUICtrlListGetText($List1, $i))
    Next
    GUISetState(@SW_HIDE, $Form2)
    Case $conEdit_l
    $lIndex = _GUICtrlListGetCaretIndex($List1)
    $var = InputBox("Eintrag ändern", "", _GUICtrlListGetText($List1, $lIndex))
    _GUICtrlListReplaceString($List1, $lIndex, $var)
    Case $conDel_l ; nicht wirklich löschen, sonst wär eine Spalte zu wenig
    $lIndex = _GUICtrlListGetCaretIndex($List1)
    _GUICtrlListReplaceString($List1, $lIndex, "")
    EndSwitch
    WEnd

    [/autoit]
  • Hi,

    das Script von BugFix ist zwar sehr schön für die Einarbeitung, hat aber leider auch 2 andere graviende Fehler:

    1. Wenn ich eine Zeile zum Editieren geöffnet habe und mir danach eine 2. Zeile zum Editieren öffne, dann stimmen die Anzahl der Einträge nicht mehr (die Zellen von 1 bis 14 werden doppelt aufgelistet).

    2. Wenn ich beim Editieren einer Zeile eine Zelle (z.B. Zeile 5/ Spalte 1) gelöscht habe, dann werden bei allen nachfolgenden Zeilen, die zum Editieren geöffnet werden, die Zelle (Zeile x /Spalte 1) nach dem Schließen des Editfensters autmoatisch gelöscht.


    Edit: ich habe 3 kleine Änderungen vorgenommen, ich hoffe, es ist so in Ordnung (siehe "; Edit Milko").

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #Include <GuiList.au3>
    Dim $arItem[8], $arChange

    $Form1 = GUICreate("AForm1", 633, 265, -1, -1)
    $ListView1 = GUICtrlCreateListView("1|2|3|4|5|6|7|8|9|10|11|12|13|14", 16, 16, 601, 225)
    GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    For $i = 0 To 7
    $arItem[$i] = GUICtrlCreateListViewItem("",$ListView1)
    For $k = 0 To 13
    _GUICtrlListViewSetItemText($ListView1, $i, $k, "Zeile"&$i+1 & "/Spalte"&$k+1)
    _GUICtrlListViewSetColumnWidth($ListView1, $k, 86)
    Next
    Next
    $lvContext = GUICtrlCreateContextMenu($ListView1)
    $conEdit = GUICtrlCreateMenuitem("Edit", $lvContext)
    $conDelAll = GUICtrlCreateMenuItem("Lösche kpl. Eintrag", $lvContext)
    ; GUI für Edit
    $Form2 = GUICreate("AForm2", 328, 432, -1, -1, BitOR($WS_POPUP, $WS_BORDER))
    $List1 = GUICtrlCreateList("", 20, 20, 285, 370, BitOR($WS_HSCROLL,$WS_BORDER))
    $btnOK = GUICtrlCreateButton("OK", 196, 400, 109, 21, 0)
    $lContext = GUICtrlCreateContextMenu($List1)
    $conEdit_l = GUICtrlCreateMenuitem("Editieren", $lContext)
    $conDel_l = GUICtrlCreateMenuitem("Löschen", $lContext)

    GUISetState(@SW_SHOW, $Form1)

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $conDelAll
    _GUICtrlListViewDeleteItem($ListView1, _GUICtrlListViewGetSelectedIndices($ListView1))
    Case $conEdit
    _GUICtrlListClear($List1) ; Edit Milko
    $lvIndex = _GUICtrlListViewGetSelectedIndices($ListView1)
    $arChange = _GUICtrlListViewGetItemTextArray($ListView1, $lvIndex)
    if IsArray($arChange) Then ; Edit Milko
    For $i = 1 To $arChange[0]
    _GUICtrlListAddItem($List1, $arChange[$i])
    Next
    GUISetState(@SW_SHOW, $Form2)
    endif
    Case $btnOK
    For $i = 0 To _GUICtrlListCount($List1) -1
    _GUICtrlListViewSetItemText($ListView1, $lvIndex, $i, _GUICtrlListGetText($List1, $i))
    Next
    GUISetState(@SW_HIDE, $Form2)
    Case $conEdit_l
    $lIndex = _GUICtrlListGetCaretIndex($List1)
    $var = InputBox("Eintrag ändern", "", _GUICtrlListGetText($List1, $lIndex))
    if not @error then _GUICtrlListReplaceString($List1, $lIndex, $var) ; Edit Milko
    Case $conDel_l ; nicht wirklich löschen, sonst wär eine Spalte zu wenig
    $lIndex = _GUICtrlListGetCaretIndex($List1)
    _GUICtrlListReplaceString($List1, $lIndex, "")
    EndSwitch
    WEnd

    [/autoit]

    Viele Grüße, Milko

    Einmal editiert, zuletzt von milko (25. Februar 2007 um 12:29)