_GUICtrlListView_AddArray Error!

  • Hi,

    ich bin dabei ein kleines script zu schreiben was mir doppelte Dateien auf den Computer in ein Array speichert und dann in eine ListView packen soll jedoch dort scheitert es komicherweise schon. -.-

    Ich bekomme folgende Fehlermeldung:

    C:\Programme\AutoIt3\Include\GuiListView.au3 (520) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    DllStructSetData($tBuffer, "Text", $aItems[$iI][0])
    DllStructSetData($tBuffer, "Text", ^ ERROR


    Das Script habe ich anbei gehangen, bin dankbar für jeden lösungsvorschlag.

    autoit.de/wcf/attachment/9654/

    autoit.de/wcf/attachment/9655/

  • das problem liegt einfach darin, dass du eine 2D Array brauchst, die funktion sie aber nicht bekommt...
    führ mal diesen test durch ;) =>

    Test
    [autoit]

    #include <Array.au3>
    #include <GuiListView.au3>
    #include <Funcs.au3>
    Dim $aDouble[2][1] = [["Test"],["a"]]
    $sSavePath = @ScriptDir & '\Doppelte.txt'

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

    $GUI = GUICreate("DoubleKill", 400, 350)
    GUICtrlCreateLabel("File-Format to Search:", 10, 10)
    $SearchPattern = GUICtrlCreateCombo("", 10, 30, 150, 20)
    GUICtrlSetData($SearchPattern, "Text-Files|Log-Files|Windows-Media-Files|JPEG|MP3")
    $SucheGo = GUICtrlCreateButton("Search", 350, 10)
    $hListView = GUICtrlCreateListView("Pfad", 10, 60, 380, 285)
    $cListView = GUICtrlGetHandle($hListView)
    GUICtrlCreateLabel("Search Path:", 200, 10)
    $Path = GUICtrlCreateInput("C:", 200, 30, 100, 20)
    $contextmenu = GUICtrlCreateContextMenu($hListView)
    $iDel = GUICtrlCreateMenuItem("Diesen Eintrag löschen", $contextmenu)
    GUISetState(@SW_SHOW, $GUI)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $SucheGo
    ; $sSearchPattern = GUICtrlRead($SearchPattern)
    ; $sSearchPath = GUICtrlRead($Path)
    ; _SearchDoubles($sSearchPath, $sSearchPattern)
    ; _FileReadToArray2D(@ScriptDir & '\Doppelte.txt', $aDouble, -1)
    ; _ArrayDeleteEmpty($aDouble)
    ; _ArrayDelete($aDouble, 0)
    _ArrayDisplay($aDouble)
    _AddToListView($hListView, $aDouble)
    ;~ $unique = _ArrayUnique($aDouble)
    ;~ _ArrayDelete($unique, 0)
    ;~ _ArrayDisplay($unique)
    EndSwitch
    WEnd

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

    Func _AddToListView(ByRef $hWnd, ByRef $ARRAY)
    ToolTip('Bitte warten...', Default, Default, 'Liste wird erstellt!', 1, 3)
    If IsArray($ARRAY) Then
    _GUICtrlListView_AddArray($hListView, $ARRAY)
    ToolTip("")
    EndIf
    EndFunc ;==>_AddToListView

    [/autoit]

    du wirst sehen, dass es funktioniert...
    verstehst du jetzt, was da falsch ist? das muss eine 2d array sein, also auch zumindest als diese deklariert werden, egal wieviele cols sie hat
    dementsprechend musst du das jetzt ändern

  • Hier liegt das Problem:

    Spoiler anzeigen
    [autoit]


    Func _SearchDoubles(ByRef $sSearchPath, ByRef $sSearchPattern)
    ToolTip('Bitte warten...', Default, Default, 'Doppelte Dateien werden gesucht und eingelesen!', 1, 3)
    Local $SearchPattern
    Local $sSavePath = @ScriptDir & '\Doppelte.txt'
    If $sSearchPath = "" Or $sSearchPath = "Search Path" Then
    MsgBox(16, "", "No Path")
    Exit
    EndIf
    Switch $sSearchPattern
    Case "Text-Files"
    ConsoleWrite("@@ (001) :(" & @MIN & ':' & @SEC & ") Switch, $sSearchPattern" & " = " & " Text-Files" & @CR)
    $sSearchPattern = '*.txt'
    Case "Log-Files"
    ConsoleWrite("@@ (002) :(" & @MIN & ':' & @SEC & ") Switch $sSearchPattern" & " = " & " Log-Files" & @CR)
    $sSearchPattern = '*.log'
    Case "Windows-Media-Files"
    ConsoleWrite("@@ (003) :(" & @MIN & ':' & @SEC & ") Switch $sSearchPattern" & " = " & " Windows-Media-Files" & @CR)
    $sSearchPattern = '*.wma'
    Case "JPEG"
    ConsoleWrite("@@ (004) :(" & @MIN & ':' & @SEC & ") Switch $sSearchPattern" & " = " & " JPEG" & @CR)
    $sSearchPattern = '*.jpeg'
    Case "MP3"
    ConsoleWrite("@@ (005) :(" & @MIN & ':' & @SEC & ") Switch $sSearchPattern" & " = " & " MP3" & @CR)
    $sSearchPattern = '*.mp3'
    EndSwitch
    ConsoleWrite($sSearchPath & ' ' & $SearchPattern & @CRLF) ;debug
    Global $aFiles = _FileListToArrayEx($sSearchPath, $sSearchPattern)
    if not IsArray($aFiles) then ;errorhandling
    ConsoleWrite("$aFiles ist kein Array" & @CRLF)
    Return
    endif
    Global $sExists = '|', $sFilename = '', $sDouble = '', $iPos = 0
    For $i = 1 To $aFiles[0]
    $sFilename = StringRegExpReplace($aFiles[$i], '.+\\(.+)', '$1')
    $iPos = StringInStr($sExists, '\' & $sFilename)
    If $iPos Then
    $iStart = StringInStr($sExists, '|', 0, -1, $iPos)
    $iEnd = StringInStr($sExists, '|', 0, 1, $iPos)
    $sDouble &= StringMid($sExists, $iStart, $iEnd - $iStart) & '|'
    $sDouble &= $aFiles[$i] & '|'
    EndIf
    $sExists &= $aFiles[$i] & '|'
    Next
    $hFile = FileOpen($sSavePath, 2)
    FileWrite($hFile, StringReplace($sDouble, '|', @CRLF))
    FileClose($hFile)
    ToolTip("")
    EndFunc ;==>_SearchDoubles

    [/autoit]


    Hab mal eine Debug-Abfrage und das Errorhandling hinzugefügt.

    edit \ Naja das ist eines der Probleme :D
    Am besten auch nochmal die Hilfe zu _GUICtrlListView_AddArray bemühen. Dein Array entspricht nicht dem was dort erwartet wird.

    2 Mal editiert, zuletzt von nuts (19. Mai 2010 um 17:14)

  • wenn _GUICtrlListView_AddArray nicht geht, dann machs selbst... eben so simpel wie genial xD

    [autoit]

    Func _AddToListView(ByRef $hWnd, ByRef $ARRAY)
    ToolTip('Bitte warten...', Default, Default, 'Liste wird erstellt!', 1, 3)
    If IsArray($ARRAY) Then
    For $i = 0 To UBound($ARRAY) - 1
    _GUICtrlListView_AddItem($hWnd, $ARRAY[$i])
    Next
    ToolTip("")
    EndIf
    EndFunc ;==>_AddToListView

    [/autoit]

    nimm das und alle sind happy (den rest so lassen wie es war) ;)
    nuts: hab ich doch gesagt (oder damit ausdrücken wollen) ; Edit: an falsche person gedacht -.-

  • Ich hab die Aufgabe anders verstanden, ein 2D Array kann ganz einfach so zu einem Listview hinzugefügt werden:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <File.au3>

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

    global $2DArray[10][2]
    for $i=0 to 9
    for $x=0 to 1
    $2DArray[$i][$x]="Test " & Random(1,100)
    Next
    Next
    _ArrayDisplay($2DArray)

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

    $Form1 = GUICreate("2D Array to Listview - Beispiel", 700, 500, -1, -1)
    $ListView1 = GUICtrlCreateListView("", 20, 20, 660, 350)
    $hlistview = GUICtrlGetHandle($ListView1)

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

    _GUICtrlListView_AddColumn($hlistview, "1", 300)
    _GUICtrlListView_AddColumn($hlistview, "2", 450)

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

    GUISetState(@SW_SHOW)

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

    _2DArray_to_Listview($hlistview, $2DArray)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _2DArray_to_Listview($hwnd, ByRef $array)
    local $additem
    local $spaltenanzahl=UBound($array,2)
    local $zeilenanzahl=UBound($array,1)
    If _GUICtrlListView_GetColumnCount($hwnd) > $spaltenanzahl then Return SetError(1,0,1)

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

    For $i=0 to $zeilenanzahl-1
    $additem = _GUICtrlListView_AddItem($hwnd,$array[$i][0])
    for $x=1 to $spaltenanzahl-1
    _GUICtrlListView_AddSubItem($hwnd, $additem, $array[$i][$x],$x)
    next
    next
    endfunc

    [/autoit]