_ArrayDisplay "neue" Version

  • Nabend zusammen!
    Kann mir jemand mit der neuen Version helfen? Irgendwie komme ich nicht mehr klar. Wenn ich mit der "alten" Autoit Version _ArrayDisplay einen Array anzeigen lassen, dann bekomme ich in der 1. Zeile und Spalte angezeigt, wie viele Reihen und Spalten sich im Array befinden. Gibt es diese Anzeige in der "neuen" Version nicht mehr?

    Gruß
    Sirius

  • Welche neue Version?
    Welche hattest DU vorher und welche nutzt DU jetzt?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi Alina,
    mit "neuer" Version meinte ich SciTe.

    Ich habe auf der Arbeit die Version 3.3.7 installiert auf Windows 7 64bit und Office 2010.Auf dem Notebook habe ich die aktuelle Version von SciTe installiert auf Windows 8.1 und Office 2013 Professional Plus.

    Wenn ich jetzt mit _ArrayDisplay in der aktuellen SciTe Version, in Windows 8.1 einen Array anzeigen lasse, dann fehlt mir folgendes Feld (siehe Bild rotes Rechteck)

    Gruß
    Sirius

  • Das hat nichts mit _ArrayDisplay zu tun sondern mit der Quelle des Arrays.
    Arrays sind in AutoIt 0-basiert (wie in vielen anderen Sprachen auch). Das erste Element findet sich also am Index $Array[0].
    Will man nun alle Elemente durchgehen fängt man bei 0 an und endet bei "Gesamtlänge - 1".
    Das ist für viele anscheinend verwirrend, weswegen es sich teilweise durchgesetzt hat in das erste Element die Länge einzutragen.
    Dann beginnt man in einer Schleife beim Wert 1 und endet mit dem Wert in $Array[0].

    Ich persönlich halte davon nix. Bester Grund hierfür ist das furchtbare Beispiel deines gezeigten 2D-Arrays.
    Hier wird bis auf die ersten beiden Elemente die komplette erste Spalte und Zeile leer gelassen nur weil irgendwer zu doof ist bei 0 anzufangen mit zählen.
    Eine sinnfreiere Verschwendung von Ressourcen gibt es wohl selten.

    Es kommt also schlicht darauf an wie der Programmierer der jeweiligen Funktion die dir das Array zurückgegeben hat das ganze umgesetzt hat

  • Hallo AspirinJunkie,

    erstmal vielen Dank für deine Antwort. Ich bin halt ein Anfänger! Und für mich persönlich ist es halt blöd, wenn ich mir mühevoll ein Script schreibe, welches dann auf einmal nicht mehr
    funktioniert, weil eine Information, welche ich im Script verwende einfach nicht mehr da ist. Und als Anfänger fragt man sich dann, was habe ich falsch gemacht. Hier läuft das Script und da nicht.

    Wo und wie kann ich denn jetzt die Anzahl der Reihen auslesen?

    Gruß
    Sirius

  • Schieb mal das Script rüber, dann schaue ich es mir mal an.
    Sprich, poste es mal und wer als erstes kommt, bekommt
    auch als erstes den Zuschlag zur Antwort.

    Sorry, typische Dienstagmittaglaune. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Spoiler anzeigen

    Func oeffnen()
    Global $code = FileOpenDialog("Wähle Datenbank (XLSX, XLS) aus!",@StartupDir, "(*.xlsx;*.xls)",1 + 4)
    If Not @error Then GUICtrlSetState($Convert , $GUI_ENABLE)
    Global $aFiles = StringSplit($code, "|", 1)

    For $i = 2 To UBound($aFiles) -1
    $aFiles[$i] = $aFiles[1] & "\" & $aFiles[$i]

    Next
    EndFunc

    Func convert()

    If $aFiles[0] <= 1 Then
    For $i = 1 To $aFiles[0]

    Local $oExcel = _Excel_Open()
    Local $sWorkbook = $afiles[$i]
    Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook, Default, Default, True)
    Local $asheet = _Excel_Rangeread($oWorkbook)

    _ArrayDisplay($asheet)

    For $i = 2 To $asheet[0][0]

    WinActivate("V1 - 111.111.11.1 - Remotedesktopverbindung")

    Do
    $iResult = _ImageSearch("no.png",1,$x,$y,80)
    If $iResult <> 1 Then Sleep(600)
    Until $iResult = 1
    MouseClick("Left", $x, $y)

    Do
    $iResult = _ImageSearch("1kdnr.png",1,$x,$y,80)
    If $iResult <> 1 Then Sleep(600)
    Until $iResult = 1
    MouseClick("Left", $x, $y)
    MouseClick("Left", $x, $y)
    Send($asheet[$i][1]) ;KD-Nr.:
    Sleep(600)
    ;Send("{TAB}")

    Next
    Next
    EndIf
    EndFunc

    Func beenden()
    Exit
    EndFunc

  • Teste mal diese kleine Änderung.
    Habe noch nicht mit AutoIt für Excel gescriptet. Aber es sieht doch so, aus, das Dir derzeitig die oberste Reihe fehlt. Oder habe ich Dich da falsch verstanden?

    Spoiler anzeigen
    [autoit]


    Func oeffnen()
    Global $code = FileOpenDialog("Wähle Datenbank (XLSX, XLS) aus!",@StartupDir, "(*.xlsx;*.xls)",1 + 4)
    If Not @error Then GUICtrlSetState($Convert , $GUI_ENABLE)
    Global $aFiles = StringSplit($code, "|", 1)

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

    For $i = 2 To UBound($aFiles) -1 ; hier mal folgendes versucht: For $i = 1 To UBound($aFiles) -1


    $aFiles[$i] = $aFiles[1] & "\" & $aFiles[$i]

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

    Next
    EndFunc

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

    Func convert()

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

    If $aFiles[0] <= 1 Then
    For $i = 1 To $aFiles[0]

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

    Local $oExcel = _Excel_Open()
    Local $sWorkbook = $afiles[$i]
    Local $oWorkbook = _Excel_BookOpen($oExcel, $sWorkbook, Default, Default, True)
    Local $asheet = _Excel_Rangeread($oWorkbook)

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

    _ArrayDisplay($asheet)

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

    For $i = 2 To $asheet[0][0]

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

    WinActivate("V1 - 111.111.11.1 - Remotedesktopverbindung")

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

    Do
    $iResult = _ImageSearch("no.png",1,$x,$y,80)
    If $iResult <> 1 Then Sleep(600)
    Until $iResult = 1
    MouseClick("Left", $x, $y)

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

    Do
    $iResult = _ImageSearch("1kdnr.png",1,$x,$y,80)
    If $iResult <> 1 Then Sleep(600)
    Until $iResult = 1
    MouseClick("Left", $x, $y)
    MouseClick("Left", $x, $y)
    Send($asheet[$i][1]) ;KD-Nr.:
    Sleep(600)
    ;Send("{TAB}")

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

    Next
    Next
    EndIf
    EndFunc

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

    Func beenden()
    Exit
    EndFunc

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Wo und wie kann ich denn jetzt die Anzahl der Reihen auslesen?


    Hierfür gibt es die Funktion Ubound(). Diese gibt die Größe der Array Dimensionen zurück.
    Bei einem 1D-Array übergibt man einfach das Array und bekommt die Anzahl der Elemente.
    Bei einem 2D-Array kann man sich über den zweiten Parameter von Ubound entweder die Größe der ersten (Anzahl Reihen) oder der zweiten Dimension (Anzahl Spalten) zurückgeben lassen.

    Will man also z.B. in einer For-Schleife alles Elemente eines 0-basierten 1D-Arrays durchlaufen sähe der Grundaufbau ungefähr so aus:

    [autoit]

    Global $aArray[] = ["A", "B", "C", "D", "E"]

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

    For $i = 0 To UBound($aArray) - 1
    MsgBox(0,"", "$aArray[" & $i & "] = " & $aArray[$i])
    Next

    [/autoit]

    Bei einem 2D-Array sind es dann zwei For-Schleifen, da man ja erst z.b. die Reihen durchgeht und innerhalb jeder Reihe noch jede Spalte:

    [autoit]

    Global $aArray[][] = [["A", "B", "C"], ["D", "E", "F"], ["G", "H", "I"]]

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

    For $row = 0 To UBound($aArray, 1) - 1
    For $col = 0 To UBound($aArray, 2) - 1
    MsgBox(0,"", "$aArray[" & $row & "][" & $col & "] = " & $aArray[$row][$col])
    Next
    Next

    [/autoit]
  • Hallo Sirius,

    Programmierer haben die ANgewohnheit ständig den Versuch zu unternehemn, Ihre Programme zu verbessern.
    Daher ändern sich manchmal Dinge.
    In Deinem Fall vermute ich die Änderung in der Excel.udf.
    (Changed: Excel UDF was re-written. Functions and/or parameters have been renamed, removed or added. THIS IS A SCRIPT BREAKING CHANGE.)

    Immer wenn Du in einer neueren Version von autoit eine Veränderung oder ein unerwartetes Verhalten Deines bestehenden Scriptes bemerkst,
    ist es eine gute Idee die Änderungen durchzulesen.
    Meist erklärt sich dann der aufgetretene Fehler ;)
    siehe:
    https://www.autoitscript.com/autoit3/docs/history.htm

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Nabend!

    AspirinJunkie: Dein Code hat mir leider nicht weitergeholfen.

    Schnuffel: Ich habe mir bereits die Änderungen durchgelesen. Aber danke für den Link!

    Warum mir bei _ArrayDisplay auf einmal die Reihen- und Spaltenanzahl des Arrays nicht mehr angezeigt wird verstehe ich nicht.

    Vielleicht liegt es auch daran, dass ich Windows 2013 Plus installiert habe!?

    Gruß
    Sirius


    Sent from my Aspire VN7-571G using Tapatalk

  • Warum mir bei _ArrayDisplay auf einmal die Reihen- und Spaltenanzahl des Arrays nicht mehr angezeigt wird verstehe ich nicht.


    Nochmal: Das liegt nicht an ArrayDisplay.
    ArrayDisplay zeigt den Inhalt von Arrays an.
    Das frühere Array was du hattest, hatte in der ersten Zeile und Spalte (Index[0][0]) die Anzahl der Zeilen hinterlegt.
    In der ersten Zeile und zweiten Spalte stand hingegen die Anzahl der Spalten ( Index [0][1]).
    Jetzt benutzt die Funktion _Excel_Rangeread(). Diese gibt ein Array zurück, welches dies nicht so handhabt sondern gleich in der ersten Zeile und Spalte mit den eigentlichen Daten beginnt.
    Daher war deine Frage wie man bei solchen Arrays die Anzahl der Zeilen ermitteln kann. Meine Antwort: Mit der Funktion Ubound().

  • Im engl. Forum wurde mit Jon darüber diskutiert, ob die Zeilen-/Spaltenanzahl in das Array hineingehört. Klare Antwort: Nein.
    Daher wurden die neu geschriebenen UDFs für Word und Excel entsprechend angepasst. Sie sind ja Teil von Autoit und müssen daher auch den Regeln entsprechen (gibt aber immer noch Ausnahmen).
    In den "Script Breaking Changes" steht zwar nichts dazu drin, aber die Hilfe sagt klar, dass z.B. für _Excel_RangeRead "the data from the specified cell(s). A string for a cell, a zero-based array for a range of cells." als Ergebnis zurückgegeben wird. "Zero-based" bedeutet, dass die Nutzdaten ab Zeile 0 beginnen im Gegensatz zu einem one-based array.

  • Nee ... es liegt am Excel UDF. Bis AutoIt 3.3.10.x wurde noch die "alte" Excel UDF verwendet die die Anzahl an Zeilen/Spalten am Beginn des Arrays einfügte.
    Ab AutoIt 3.3.12.0 wurde die "neue" Excel UDF ausgeliefert die nur noch die Daten im Array zurückgibt.
    Also völlig unabhängig von der Excel Version.

  • sag ich doch ^^

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)