ListView - Array

  • Hallo,
    habe ein Frage. Ich habe eine ListView auf einer GUI die ich auslesen möchte. Dies Funktioniert soweit auch problemlos. Jedoch möchte ich die ausgelesenen Einträge in ein 2d-Array speichern. Ein Wert soll hierbei für die Zeile, der andere für die Spalte sein (bsp. $read[zeile][spalte]).
    Kann mir jemand sagen was ich falsch mache?
    Hier mein Versuch:

    [autoit]

    Func read()
    $count=_GUICtrlListView_GetItemCount($List1_2)
    Dim $String[$count][6]

    for $i = 0 to $count - 1
    $text=_GUICtrlListView_GetItemTextString($List1_2, $i)
    $Split=StringSplit($text,"|")
    for $a = 1 to 6
    $String[$i][$a]=$Split[$a]
    next
    next
    _ArrayDisplay($String)
    EndFunc

    [/autoit]

    Erhalte beim ausführen die Meldung:
    Error:Array variable has incorrect number of subscripts or subscripts dumension range exceeded.

  • Hey descent.

    Felder, spricht Arrays, sind nullindiziert. Ergo

    [autoit]

    For $a = 0 To 5
    $String[$i][$a]=$Split[$a]
    Next

    [/autoit]

    oder


    [autoit]

    For $a = 0 To Ubound($String, 2) -1
    $String[$i][$a]=$Split[$a]
    Next

    [/autoit]
  • @DaX,

    nicht immer

    [autoit]

    $Split=StringSplit($text,"|")

    [/autoit]

    gibt zwar ein 0 basiertes Array zurück, da aber $split[0] die Anzahl der Splaten enthält mss die For...Next Schleife bei 1 anfangen und bis $spli[0] laufen.

    descent warum nimmst du nicht gleich _GUICtrlListView_GetItemTextArray

    [autoit]

    Func read()
    $count=_GUICtrlListView_GetItemCount($List1_2)
    Dim $String[$count][6]
    for $i = 0 to $count - 1
    $aItem=_GUICtrlListView_GetItemTextArray($List1_2, $i)
    for $a = 1 to $aItem[0]
    $String[$i][$a]=$aItem[$a]
    next
    next
    _ArrayDisplay($String)
    EndFunc

    [/autoit]

    mfg autoBert

  • autoBert.

    Das erste Element eines Array in AutoIt wird IMMER durch die Indexnummer 0 gekennzeichnet, nicht durch 1 oder 2. Die Indexnummer des letzten Elements eines Arrays in AutoIt enspricht IMMER der Maximalanzahl an Elementen minus 1. (Ubound($myArray) - 1).

    Für das Arbeiten mit Arrays ist es doch unwichtig, was StringSplit im ersten Elements des Arrays zurückgibt! Was machst Du, wenn Du StringSplit mit dem flag-Parameter 2 aufgerufen wird?

  • Hallo @DaX,

    Zitat

    Für das Arbeiten mit Arrays ist es doch unwichtig, was StringSplit im ersten Elements des Arrays zurückgibt!

    eben nicht da in dem Skript von descent Stringsplit ohne das Parmater flag 2 aufgerufen wird enthälz $split[0] die Anzahl der Elemente und diese will er ja nicht in das neue Array eintragen.

    Zitat

    Was machst Du, wenn Du StringSplit mit dem flag-Parameter 2 aufgerufen wird?

    In diesm Falle verwende ich natürlich auch Ubound($split) - 1 in der For-Schleife, aber dass war wohl eher eine rethorische Frage,

    mfg AutoBert

    Einmal editiert, zuletzt von autoBert (23. September 2010 um 02:16) aus folgendem Grund: TAG`s korrigiert

  • Hallo autoBert,
    leider funktioniert das noch immer nicht ganz. Erhalte folgende Fehlermeldung:

    Zitat

    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $String[$i][$a]=$aItem[$a]

    Es hängt wieder an einem Array.

    • Offizieller Beitrag
    [autoit]

    Func read()
    $count=_GUICtrlListView_GetItemCount($List1_2)
    Dim $String[$count][6]
    for $i = 0 to $count - 1
    $aItem=_GUICtrlListView_GetItemTextArray($List1_2, $i)
    for $a = 1 to $aItem[0]
    $String[$i][$a-1]=$aItem[$a];$a-1 weil die Subelemente des Array bei Index 0 beginnen
    next
    next
    _ArrayDisplay($String)
    EndFunc

    [/autoit]
  • Etwas ausgebaut (inkl. Header und Colwidth):

    Spoiler anzeigen
    [autoit]


    Func _Listviewtoarray($hWnd, $dim = Default)
    ; Nuts (http://www.autoit.de)
    ; hwnd: Handle to the Listview
    ; Dim: default = all Columns
    ; else = only user defined Column
    ;Error: 0 = Incorrect handle
    ; 1 = $dim > Columcount
    If Not IsHWnd($hWnd) Then SetError(0,0,0)
    Local $col, $getcol, $getwidth, $lcount, $atext, $counter = 2
    $col = _GUICtrlListView_GetColumnCount($hWnd)
    $lcount = _GUICtrlListView_GetItemCount($hWnd)
    Switch $dim
    Case Default
    Local $alistview[$lcount + 2][$col]
    For $y = 0 To $col - 1
    $getcol = _GUICtrlListView_GetColumn($hWnd, $y)
    $getwidth = _GUICtrlListView_GetColumnWidth($hWnd, $y)
    $alistview[0][$y] = $getwidth
    $alistview[1][$y] = $getcol[5]
    Next
    For $i = 0 To $lcount - 1
    $atext = _GUICtrlListView_GetItemTextArray($hWnd, $i)
    For $x = 0 To $atext[0] - 1
    $alistview[$counter][$x] = $atext[$x + 1]
    Next
    $counter += 1
    Next
    Return $alistview
    Case Else
    If $dim > $col Then SetError(1,0,0)
    Local $alistview[$lcount + 2]
    $getcol = _GUICtrlListView_GetColumn($hWnd, $dim)
    $alistview[0] = _GUICtrlListView_GetColumnWidth($hWnd, $dim)
    $alistview[1] = $getcol[5]
    For $i = 0 To $lcount - 1
    $alistview[$i + 2] = _GUICtrlListView_GetItemText($hWnd, $i, $dim)
    Next
    Return $alistview
    EndSwitch
    EndFunc ;==>_Listviewtoarray

    [/autoit]
  • In dem speziellen Fall von StringSplit ist es natürlich wichtig, wie meine Daten im Rückgabewert gespeichert werden. Mir war es nur wichtig zu sagen, dass alle Arrays in AutoIt nullbasiert sind und das letzte Element mit Arraygröße minus 1 angesprochen wird. Das trifft auch auf das Array, welches StringSplit zurückgibt, zu.

    Anfänger haben leider beim Arbeiten mit Arrays immer wieder Schwierigkeiten, und wundern sich, warum sie falsche Werte und oder eine Fehlermeldung geliefert bekommen.

  • Ich füge noch hinzu^^:
    Aus diesem Grund wird bei der Deklaration einer Array (mehrerer Arrays) die anzahl der unterschiedlichen Arrays angegeben ($ar[0], $ar[1].. etc).
    Da diese jedoch mit 0 anfangen, ist die Angabe der deklarierten Arrays immer 1 mehr als die letzte Array besitzt.

    Bsp.:

    Dim $ar[20]
    also ist die letzte array = $ar[19]

    In manchen fällen gibt ein befehl arrays zurück, wie z.b. StringSplit . Bei diesem array zurückgebenden befehl ist der array wert 0 nur die angabe , wie viele Teilstrings der string enthält.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

    • Offizieller Beitrag

    also ist die letzte array = $ar[19]


    BadBunny - deine Ausdrucksweise verwirrt leider eher, als dass sie hilft.
    Das Ganze ist ein Array und dieses besteht aus einer Anzahl von Elementen, die über ihren (nullbasierten) Index adressiert werden.
    Die Deklaration ist also: Dim $Array[Anzahl_Elemente]

    Im übrigen empfehle ich einen Blick in mein Array-Tut (s. Signatur) ;)

  • Ok danke werde ich machen.

    Wenn ich richtig informiert bin stammt die Funktion _FilewriteFromArray() von dir. Liege ich richtig, dass ich mit dieser Funktion nichts zu einem bereits bestehenden Text hinzufügen kann, sonder der komplette Text durch den Arrayinhalt ausgetauscht wird?

    • Offizieller Beitrag

    Wenn ich richtig informiert bin stammt die Funktion _FilewriteFromArray() von dir.

    Da liegst du falsch ;) - die stammt von Jos van der Zande.

    Liege ich richtig, dass ich mit dieser Funktion nichts zu einem bereits bestehenden Text hinzufügen kann, sonder der komplette Text durch den Arrayinhalt ausgetauscht wird?

    Das ist korrekt.