Listview, Index von Item wird nicht korrekt erkannt !

  • Hallo Leute,

    Ich nutze selten die Hilfe & Unterstützung Sektion im Forum für mich aber irgendwann muss es halt auch mal sein :D

    Das ist das Skript:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <WinAPI.au3>

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

    #NoTrayIcon

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

    #AutoIt3Wrapper_UseX64=n

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

    Opt("GuiOnEventMode", 1)
    Opt("GuiCloseOnESC", 0)

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

    ; ### MAIN GUI ###

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

    $hGuiMain = GUICreate("Multiple-File-Editor", 641, 440)
    $Group1 = GUICtrlCreateGroup(" Dateien ", 8, 8, 289, 425)
    $cButtonAddFiles = GUICtrlCreateButton("Dateien hinzufügen", 16, 24, 107, 25, $WS_GROUP)
    $cButtonAddFolder = GUICtrlCreateButton("Ordner hinzufügen", 128, 24, 99, 25, $WS_GROUP)
    $cListViewFilesAdded = GUICtrlCreateListView("Dateien", 16, 56, 273, 169)
    $cButtonFilter = GUICtrlCreateButton("Filter", 232, 24, 57, 25, $WS_GROUP)
    $cListViewFilesEdit = GUICtrlCreateListView("Dateien", 16, 256, 273, 169)
    $cCheckboxAllFiles = GUICtrlCreateCheckbox("Alle Dateien", 16, 232, 97, 17, BitOR($BS_CHECKBOX, $BS_AUTOCHECKBOX, $BS_RIGHTBUTTON, $BS_CENTER, $WS_TABSTOP))
    $cButtonDown = GUICtrlCreateButton("DOWN", 136, 232, 75, 17, $WS_GROUP)
    $cButtonUp = GUICtrlCreateButton("UP", 216, 232, 75, 17, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $cTab = GUICtrlCreateTab(304, 48, 329, 297)
    GUICtrlSetResizing(-1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
    $TabSheet1 = GUICtrlCreateTabItem("Dateiname")
    $Group4 = GUICtrlCreateGroup(" Schriftzug ", 312, 200, 313, 89)
    $cRadioNoAction = GUICtrlCreateRadio("Unverändert lassen", 320, 264, 137, 17)
    $cRadioNormalCase = GUICtrlCreateRadio("Anfangsbuchstaben groß", 320, 248, 137, 17)
    $cRadioLowerCase = GUICtrlCreateRadio("Alles klein schreiben", 320, 232, 113, 17)
    $cRadioUpperCase = GUICtrlCreateRadio("Alles groß schreiben", 320, 216, 113, 17)
    $cButtonApplyFormatFilenames = GUICtrlCreateButton("Übernehmen", 496, 256, 125, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group5 = GUICtrlCreateGroup(" Löschen ", 312, 152, 313, 49)
    $cRadioDeleteAfter = GUICtrlCreateRadio("Hinten", 476, 179, 50, 17)
    $cRadioDeleteBefore = GUICtrlCreateRadio("Vorne", 476, 163, 50, 17)
    $cInputDeleteChars = GUICtrlCreateInput("", 316, 169, 153, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cButtonApplyDeleteChars = GUICtrlCreateButton("Übernehmen", 536, 168, 83, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group6 = GUICtrlCreateGroup(" Einfügen ", 312, 72, 313, 81)
    $cInputInsertText = GUICtrlCreateInput("", 324, 87, 161, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cRadioInsertAfter = GUICtrlCreateRadio("Nach dem Dateinamen", 492, 97, 130, 17)
    $cRadioInsertBefore = GUICtrlCreateRadio("Vor dem Dateinamen", 492, 81, 121, 17)
    $cButtonApplyInsertText = GUICtrlCreateButton("Übernehmen", 496, 120, 125, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group7 = GUICtrlCreateGroup(" Ersetzen ", 312, 288, 313, 49)
    $cInputReplace1 = GUICtrlCreateInput("", 320, 304, 57, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $Label1 = GUICtrlCreateLabel(" ersetzen mit ", 384, 306, 66, 17)
    $cInputReplace2 = GUICtrlCreateInput("", 456, 304, 57, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cButtonReplace = GUICtrlCreateButton("Ersetzen", 520, 304, 99, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $TabSheet2 = GUICtrlCreateTabItem("MP3-Dateien (Tags etc)")
    $Group2 = GUICtrlCreateGroup(" Gloable Tags setzen ", 312, 72, 137, 177)
    $cInputArtist = GUICtrlCreateInput("", 320, 96, 121, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cInputYear = GUICtrlCreateInput("", 320, 144, 121, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cInputAlbum = GUICtrlCreateInput("", 320, 120, 121, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cInputGenre = GUICtrlCreateInput("", 320, 168, 121, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cButtonApply2 = GUICtrlCreateButton("Übernehmen", 320, 216, 123, 25, $WS_GROUP)
    $cCheckboxDeleteOthers = GUICtrlCreateCheckbox("Andere Tags löschen", 322, 194, 121, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup(" Tags aus Dateiname ", 456, 72, 169, 81)
    $cInputSyntax = GUICtrlCreateInput("", 464, 96, 153, 21, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $cButtonApply3 = GUICtrlCreateButton("Übernehmen", 464, 120, 155, 25, $WS_GROUP)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateTabItem("")
    $cButtonHelp = GUICtrlCreateButton("Hilfe", 304, 16, 163, 25, $WS_GROUP)
    $cButtonExit = GUICtrlCreateButton("Beenden", 472, 16, 155, 25, $WS_GROUP)
    ; ### HELP GUI ###

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

    ; ### HELP GUI ###
    $hGuiHelp = GUICreate("Hilfe", 262, 224)
    GUICtrlCreateGroup(" Syntax ", 8, 8, 249, 177)
    $cLabelHelp1 = GUICtrlCreateLabel("Im Syntaxfeld kannst du angeben, wie die Dateinamen der MP3-Dateien aufgebaut sind. Das Programm verwendet diese Syntax dann um die korrekten ID3-Tags in die MP3-Dateien einzutragen.", 16, 24, 230, 65)
    $cLabelHelp2 = GUICtrlCreateLabel("Eine solche Syntax könnte wie folgt aussehen: %A% - %T% .%A% steht für den Interpreten (eng. Artist) und %T% steht für den Titel (eng. Title). Außerdem muss angegeben werden wie Interpret und Titel im Dateinamen von einander getrennt sind. Im Falle des Beispiels ist dies: ' - '", 16, 96, 230, 81)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $cButtonHelpExit = GUICtrlCreateButton("OK", 88, 192, 75, 25, $WS_GROUP)
    ; ### HELP GUI ###

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    $hListViewFilesAdded = GUICtrlGetHandle($cListViewFilesAdded)
    $hListViewFilesEdit = GUICtrlGetHandle($cListViewFilesEdit)

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

    _GUICtrlListView_SetColumnWidth($hListViewFilesAdded, 0, 1000)
    _GUICtrlListView_SetColumnWidth($hListViewFilesEdit, 0, 1000)

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

    GUISetOnEvent(-3, "_Exit", $hGuiMain)

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

    GUICtrlSetOnEvent($cButtonAddFiles, "_AddFiles")
    GUICtrlSetOnEvent($cButtonAddFolder, "_AddFolder")
    GUICtrlSetOnEvent($cButtonFilter, "_SetFilter")

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

    GUICtrlSetOnEvent($cButtonExit, "_Exit")

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

    GUICtrlSetState($cInputGenre, $GUI_DISABLE)
    GUICtrlSetState($cCheckboxDeleteOthers, $GUI_CHECKED + $GUI_DISABLE)
    ;~ GUICtrlSetState($cButtonDown, $GUI_DISABLE)
    ;~ GUICtrlSetState($cButtonUp, $GUI_DISABLE)
    ;~ GUICtrlSetState($cCheckboxAllFiles, $GUI_DISABLE)
    ;~ GUICtrlSetState($cListViewFilesEdit, $GUI_DISABLE)
    ;~ GUICtrlSetState($cInputReplace1, $GUI_DISABLE)
    ;~ GUICtrlSetState($cInputReplace2, $GUI_DISABLE)
    ;~ GUICtrlSetState($cButtonReplace, $GUI_DISABLE)

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

    GUICtrlSetResizing($cTab, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)

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

    HotKeySet("{DEL}", "_RemoveEntry")

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

    GUISetState(@SW_SHOW, $hGuiMain)
    GUISetState(@SW_HIDE, $hGuiHelp)

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

    While Sleep(10)
    WEnd

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

    Func _GetIndex($Info)
    MsgBox(0, 'Item Index Clicked',$Info)
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListViewFilesAdded ; Hier $hLV gegen das Handle des Listviews tauschen
    If Not IsHWnd($hListViewFilesAdded) Then $hWndListView = GUICtrlGetHandle($hListViewFilesAdded)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $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
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    _GetIndex(DllStructGetData($tInfo, "Index"))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _ToggleHelpGuiState()
    Switch _WinAPI_IsWindowVisible($hGuiHelp)
    Case True
    GUISetState(@SW_HIDE, $hGuiHelp)

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

    Case False
    GUISetState(@SW_SHOW, $hGuiHelp)
    EndSwitch
    EndFunc ;==>_ToggleHelpGuiState

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

    Func _AddFiles()
    Local $Files = FileOpenDialog("Bitte Dateien für die Bearbeitung auswählen", "", "Alle Dateien (*.*)", 7)
    If @error Then Return -1
    $aFiles = StringSplit($Files, "|", 3)
    If @error == 1 Then
    _GUICtrlListView_AddItem($hListViewFilesAdded, $Files)
    Else
    For $iIndex = 1 To UBound($aFiles, 1) - 1
    _GUICtrlListView_AddItem($hListViewFilesAdded, $aFiles[0] & '\' & $aFiles[$iIndex])
    Next
    EndIf
    EndFunc ;==>_AddFiles

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

    Func _AddFolder()
    Local $sFolder = FileSelectFolder("Bitte Ordner auswählen", "")
    If @error Then Return -1
    SplashTextOn("Bitte warten...", "Bitte warten Sie kurz!" & @CRLF & "Der Ordner wird rekursiv durchsucht, das kann je nach Größe des Ordners einige Zeit dauern!", 400, 80, -1, -1, -1, 6)
    Local $aFiles = _GetFilesFolder_Rekursiv($sFolder)
    SplashOff()
    If Not IsArray($aFiles) Then Return -2
    For $iIndex = 1 To $aFiles[0]
    If StringRegExp($aFiles[$iIndex], "\.[a-z0-9]{3,}$", 0) Then _GUICtrlListView_AddItem($hListViewFilesAdded, $aFiles[$iIndex])
    Next
    EndFunc ;==>_AddFolder

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

    Func _SetFilter()
    Local $sExt = InputBox("Dateiliste filtern", "Bitte geben Sie hier die Dateierweiterung ein, nach der die Liste gefiltert werden soll!" & @CRLF & "BSP: 'mp3'" & @CRLF & @CRLF & "Nach dem Filtern werden nur noch die Dateien mit der eingegebenen Endung angezeigt!")
    Local $sItem
    Local $iLength = StringLen($sExt)
    Local $iCount = _GUICtrlListView_GetItemCount($hListViewFilesAdded)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iCount = ' & $iCount & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

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

    If @error Or $sExt = '' Then Return -1
    For $i = 0 To $iCount - 1
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iCount - 1 = ' & $iCount - 1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $i = ' & $i & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $aItem = _GUICtrlListView_GetItemTextArray($hListViewFilesAdded, $i)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aItem[1] = ' & $aItem[1] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sExt = ' & $sExt & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : StringRight($sItem, $iLength) = ' & StringRight($sItem, $iLength) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    If StringRight($aItem[1], $iLength) == $sExt Then
    _GUICtrlListView_AddItem($hListViewFilesEdit, $aItem[1])
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : _GUICtrlListView_AddItem($hListViewFilesEdit, $aItem[1]) = ' & _GUICtrlListView_AddItem($hListViewFilesEdit, $aItem[1]) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _GUICtrlListView_DeleteItem($hListViewFilesAdded, $i)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : _GUICtrlListView_DeleteItem($hListViewFilesAdded, $i) = ' & _GUICtrlListView_DeleteItem($hListViewFilesAdded, $i) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    EndIf
    Next
    EndFunc ;==>_SetFilter

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]

    Und das ist das Problem:

    Wichtig: Bitte im Scite-Editor als x86-Skript ausführen !
    Wenn ihr auf Dateien hinzufügen klickt und anschließend Dateien auswählt, sie sollten die gleiche Endung haben und zur besseren Übersicht nummeriert sein, also zB 01_Datei.mp3, 02_Datei.mp3, ..

    Klickt ihr auf OK, so werden die Dateien in das erste Listview eingefügt, wenn ihr nun auf Filter klickt, erscheint eine Inputbox in der ihr die Endung eingebt, nach der die Dateien gefiltert werden sollen (zB mp3)
    Klickt ihr nun auf OK, sollten eigentlich alle Dateien mit der Endung vom oberen Listview ins untere verschoben werden (siehe Funktion _SetFilter).
    Wenn ihr aber genau schaut (Listviews und Ausgabe in Scite-Konsole), werden (zumindest bei mir) nicht alle Dateien verschoben und manche dafür doppelt erstellt, im unteren Listview.

    Die anderen Funktion hab ich mal weggelassen, da sie ja unwichtig sind :D

    Danke schon mal im vorraus.

    MfG oetzn

  • Ich würde die Funktion so machen

    [autoit]

    Func _SetFilter()
    Local $sExt = InputBox("Dateiliste filtern", "Bitte geben Sie hier die Dateierweiterung ein, nach der die Liste gefiltert werden soll!" & @CRLF & "BSP: 'mp3'" & @CRLF & @CRLF & "Nach dem Filtern werden nur noch die Dateien mit der eingegebenen Endung angezeigt!")
    If @error Then Return -1

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

    For $i = 0 To _GUICtrlListView_GetItemCount($hListViewFilesAdded) -1
    If Not StringRegExp(_GUICtrlListView_GetItemText($hListViewFilesAdded,$i),$sExt,0) Then _GUICtrlListView_DeleteItem($hListViewFilesAdded,$i)
    Next
    EndFunc ;==>_SetFilter

    [/autoit]


    so funzts auch.

  • OK, es fügt schon mal nichts mehr doppelt ein, aber wenn ich es so verwende:

    [autoit]


    Func _SetFilter()
    Local $sExt = InputBox("Dateiliste filtern", "Bitte geben Sie hier die Dateierweiterung ein, nach der die Liste gefiltert werden soll!" & @CRLF & "BSP: 'mp3'" & @CRLF & @CRLF & "Nach dem Filtern werden nur noch die Dateien mit der eingegebenen Endung angezeigt!")
    If @error Then Return -1
    Local $iCount = _GUICtrlListView_GetItemCount($hListViewFilesAdded) -1

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

    For $i = 0 To $iCount
    If StringRegExp(_GUICtrlListView_GetItemText($hListViewFilesAdded,$i),$sExt,0) Then
    _GUICtrlListView_AddItem($hListViewFilesEdit, _GUICtrlListView_GetItemText($hListViewFilesAdded,$i))
    _GUICtrlListView_DeleteItem($hListViewFilesAdded,$i)
    EndIf
    Next
    EndFunc ;==>_SetFilter

    [/autoit]

    Sollte es eigentlich das tun, was es tun soll, tut es aber nicht.
    Es soll alle Dateien die mit dem Filter übereinstimmen, aus der 1. gelöscht und in die 2. eingefügt werden !

    Mit der Funktion oben, nimmt er immer nur jede 2. Datei, aber ich weis nicht warum..