ListView Item - Rechtsklick Menü öffnen

  • Guten Abend allerseits,

    ich habe folgendes Problem.
    Undzwar möchte ich gerne ein kleines Script erstellen welches mir hilft einen Überblick über meine Wochenberichte (Ausbildung) zu behalten und sie zu bearbeiten, neue hinzuzufügen.
    Jetzt habe ich die Dateien(Exel dateien), die sich in dem Ordner Befinden bereits mit Erstelldatum und Größe (zur übersicht) in ein ListView geladen.

    Nun das Problem!!
    Wie kann ich z.b. ein Menü erstellen mit z.b. Bearbeiten, löschen ... wenn ich mit der rechten Maustaste ein ListView Item anklicke ?
    Wie kann ich zudem z.b. ShellExecute / Run bei einem Doppelklick aufrufen ?


    Hier erst einmal mein Quellcode ( Vorsicht Anfänger )

    Spoiler anzeigen
    [autoit]

    ;[includes]
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    ;~ Opt('MustDeclareVars', 1)

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

    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Dim $lol[1], $list[1], $Size[1], $Date[1]

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

    $search = FileFindFirstFile($Finished & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd

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

    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next

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

    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next

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

    ; Close the search handle
    FileClose($search)

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

    _Gui()

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

    Func _Gui()
    Local $hGui, $listview, $item1, $item2, $item3, $nMsg

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

    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt

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

    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next

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

    GUISetState() ; Gui anzeigen

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

    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    EndSwitch
    WEnd
    EndFunc ;==>_Gui

    [/autoit]

    Vielen Dank

    mfg SiLenCa

  • Dies ist gar nicht schwer.
    Schau dir vor allem den letzten Teil des Skripts an

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    ;~ Opt('MustDeclareVars', 1)

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

    ;Rechtsklick auf das listview
    GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

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

    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Dim $lol[1], $list[1], $Size[1], $Date[1]
    Dim $listview

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

    $search = FileFindFirstFile($Finished & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd

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

    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next

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

    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next

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

    ; Close the search handle
    FileClose($search)

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

    _Gui()

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

    Func _Gui()
    Local $hGui, $item1, $item2, $item3, $nMsg

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

    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt

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

    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next

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

    GUISetState() ; Gui anzeigen

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

    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    EndSwitch
    WEnd
    EndFunc ;==>_Gui

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

    ;********************************************
    ; Rechtsklick auf das listview *
    ;********************************************

    [/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)
    If @error Then Return
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    Case $wParam = $listview
    Select
    Case $event = $NM_RCLICK
    $contextmenu = GUICtrlCreateContextMenu($listview)
    $button = GUICtrlCreateButton("OK", 100, 100, 70, 20)
    $buttoncontext = GUICtrlCreateContextMenu($button)
    $buttonitem = GUICtrlCreateMenuItem("Über Button", $buttoncontext)

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

    $newsubmenu = GUICtrlCreateMenu("Neu", $contextmenu)
    $textitem = GUICtrlCreateMenuItem("Text", $newsubmenu)

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

    $fileitem = GUICtrlCreateMenuItem("Öffnen", $contextmenu)
    $saveitem = GUICtrlCreateMenuItem("Speichern", $contextmenu)
    GUICtrlCreateMenuItem("", $contextmenu) ; Trennstrich

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

    $infoitem = GUICtrlCreateMenuItem("Info", $contextmenu)
    Case $event = $NM_DBLCLK
    Consolewrite( "Doppelklick" & @crlf)
    EndSelect
    EndSelect
    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    EndFunc ;==>WM_Notify_Events

    [/autoit]
    • Offizieller Beitrag

    Hier wäre mein Vorschlag, ist ein wenig Spät, aber ich hatte zu langes Telefonat.

    Spoiler anzeigen
    [autoit]

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

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

    ;~ Opt('MustDeclareVars', 1)

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

    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Global $hGui, $listview, $item1, $item2, $item3, $nMsg
    Dim $lol[1], $list[1], $Size[1], $Date[1]

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

    $search = FileFindFirstFile($Finished & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd

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

    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next

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

    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next

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

    ; Close the search handle
    FileClose($search)

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

    _Gui()

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

    Func _Gui()
    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt

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

    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next
    Local $contextmenu = GUICtrlCreateContextMenu($listview)
    Local $item1 = GUICtrlCreateMenuItem("Bearbeiten", $contextmenu)
    Local $item2 = GUICtrlCreateMenuItem("Löschen", $contextmenu)

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

    GUISetState() ; Gui anzeigen
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    Case $item1
    MsgBox(0, "Test", "Bearbeiten")
    Case $item2
    MsgBox(0, "Test", "Löschen")
    EndSwitch
    WEnd
    EndFunc ;==>_Gui
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $Tmp
    $hWndListView = $listview
    If Not IsHWnd($listview) Then $hWndListView = GUICtrlGetHandle($listview)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    $Tmp = _GuiCtrlListView_GetFirstSelected($listview)
    ShellExecute($Finished & _GUICtrlListView_GetItemText($listview, $Tmp, 0))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _GuiCtrlListView_GetFirstSelected($hWnd)
    Global $SelectedItemi
    $SelectedItemi = _GUICtrlListView_GetSelectedIndices($hWnd, True)
    If $SelectedItemi[0] = 0 Then Return SetError(1)
    Return $SelectedItemi[1]
    EndFunc ;==>_GuiCtrlListView_GetFirstSelected

    [/autoit]

    Beim ShellExecute bin ich mir aber nicht ganz Sicher, da ich den Inhalt der INI Datei nicht kenne.

  • Erst einmal ein großes danke an alle.

    Raupi , mit dem rechtsklick ist schonmal schön ;) Der Doppelklick (ShellExecute) funktioniert noch nicht ganz (habe auch noch nicht genauer nach dem Problem geschaut weil ich nicht viel Zeit habe)

    aber kann dir den Ini Inhalt erstmal Posten

    Spoiler anzeigen

    [Path]
    Folder=D:\Schule
    Finished=D:\Schule\Fertige Berichte
    Sample=D:\Schule\Vorlagen\Vordruck Berichtsheft Azubis.xls

    Edit: Hmm, selbst wenn ich statt ShellExecute eine msgbox setze, passiert rein garnichts - verwundert mich ein wenig.

    Könntest du mir vielleicht noch die beiden Func's erklären / sie ein wenig kommentieren ? Ich hatte sowas schonmal probiert, jedoch kapiere ich dort rein garnix ;) Danke schonmal im Voraus

    mfg SiLenCa

    Einmal editiert, zuletzt von SiLenCa (7. Oktober 2009 um 22:24)

  • Doch der Doppelklick funktioniert (Zeile 91 ist dafür unnötig).
    Sowas hatten wir aber doch schonmal:

    Spoiler anzeigen
    [autoit]


    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    ConsoleWrite("WM_Notify" & @CRLF)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $Tmp
    $hWndListView = $listview
    If Not IsHWnd($listview) Then $hWndListView = GUICtrlGetHandle($listview)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    $Tmp = _GuiCtrlListView_GetFirstSelected($listview)
    ConsoleWrite("Double-click" & @CRLF)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]


    Tausche mal die WM_Notify um zu testen ob überhaupt was ankommt.

    • Offizieller Beitrag

    Zeile 91 kann man löschen, hab ich unnütz mitkopiert. :pinch:

    Nach dem Inhalt der Ini müßte dann Zeile 93 so funktionieren:

    [autoit]

    ShellExecute($Finished & "\" & _GUICtrlListView_GetItemText($listview, $Tmp, 0))

    [/autoit]

    Und hier mal das abgeänderte Script:

    Spoiler anzeigen
    [autoit]

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

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

    ;~ Opt('MustDeclareVars', 1)

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

    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Global $hGui, $listview, $item1, $item2, $item3, $nMsg
    Dim $lol[1], $list[1], $Size[1], $Date[1]

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

    $search = FileFindFirstFile($Finished & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd

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

    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next

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

    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next

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

    ; Close the search handle
    FileClose($search)

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

    _Gui()

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

    Func _Gui()
    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt

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

    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next
    Local $contextmenu = GUICtrlCreateContextMenu($listview)
    Local $item1 = GUICtrlCreateMenuItem("Bearbeiten", $contextmenu)
    Local $item2 = GUICtrlCreateMenuItem("Löschen", $contextmenu)

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

    GUISetState() ; Gui anzeigen
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    Case $item1
    MsgBox(0, "Test", "Bearbeiten")
    Case $item2
    MsgBox(0, "Test", "Löschen")
    EndSwitch
    WEnd
    EndFunc ;==>_Gui
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $Tmp
    $hWndListView = $listview
    If Not IsHWnd($listview) Then $hWndListView = GUICtrlGetHandle($listview)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    $Tmp = _GuiCtrlListView_GetFirstSelected($listview);hier wird die Indexnummer des selektierten Listviewitems ermittelt.
    ShellExecute($Finished & "\" & _GUICtrlListView_GetItemText($listview, $Tmp, 0)); Dateipfad + \ + Name der Datei
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _GuiCtrlListView_GetFirstSelected($hWnd) ;ermittelt den Index des selektierten ListviewItems
    Local $SelectedItemi
    $SelectedItemi = _GUICtrlListView_GetSelectedIndices($hWnd, True)
    If $SelectedItemi[0] = 0 Then Return SetError(1)
    Return $SelectedItemi[1]
    EndFunc ;==>_GuiCtrlListView_GetFirstSelected

    [/autoit]

    Habe es getestet und bei mir funktioniert es.

  • Erstmal großes Dankeschön,
    leider funktioniert es trotzdem noch nicht. Ich habe es auch mit einer MsgBox anstatt des ShellExecute's probiert, ohne erfolg. Hier der Quellcode den ich verwendet habe.

    Spoiler anzeigen
    [autoit]

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

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

    ;~ Opt('MustDeclareVars', 1)

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

    Global $Finished = IniRead("Settings.ini", "Path", "Finished", ""), $count = 1
    Global $hGui, $listview, $item1, $item2, $item3, $nMsg
    Dim $lol[1], $list[1], $Size[1], $Date[1]

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

    $search = FileFindFirstFile($Finished & "\*.*")

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

    ; Check if the search was successful
    If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
    EndIf

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

    ; Dateien im Verzeichnis $Finished finden und arrays bei jeder gefundenen Datei ReDim'en
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    ReDim $lol[$count + 1], $list[$count + 1], $Size[$count + 1], $Date[$count + 1]
    $lol[$count] = $file
    $count += 1
    WEnd

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

    ; Dateigröße der gefunden Dateien ermitteln
    For $i = 1 To UBound($lol) - 1
    $Size[$i] = FileGetSize($Finished & "\" & $lol[$i])
    Next

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

    ;Erstelldatum ermitteln und in DD.MM.YYYY umwandeln
    For $i = 1 To UBound($lol) - 1
    $Date[$i] = FileGetTime($Finished & "\" & $lol[$i], 1, 1)
    $new = StringTrimRight($Date[$i], 6)
    $Date[$i] = StringRight($new, 2) & "." & StringTrimLeft(StringLeft($new, 6), 4) & "." & StringTrimRight($new, 4)
    Next

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

    ; Close the search handle
    FileClose($search)

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

    _Gui()

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

    Func _Gui()
    $hGui = GUICreate("listview items", 500, 500, -1, $WS_EX_ACCEPTFILES) ; Erstellt die MainGui
    GUISetBkColor(0x00E0FFFF) ; will change background color

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

    $listview = GUICtrlCreateListView(" Dateiname | Erstelldatum | Größe ", 10, 10, 400, 400) ; Hier wird das ListView erstellt

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

    ; Name, Datum, und Größe in das ListView eintragen
    For $i = 1 To UBound($list) - 1
    $list[$i] = GUICtrlCreateListViewItem($lol[$i] & "|" & $Date[$i] & "|" & $Size[$i] & " kb", $listview)
    Next
    Local $contextmenu = GUICtrlCreateContextMenu($listview)
    Local $item1 = GUICtrlCreateMenuItem("Bearbeiten", $contextmenu)
    Local $item2 = GUICtrlCreateMenuItem("Löschen", $contextmenu)

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

    GUISetState() ; Gui anzeigen
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    ;Endlosschleife um die Gui aufrecht zu halten
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $listview
    MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
    Case $item1
    MsgBox(0, "Test", "Bearbeiten")
    Case $item2
    MsgBox(0, "Test", "Löschen")
    EndSwitch
    WEnd
    EndFunc ;==>_Gui
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $Tmp
    $hWndListView = $listview
    If Not IsHWnd($listview) Then $hWndListView = GUICtrlGetHandle($listview)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    $Tmp = _GuiCtrlListView_GetFirstSelected($listview);hier wird die Indexnummer des selektierten Listviewitems ermittelt.
    MsgBox(0,"","bla")
    ;~ ShellExecute($Finished & "\" & _GUICtrlListView_GetItemText($listview, $Tmp, 0)); Dateipfad + \ + Name der Datei
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _GuiCtrlListView_GetFirstSelected($hWnd) ;ermittelt den Index des selektierten ListviewItems
    Local $SelectedItemi
    $SelectedItemi = _GUICtrlListView_GetSelectedIndices($hWnd, True)
    If $SelectedItemi[0] = 0 Then Return SetError(1)
    Return $SelectedItemi[1]
    EndFunc ;==>_GuiCtrlListView_GetFirstSelected

    [/autoit]

    Ich verwende zurzeit Windows 7 Ultimate (Englisch), kann es sein das es dort unterschiede zu windows XP gibt ?

    • Offizieller Beitrag

    Das Script läuft auch auf Windows7 Ultimate. Egal ob kompiliert oder nicht. Getestet unter Windows 7 Ultimate 32/64 AutoitVersionen 3.3.0.0 und 3.3.1.1.

  • Wie kann man es eigentlich anstellen, dass nur ein Menü aufgeht, wenn man wirklich auf einen Eintrag klickt?

    So kommt das Menü ja auch beim Klick ins Listview selbst?

    kara2010