ListView sortieren, und danach ausgewählte Elemente löschen

  • Ich habe eine ListView, zu der ich Elemente hinzufügen kann. Diese ListView sortiert diese dann automatisch. Mein Problem ist nur, wenn ich Elemente löschen möchte, die ich mit der Maus ausgewählt habe, löscht das Programm irgendwelche anderen. (Ist ja auch klar, denn:)

    Spoiler anzeigen


    ListView unsortiert:
    Freq Setting [ID]
    100 1 0
    300 3 1
    200 2 2

    ListView sortiert:
    Freq Setting [ID]
    300 3 1
    200 2 2
    100 1 0


    Somit sind alle Elemente gewissermaßen durcheinander. Wie lösche ich also die ausgewählten Werte?
    Mein wichtiger Script-Teil:

    Spoiler anzeigen
    [autoit]


    Case $hGUIEQContextAdd
    $Freq = InputBox("Frequency", "Please enter a frequency ['125' e.t.c]: ")
    $Setting = InputBox("Setting", "Please enter a setting ['+2' / '-2' e.t.c]: ")
    _ArrayAdd($hGUIEQListItem, GUICtrlCreateListViewItem($Freq &"|"& $Setting, $hGUIEQ))
    $IsTrue = True
    _GUICtrlListView_SimpleSort($hGUIEQ, $IsTrue, 0)
    Case $hGUIEQContextDelete
    GUICtrlDelete($hGUIEQListItem[ControlListView($hGUI, "", $hGUIEQ, "GetSelected")])
    _ArrayDelete($hGUIEQListItem, ControlListView($hGUI, "", $hGUIEQ, "GetSelected"))
    $IsTrue = True
    _GUICtrlListView_SimpleSort($hGUIEQ, $IsTrue, 0)

    [/autoit]
    Spoiler anzeigen

    Überraschung!


    MfG Donkey

    • Offizieller Beitrag

    Poste mal eine Script, mit dem man testen kann.
    Problemlösung mit Codeschnipsel ist suboptimal.

  • Hier mein gesamtes Script:

    Spoiler anzeigen
    [autoit]

    #Region Setup
    ;Includes
    #include <Bass.au3>
    #include <BassConstants.au3>
    #include <BassEQ.au3>
    #include <GUIConstants.au3>
    #include <ID3.au3>
    #include <GUIListView.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <Sound.au3>
    ;Vars e.t.c
    Start()
    $sFolder = FileSelectFolder("Please select the music folder", "")
    $file = ""
    $IsPlaying = -1
    $MusicHandle = ""
    $fileindex = -1
    Dim $hGUIEQListItem[0]
    $Length = 1
    ;GUI
    $hGUI = GUICreate("DemonPlay", 600, 475, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
    $hGUIList = GUICtrlCreateListView("Filename|Title|Artist|Album|Length",0,0, 480, 400, -1, BitOR($LVS_EX_INFOTIP, $LVS_EX_FULLROWSELECT))
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIListContext = GUICtrlCreateContextMenu($hGUIList)
    $hGUIListContextPlay = GUICtrlCreateMenuItem("Play", $hGUIListContext)
    $hGUIEQ = GUICtrlCreateListView("Freq|+ // -",500,0, 100, 375)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIEQContext = GUICtrlCreateContextMenu($hGUIEQ)
    $hGUIEQContextAdd = GUICtrlCreateMenuItem("Add Setting", $hGUIEQContext)
    $hGUIEQContextDelete = GUICtrlCreateMenuItem("Delete Setting", $hGUIEQContext)
    $hGUIEQBtn = GUICtrlCreateButton("Off", 500, 375, 100, 25)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIPlayPause = GUICtrlCreateButton(ChrW(9658), 275, 400, 50, 30) ;Pause = II
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIBackwards = GUICtrlCreateButton("<<", 225, 400, 50, 25)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIForwards = GUICtrlCreateButton(">>", 325, 400, 50, 25)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIPosition = GUICtrlCreateSlider(100, 450, 500, 25)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    $hGUIPositionL = GUICtrlCreateLabel("0.00 / 0.00", 0, 450, 100, 25)
    GUICtrlSetResizing(-1, 1)
    GUICtrlSetFont(-1, 12)
    _GUICtrlListView_SetColumnWidth($hGUIEQ, 0, 50)
    _GUICtrlListView_SetColumnWidth($hGUIEQ, 1, 50)
    $aFiles = _FileListToArray($sFolder)
    Dim $aDelete[0]
    for $i = 0 to UBound($aFiles)-1 step +1
    If Not(StringInStr($aFiles[$i], ".mp3") <> 0 or StringInStr($aFiles[$i], ".wav") <> 0 or StringInStr($aFiles[$i], ".wma") <> 0 or StringInStr($aFiles[$i], ".m4a") <> 0 or StringInStr($aFiles[$i], ".aac") <> 0 or StringInStr($aFiles[$i], ".ogg") <> 0) Then
    _ArrayAdd($aDelete, $aFiles[$i])
    EndIf
    Next
    for $i = 0 to UBound($aDelete) -1 step +1
    _ArrayDelete($aFiles, _ArraySearch($aFiles, $aDelete[$i]))
    Next
    Dim $hGUIListItem[UBound($aFiles)]
    for $i = 0 to UBound($aFiles) -1 step +1
    _ID3ReadTag($sFolder &"\"& $aFiles[$i])
    $sText = $aFiles[$i] &"|"& _ID3GetTagField("Title") &"|"& _ID3GetTagField("Artist") &"|"& _ID3GetTagField("Album") &"|"& _SoundLength(_SoundOpen($sFolder &"\"& $aFiles[$i]))
    $hGUIListItem[$i] = GUICtrlCreateListViewItem($sText, $hGUIList)
    Next
    GUISetState()
    #EndRegion
    $Times = 0
    #Region Loop
    While 1
    $Time = _BASS_ChannelBytes2Seconds($MusicHandle, _BASS_ChannelGetPosition($MusicHandle, $BASS_POS_BYTE))
    If Round($Time) <> $Times Then
    $Times = Round($Time)
    GUICtrlSetData($hGUIPosition, $Time)
    GUICtrlSetData($hGUIPositionL, Round($Time) & " / "&Round($Length))
    EndIf
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Stop()
    Case $hGUIListContextPlay
    $fileindex = ControlListView($hGUI, "", $hGUIList, "GetSelected")
    $file = ControlListView($hGUI, "", $hGUIList, "GetText", $fileindex)
    $file = $sFolder&"\"&$file
    Play($file)
    Case $hGUIPlayPause
    If $IsPlaying = 0 Then
    _BASS_ChannelPlay($MusicHandle, 0)
    $IsPlaying = 1
    GUICtrlSetData($hGUIPlayPause, "II")
    ElseIf $IsPlaying = 1 Then
    _BASS_ChannelPause($MusicHandle)
    $IsPlaying = 0
    GUICtrlSetData($hGUIPlayPause, ChrW(9658))
    ElseIf $isPlaying = -1 Then
    $fileindex = ControlListView($hGUI, "", $hGUIList, "GetSelected")
    $file = ControlListView($hGUI, "", $hGUIList, "GetText", $fileindex)
    $file = $sFolder&"\"&$file
    _GUICtrlListView_SetItemSelected($hGUIList, $fileindex)
    $IsPlaying = 1
    Play($file)
    EndIf
    Case $hGUIForwards
    If $fileindex < UBound($aFiles)-1 Then
    $fileindex += 1
    Else
    $fileindex = 0
    EndIf
    _GUICtrlListView_SetItemSelected($hGUIList, $fileindex)
    $file = ControlListView($hGUI, "", $hGUIList, "GetText", $fileindex)
    $file = $sFolder&"\"&$file
    Play($file)
    Case $hGUIBackwards
    If $fileindex > 0 Then
    $fileindex -= 1
    Else
    $fileindex = UBound($aFiles)-1
    EndIf
    _GUICtrlListView_SetItemSelected($hGUIList, $fileindex)
    $file = ControlListView($hGUI, "", $hGUIList, "GetText", $fileindex)
    $file = $sFolder&"\"&$file
    Play($file)
    Case $hGUIEQBtn
    Dim $aFreqs[UBound($hGUIEQListItem)]
    Dim $aSets[UBound($hGUIEQListItem)]
    Dim $aNoSets[UBound($hGUIEQListItem)]
    for $i = 0 to UBound($hGUIEQListItem)-1 step +1
    $aFreqs[$i] = _GUICtrlListView_GetItemTextArray($hGUIEQ, $i)[1]
    $aSets[$i] = _GUICtrlListView_GetItemTextArray($hGUIEQ, $i)[2]
    $aNoSets[$i] = "+0"
    Next
    If GUICtrlRead($hGUIEQBtn) = "Off" Then
    GUICtrlSetData($hGUIEQBtn, "On")
    SetEQ($aFreqs, $aSets)
    Else
    GUICtrlSetData($hGUIEQBtn, "Off")
    SetEQ($aFreqs, $aNoSets)
    EndIf
    Case $hGUIEQContextAdd
    $Freq = InputBox("Frequency", "Please enter a frequency ['125' e.t.c]: ")
    $Setting = InputBox("Setting", "Please enter a setting ['+2' / '-2' e.t.c]: ")
    _ArrayAdd($hGUIEQListItem, GUICtrlCreateListViewItem($Freq &"|"& $Setting, $hGUIEQ))
    $IsTrue = True
    _GUICtrlListView_SimpleSort($hGUIEQ, $IsTrue, 0)
    Case $hGUIEQContextDelete
    GUICtrlDelete($hGUIEQListItem[ControlListView($hGUI, "", $hGUIEQ, "GetSelected")])
    _ArrayDelete($hGUIEQListItem, ControlListView($hGUI, "", $hGUIEQ, "GetSelected"))
    $IsTrue = True
    _GUICtrlListView_SimpleSort($hGUIEQ, $IsTrue, 0)
    EndSwitch
    WEnd
    #EndRegion
    #Region Funcs
    Func Start()
    _BASS_STARTUP("bin\bass.dll")
    _BASS_FX_Startup("bin\bass_fx.dll")
    _BASS_Init(0, -1, 100000, 0, "")
    _BASS_Init(0, -1, _Bass_GetInfo()[6], 0, "")
    EndFunc

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

    Func Play($file)
    $Length = _SoundLength(_SoundOpen($file), 2) /1000
    GUICtrlSetLimit($hGUIPosition, $Length)
    If $MusicHandle <> "" Then
    _BASS_ChannelStop($MusicHandle)
    EndIf
    $MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, 0)
    _BASS_ChannelPlay($MusicHandle, 1)
    $IsPlaying = 1
    GUICtrlSetData($hGUIPlayPause, "II")
    EndFunc

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

    Func SetEQ($aFreqs, $aSets)
    _Bass_SetEQ($MusicHandle, $aSets, $aFreqs)
    EndFunc

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

    Func Stop()
    _BASS_FREE()
    Exit
    EndFunc
    #EndRegion

    [/autoit]


    Alles rot. Obwohl der Backslash Bei Autoit doch garnichts auslöst oder? (<<Unabhängig vom Thema / Hier geht es um die Darstellung der Website)

    Spoiler anzeigen

    Überraschung!


    MfG Donkey

    Einmal editiert, zuletzt von ProgrammingDonkey (11. Januar 2015 um 21:53)

  • Habe das Problem nun gelöst; Ich habe die ID anhand des Inhaltes ermittelt:

    [autoit]

    Case $hGUIEQContextAdd
    $Freq = InputBox("Frequency", "Please enter a frequency ['125' e.t.c]: ")
    $Setting = InputBox("Setting", "Please enter a setting ['+2' / '-2' e.t.c]: ")
    _ArrayAdd($hGUIEQListItem, GUICtrlCreateListViewItem($Freq &"|"& $Setting, $hGUIEQ))
    $IsTrue = True
    _GUICtrlListView_SimpleSort($hGUIEQ, $IsTrue, 0)
    Case $hGUIEQContextDelete
    $iSelected = Number(ControlListView($hGUI, "", $hGUIEQ, "GetSelected"))
    $sSelectedText = _GUICtrlListView_GetItemTextArray($hGUIEQ, $iSelected)[1] &"|"& _GUICtrlListView_GetItemTextArray($hGUIEQ, $iSelected)[2]&"|"
    Dim $aToDelete[0]
    for $i = 0 to UBound($hGUIEQListItem)-1 step +1
    If GUICtrlRead($hGUIEQListItem[$i]) = $sSelectedText Then
    GUICtrlDelete($hGUIEQListItem[$i])
    _ArrayAdd($aToDelete, $i)
    EndIf
    Next
    for $i = 0 to UBound($aToDelete)-1 step +1
    _ArrayDelete($hGUIEQListItem, $aToDelete[$i])
    Next

    [/autoit]
    Spoiler anzeigen

    Überraschung!


    MfG Donkey