Kniffliche Frage zu ListView

    • Offizieller Beitrag

    Servus.

    Ich hab da ein kleines Problem .

    Es git in der UDF den Befehl _GUICtrlListView_SortItems damit kann man ein Listview sortiern. Soweit so gut , aber bei jedem Aufruf ändert es die Reihenfolge von aufsteigend in absteigend und Umgekehrt.
    1. Kennt einer eine Möglichkeit wie man die Sortierreihenfolge eines Listviews abfragt?
    2. Hat jemand eventuell eine Lösung um die Sortierreihenfolge vorher festzulegen ?

    Ich weiß, jetzt wird noch Code gefragt, hab ich aber nicht .

    Hat jemand einen Tipp für mich ?

    • Offizieller Beitrag

    @ChaosKeks weißt du ob man die $LVS_SORTASCENDING bzw. $LVS_SORTDESCENDING in WM_Notify direkt verwenden kann ?

    Oscar gute Idee, wenn ich aber das Listview schon geupdatet habe , dann kann der letzet Eintrag vor dem Ersten in der Sortierung kommen . Somit ist das Ergebnis des Vergleichs nicht sicher. Zumal weiterhin das Problem mir dem Sortieren besteht .

    Naja, werd dann mal die ListView UDF auseinandernehmen. Vielleicht bring das was .

  • Ich hab da was schönes gefunden:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <WindowsConstants.au3>

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

    Global $iColumn, $sSortDirection

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

    $Gui = GUICreate("Test", 300, 200)
    $hListView = GUICtrlCreateListView("Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER ))

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

    $sItems ="Item9,44|Item2,22|Item1,11|Item2,33|Item3,|Item1,|Item2,|Item3,|Item1,"
    $aFile = StringSplit($sItems, "|")

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

    $iSize = $aFile[0]
    Dim $result[$iSize][2]

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

    For $x = 1 To $iSize
    $aCol = StringSplit($aFile[$x], ",")
    $iIndex = _GUICtrlListView_AddItem($hListView, $aCol[1], -1, $x);_GUICtrlListView_GetItemCount($hListView))
    For $y = 2 To $aCol[0]
    _GUICtrlListView_AddSubItem($hListView, $iIndex, $aCol[$y], $y - 1)
    Next
    Next
    GUISetState()

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

    _GUICtrlListView_RegisterSortCallBack($hListView)
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hListView
    ; use modified sort callback
    __GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
    ConsoleWrite("Column: " & $iColumn & " Sort: " & $sSortDirection & @LF)
    EndSwitch
    WEnd
    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    GUIDelete()

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

    ; modified sort call back from include GuiListView.au3
    Func __GUICtrlListView_SortItems($hWnd, $iCol)
    Local $iResult, $iIndex, $pFunction, $hHeader, $iFormat

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

    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)

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

    For $x = 1 To $aListViewSortInfo[0][0]
    If $hWnd = $aListViewSortInfo[$x][1] Then
    $iIndex = $x
    ExitLoop
    EndIf
    Next

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

    $pFunction = DllCallbackGetPtr($aListViewSortInfo[$iIndex][2]) ; get pointer to call back
    $aListViewSortInfo[$iIndex][3] = $iCol ; $nColumn = column clicked
    $aListViewSortInfo[$iIndex][7] = 0 ; $bSet
    $aListViewSortInfo[$iIndex][4] = $aListViewSortInfo[$iIndex][6] ; nCurCol = $nCol
    $iResult = _SendMessage($hWnd, $LVM_SORTITEMS, $hWnd, $pFunction, 0, "hwnd", "ptr")
    If $iResult <> 0 Then
    If $aListViewSortInfo[$iIndex][9] Then ; Use arrow in header
    $hHeader = $aListViewSortInfo[$iIndex][10]
    For $x = 0 To _GUICtrlHeader_GetItemCount($hHeader) - 1
    $iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $x)
    If BitAND($iFormat, $HDF_SORTDOWN) Then
    _GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTDOWN))
    ElseIf BitAND($iFormat, $HDF_SORTUP) Then
    _GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTUP))
    EndIf
    Next
    $iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $iCol)
    If $aListViewSortInfo[$iIndex][5] = 1 Then ; ascending
    _GUICtrlHeader_SetItemFormat($hHeader, $iCol, BitOR($iFormat, $HDF_SORTUP))
    $iColumn = $iCol
    $sSortDirection = "Ascending"
    Else ; descending
    _GUICtrlHeader_SetItemFormat($hHeader, $iCol, BitOR($iFormat, $HDF_SORTDOWN))
    $iColumn = $iCol
    $sSortDirection = "Descending"
    EndIf
    EndIf
    EndIf

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

    Return $iResult <> 0

    EndFunc ;==>_GUICtrlListView_SortItems

    [/autoit]
    • Offizieller Beitrag

    Thx ChaosKeks, das hatte ich auch schon im Englischen Forum gefunden. Jetzt kann ich schon mal abfragen wie sortiert wird.

    Hm, und nun gehen mir die Ideen aus, ich bekomm es einfach nicht hin , da Listview zu sortieren. Naja vielleicht weiß noch jemand was. Ich lasse den Thread mal offen .

    • Offizieller Beitrag

    Na, ein gründliches Lesen der Hilfe zu diesem Befehl hätte dich schon erlöst. :D

    _GUICtrlListView_SimpleSort($hWnd, ByRef $vDescending, $iCol)
    Can be:
    True - Sort Descending
    False - Sort Ascending
    Array - With the following format:
    [0] - First Column
    [1] - Second Column
    [n] - Last Column

    ;)

    • Offizieller Beitrag

    BugFix . Die Funktion hab ich schon ausprobiet. Funzt einwandrei. Hat aber den gravierenden Nachteil, das die Icons im ListView nicht richtig gesetzt werden. Die Icons werden leider nicht mitsortiert .Und das sieht bei einem Taskmanager bescheuert aus .

    • Offizieller Beitrag

    Hier ist der verantwortliche Teil :

    Spoiler anzeigen
    [autoit]

    Func _NeueAnwendung($Title)
    Local $FensterListe, $PID, $Prozessname, $WinHandle, $AndwendungsPfad, $IconAnzahl, $ImageIcon
    $PID = WinGetProcess($Title)
    $Prozessname = _ProcessGetName($PID)
    $WinHandle = WinGetHandle($Title)
    $AndwendungsPfad = _GetPathByPID($PID)
    If $Prozessname = @ScriptName Then
    Else
    $IconAnzahl = _GetIconCount($AndwendungsPfad)
    If $AndwendungsPfad <> @WindowsDir & "\Explorer.exe" Then
    If $IconAnzahl <> 0 Then
    $ImageIcon = _GUIImageList_AddIcon($hImage, $AndwendungsPfad)
    If @error Then $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 4)
    Else
    $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 2)
    EndIf
    Else
    $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 4)
    EndIf
    _GUICtrlListView_SetImageList($ListViewAnwendungen, $hImage, 1)
    _GUICtrlListView_AddItem($ListViewAnwendungen, $Title, _GUIImageList_GetImageCount($hImage) - 1, _GUICtrlListView_GetItemCount($ListViewAnwendungen) + 999)
    _GUICtrlListView_AddSubItem($ListViewAnwendungen, _GUICtrlListView_GetItemCount($ListViewAnwendungen) - 1, $Prozessname, 1)
    _GUICtrlListView_AddSubItem($ListViewAnwendungen, _GUICtrlListView_GetItemCount($ListViewAnwendungen) - 1, $AndwendungsPfad, 2)
    _GUICtrlListView_AddSubItem($ListViewAnwendungen, _GUICtrlListView_GetItemCount($ListViewAnwendungen) - 1, $PID, 3)
    _GUICtrlListView_AddSubItem($ListViewAnwendungen, _GUICtrlListView_GetItemCount($ListViewAnwendungen) - 1, $WinHandle, 4)
    EndIf
    EndFunc ;==>_NeueAnwendung

    [/autoit]


    Edit hat sich Erledigt. Habe mir einfach eine Sortierroutine für die Icons geschrieben . Danke trotzdem .

    Achso so sieht meine Lösung aus :

    Spoiler anzeigen
    [autoit]

    Func _SortAnwendungenListe($hWnd, $iCol)
    Local $iIndex, $hHeader, $iFormat, $Pfad, $IconAnzahl, $ImageIcon
    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
    For $x = 1 To $aListViewSortInfo[0][0]
    If $hWnd = $aListViewSortInfo[$x][1] Then
    $iIndex = $x
    ExitLoop
    EndIf
    Next
    $hHeader = $aListViewSortInfo[$iIndex][10]
    Local $B_DESCENDING[_GUICtrlHeader_GetItemCount($hHeader)]
    For $x = 0 To _GUICtrlHeader_GetItemCount($hHeader) - 1
    $iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $x)
    If BitAND($iFormat, $HDF_SORTDOWN) Then
    $B_DESCENDING[$x] = True
    ElseIf BitAND($iFormat, $HDF_SORTUP) Then
    $B_DESCENDING[$x] = False
    EndIf
    Next
    _GUICtrlListView_SimpleSort($ListViewAnwendungen, $B_DESCENDING, $iCol)
    For $i = 0 To _GUICtrlListView_GetItemCount($ListViewAnwendungen) - 1
    $Pfad = _GUICtrlListView_GetItemText($ListViewAnwendungen, $i, 2)
    $IconAnzahl = _GetIconCount($Pfad)
    If $Pfad <> @WindowsDir & "\Explorer.exe" Then
    If $IconAnzahl <> 0 Then
    $ImageIcon = _GUIImageList_AddIcon($hImage, $Pfad)
    If @error Then $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 4)
    Else
    $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 2)
    EndIf
    Else
    $ImageIcon = _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 4)
    EndIf
    _GUICtrlListView_SetImageList($ListViewAnwendungen, $hImage, 1)
    _GUICtrlListView_SetItemImage($ListViewAnwendungen, $i, _GUIImageList_GetImageCount($hImage) - 1)
    Next
    EndFunc ;==>_SortAnwendungenListe

    [/autoit]