• Offizieller Beitrag

    integrierst du diese Funktion auch noch in die arraymore.au3?


    Das hatte ich vor, habe bisher aber noch keine gangbare Lösung gefunden, wie.
    Problem:
    Wenn ich die Funktion in die ArrayMore.au3 einfüge und du includest ArrayMore.au3 bekommst du Fehlermeldungen von Scite bei jeder Funktion aus dem Paket, weil die für diese Funktion notwendige Includierung der SQLite.au3 und SQLite.dll.au3 im Hauptskript stehen muß. Es wird von Scite ja immer das gesamte Include geprüft.
    Du kannst diese Meldungen zwar ignorieren - es funzt alles - aber das ist halt lästig.
    Falls du eine Idee hast, sag an. Ich bin für alle Vorschläge offen. ;)

  • Kann es sein, dass die _Array2DDelete inzwischen überflüssig ist, da _ArrayDelete mittlerweile auf 2D Arrays löschen kann?

    • Offizieller Beitrag

    Hi,
    irgendwann die Tage hatte jemand Interesse an einer Darstellung von Arrays als Elemente in einem Array gezeigt.
    Ich habe dazu mal die UDF _ArrayDisplay() etwas "vergewaltigt" :D und eine Anzeigemöglichkeit dafür geschaffen.
    Ist sicher noch nicht optimal gelöst aber funktioniert.
    Allerdings nur für 1D/2D-Arrays und auch nicht rekursiv (also kein Array im Array im Array....;-) ).
    - Ist ein Arrayelement selbst ein Array, so wird es in der Anzeige als [SubArray] dargestellt.
    - Mit rechtem Mausklick auf [SubArray] kann nun dieses Array angezeigt werden.

    Vielleicht probier ich nochmal bei Gelegenheit, die Funktion rekursiv zu gestalten. Aber ich denke, für den eher seltenen Einsatz solcher Darstellungen ist es ausreichend.

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GuiListView.au3>

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

    Global $arSub = _GetTestArray(120)
    Global $arSub2 = _GetTestArray(120, 12)
    Global $arTest[4][3]=[ _
    [1,2,$arSub2], _
    [4,5,6], _
    [7,8,9], _
    [$arSub,11,12]]

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

    Func _GetTestArray($iUbDim1, $iUbDim2=0, $sValue='Wert ')
    Local $i, $k, $2ndDim = False
    Local $aOut[$iUbDim1]
    If $iUbDim2 > 1 Then
    $2ndDim = True
    ReDim $aOut[$iUbDim1][$iUbDim2]
    EndIf
    For $i = 0 To $iUbDim1 -1
    If $2ndDim Then
    For $k = 0 To $iUbDim2 -1
    $aOut[$i][$k] = $sValue & $i & '/ ' & $k
    Next
    Else
    $aOut[$i] = $sValue & $i
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_GetTestArray

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

    _ArrayMultiDisplay($arTest)

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

    ;==================================================================================================
    ; Function Name: _ArrayMultiDisplay
    ; Description:: Anzeige von 1D/2D-Arrays
    ; Array-Elemente, die selbst ein 1D/2D-Array darstellen, werden als "[SubArray]"
    ; markiert und können per Rechtsklick angezeigt werden.
    ; Parameter(s): Identisch zur Funktion _ArrayDisplay()
    ;==================================================================================================
    Func _ArrayMultiDisplay(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|")
    If Not IsArray($avArray) Then Return SetError(1, 0, 0)

    ; Array für Subfunktionen Global zur Verfügung stellen
    Global $avArrayMultiDisplay = $avArray

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

    ; Dimension checking
    Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1
    If $iDimension > 2 Then Return SetError(2, 0, 0)

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

    ; Separator handling
    ;~ If $sSeparator = "" Then $sSeparator = Chr(1)
    If $sSeparator = "" Then $sSeparator = Chr(124)

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

    ; Declare variables
    Local $i, $j, $vTmp, $aItem, $avArrayText, $sHeader = "Row", $iBuffer = 64
    Local $iColLimit = 250, $iLVIAddUDFThreshold = 4000, $iWidth = 640, $iHeight = 480
    Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator)

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

    ; Swap dimensions if transposing
    If $iSubMax < 0 Then $iSubMax = 0
    If $iTranspose Then
    $vTmp = $iUBound
    $iUBound = $iSubMax
    $iSubMax = $vTmp
    EndIf

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

    ; Set limits for dimensions
    If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
    If $iItemLimit = 1 Then $iItemLimit = $iLVIAddUDFThreshold
    If $iItemLimit < 1 Then $iItemLimit = $iUBound
    If $iUBound > $iItemLimit Then $iUBound = $iItemLimit
    If $iLVIAddUDFThreshold > $iUBound Then $iLVIAddUDFThreshold = $iUBound

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

    ; Set header up
    For $i = 0 To $iSubMax
    $sHeader &= $sSeparator & "Col " & $i
    Next

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

    ; Convert array into text for listview
    Local $avArrayText[$iUBound + 1]

    For $i = 0 To $iUBound
    $avArrayText[$i] = "[" & $i & "]"
    For $j = 0 To $iSubMax
    ; Get current item
    If $iDimension = 1 Then
    If $iTranspose Then
    $vTmp = $avArray[$j]
    Else
    $vTmp = $avArray[$i]
    EndIf
    Else
    If $iTranspose Then
    $vTmp = $avArray[$j][$i]
    Else
    $vTmp = $avArray[$i][$j]
    EndIf
    EndIf

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

    ; Prüfen ob SubArray und entsprechend markieren
    If IsArray($vTmp) Then
    $vTmp = '[SubArray]'
    Else
    ; Add to text array
    $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
    EndIf
    $avArrayText[$i] &= $sSeparator & $vTmp

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

    ; Set max buffer size
    $vTmp = StringLen($vTmp)
    If $vTmp > $iBuffer Then $iBuffer = $vTmp
    Next
    Next
    $iBuffer += 1

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

    ; GUI Constants
    Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66
    Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40
    Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200
    Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2
    Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4
    Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
    Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4
    Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1
    Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
    Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
    Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
    Local Const $_ARRAYCONSTANT_LVM_INSERTITEMA = (0x1000 + 7)
    Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
    Local Const $_ARRAYCONSTANT_LVM_SETITEMA = (0x1000 + 6)
    Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
    Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
    Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
    Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
    Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
    Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
    Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
    Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns"
    Local Const $_ARRAYCONSTANT_WM_NOTIFY = 0x004E
    Local Const $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG = 0x00100000

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

    Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
    Local $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer)
    Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem)
    DllStructSetData($tItem, "Param", 0)
    DllStructSetData($tItem, "Text", $pBuffer)
    DllStructSetData($tItem, "TextMax", $iBuffer)

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

    ; Set interface up
    Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX, $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG))
    ; GUI Global zur Verfügung stellen
    Global $hArrayDisplayGUI = $hGUI
    Local $aiGUISize = WinGetClientSize($hGUI)
    Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
    ; ListView Global zur Verfügung stellen
    Global $hArrayDisplayListView = $hListView
    Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
    GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
    GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
    GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
    GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)

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

    ; Fill listview
    For $i = 0 To $iLVIAddUDFThreshold
    GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
    Next
    For $i = ($iLVIAddUDFThreshold + 1) To $iUBound
    $aItem = StringSplit($avArrayText[$i], $sSeparator)
    DllStructSetData($tBuffer, "Text", $aItem[1])

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

    ; Add listview item
    DllStructSetData($tItem, "Item", $i)
    DllStructSetData($tItem, "SubItem", 0)
    DllStructSetData($tItem, "Mask", $iAddMask)
    GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMA, 0, $pItem)

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

    ; Set listview subitem text
    DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT)
    For $j = 2 To $aItem[0]
    DllStructSetData($tBuffer, "Text", $aItem[$j])
    DllStructSetData($tItem, "SubItem", $j - 1)
    GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMA, 0, $pItem)
    Next
    Next

    ; ajust window width
    $iWidth = 0
    For $i = 0 To $iSubMax + 1
    $iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
    Next
    If $iWidth < 250 Then $iWidth = 230
    WinMove($hGUI, "", Default, Default, $iWidth + 20)

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

    ; Show dialog
    GUISetState(@SW_SHOW, $hGUI)
    GUIRegisterMsg($_ARRAYCONSTANT_WM_NOTIFY, "WM_DISPLAY_NOTIFY")
    Global $a_msgARRAY_DISPLAY
    If Not IsDeclared('hSubGUI') Then Global $hSubGUI

    While 1
    $a_msgARRAY_DISPLAY = GUIGetMsg(1)
    Switch $a_msgARRAY_DISPLAY[0]
    Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
    If $a_msgARRAY_DISPLAY[1] = $hGUI Then
    ExitLoop
    Else
    GUIDelete($hSubGUI)
    EndIf
    Case $hCopy
    Local $sClip = ""

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

    ; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
    Local $aiCurItems[1] = [0]
    For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
    If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
    $aiCurItems[0] += 1
    ReDim $aiCurItems[$aiCurItems[0] + 1]
    $aiCurItems[$aiCurItems[0]] = $i
    EndIf
    Next

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

    ; Generate clipboard text
    If Not $aiCurItems[0] Then
    For $sItem In $avArrayText
    $sClip &= $sItem & @CRLF
    Next
    Else
    For $i = 1 To UBound($aiCurItems) - 1
    $sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
    Next
    EndIf
    ClipPut($sClip)
    EndSwitch
    WEnd
    GUIDelete($hGUI)

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

    Opt("GUIOnEventMode", $iOnEventMode)
    Opt("GUIDataSeparatorChar", $sDataSeparatorChar)

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

    Return 1
    EndFunc ;==>_ArrayMultiDisplay

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

    Func WM_DISPLAY_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    If Not IsDeclared('hArrayDisplayListView') Then Local $hArrayDisplayListView
    If Not IsDeclared('avArrayMultiDisplay') Then Local $avArrayMultiDisplay
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hArrayDisplayListView
    If Not IsHWnd($hArrayDisplayListView) Then $hWndListView = GUICtrlGetHandle($hArrayDisplayListView)

    Local Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
    Local Const $tagNMITEMACTIVATE = "hwnd hWndFrom;int IDFrom;int Code;int Index;int SubItem;int NewState;int OldState;" & _
    "int Changed;int X;int Y;int lParam;int KeyFlags"
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case -5
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $ItemIndex = DllStructGetData($tInfo, "Index"), $SubIndex = DllStructGetData($tInfo, "SubItem")
    If _GUICtrlListView_GetItemText($iIDFrom, $ItemIndex, $SubIndex) = '[SubArray]' Then
    If Not IsArray($avArrayMultiDisplay) Then Return
    Local $avArraySub = $avArrayMultiDisplay[$ItemIndex][$SubIndex - 1]
    If Not IsDeclared('hArrayDisplayGUI') Then Local $hArrayDisplayGUI
    Local $aMainPos = WinGetPos($hArrayDisplayGUI)
    Local $hSubGUI = GUICreate('SubArray', 640, 480, -1, -1, Default, 0x00000040, $hArrayDisplayGUI)
    Local $sItemText, $ub2nd, $sHeaderLV = 'Row | Col 1'
    If UBound($avArraySub, 2) > 1 Then
    $ub2nd = True
    $sHeaderLV = 'Row | '
    For $j = 0 To UBound($avArraySub, 2) -1
    $sHeaderLV &= 'Col ' & $j & ' | '
    Next
    $sHeaderLV = StringTrimRight($sHeaderLV, 2)
    Else
    $ub2nd = False
    EndIf
    Local $hSubLV = GUICtrlCreateListView($sHeaderLV, 0, 0, 640, 480, Default, 0x00000001)
    For $i = 0 To UBound($avArraySub) -1
    $sItemText = '[' & $i & ']' & '|'
    If $ub2nd Then
    For $j = 0 To UBound($avArraySub, 2) -1
    $sItemText &= $avArraySub[$i][$j] & '|'
    Next
    $sItemText = StringTrimRight($sItemText, 1)
    Else
    $sItemText &= $avArraySub[$i]
    EndIf
    GUICtrlCreateListViewItem($sItemText, $hSubLV)
    Next
    GUISetState(@SW_SHOW, $hSubGUI)
    EndIf
    EndSwitch
    EndSwitch
    Return 'GUI_RUNDEFMSG'
    EndFunc ;==>WM_DISPLAY_NOTIFY

    [/autoit]
    • Offizieller Beitrag

    So, nach langer Zeit mal wieder was Neues:

    _Array2DMinMax()
    - Ermittelt den Min- oder Maxwert in einem Array
    - Vergleich in einer oder allen Spalten
    - Rückgabe Array mit [Wert,Index]

    Werde es bei Gelegenheit in die Sammlung einfügen.

    Spoiler anzeigen
    [autoit]

    ;==================================================================================================
    ; Function Name: _Array2DMinMax(ByRef $ARRAY [, $MAX=0 [, $iCol=0 [, $sDelim=';']]])
    ; Description:: gibt den minimalen od. maximalen Wert eines 1D/2D-Array zurück
    ; Überprüfung einer oder aller Spalten
    ; Parameter(s): $ARRAY das zu prüfende Array
    ; $MAX 0 = Minwert (Standard); 1 = Maxwert
    ; $iCol SpaltenIndex 0 = Standard
    ; -1 = alle Spalten werden geprüft
    ; $sDelim Trennzeichen f. Indexwerte, Standard ';'
    ; mit 'Default' Zeichen von Opt('GUIDataSeparatorChar')
    ; Return Value(s): Erfolg Array[0] = Max/Min-Wert; Array[1] = Index(Zeile [, Spalte])
    ; Fehler -1 @error = 1 kein Array übergeben
    ; @error = 2 $iCol überschreitet UBound,2
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _Array2DMinMax(ByRef $ARRAY, $MAX=0, $iCol=0, $sDelim=';')
    If Not IsArray($ARRAY) Then Return SetError(1,0,-1)
    Local $Ub2nd = UBound($ARRAY, 2)-1, $arOut[2] = [0]
    If $MAX <> 0 Then $MAX = 1
    If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
    If @error Then
    For $i = 0 To UBound($ARRAY) -1
    If $MAX = 1 Then
    If Number($ARRAY[$i]) > $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i])
    $arOut[1] = $i
    EndIf
    Else
    If $i = 0 Then
    $arOut[0] = Number($ARRAY[$i])
    $arOut[1] = $i
    EndIf
    If Number($ARRAY[$i]) < $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i])
    $arOut[1] = $i
    EndIf
    EndIf
    Next
    Else
    If $iCol > $Ub2nd Then Return SetError(2,0,-1)
    If $iCol < -1 Then $iCol = -1
    If $iCol = -1 Then
    For $i = 0 To UBound($ARRAY) -1
    For $k = 0 To $Ub2nd
    If $MAX = 1 Then
    If Number($ARRAY[$i][$k]) > $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i][$k])
    $arOut[1] = $i & $sDelim & $k
    EndIf
    Else
    If $i = 0 Then
    $arOut[0] = Number($ARRAY[$i][$k])
    $arOut[1] = $i & $sDelim & $k
    EndIf
    If Number($ARRAY[$i][$k]) < $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i][$k])
    $arOut[1] = $i & $sDelim & $k
    EndIf
    EndIf
    Next
    Next
    Else
    For $i = 0 To UBound($ARRAY) -1
    If $MAX = 1 Then
    If Number($ARRAY[$i][$iCol]) > $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i][$iCol])
    $arOut[1] = $i & $sDelim & $iCol
    EndIf
    Else
    If $i = 0 Then
    $arOut[0] = Number($ARRAY[$i][$iCol])
    $arOut[1] = $i & $sDelim & $iCol
    EndIf
    If Number($ARRAY[$i][$iCol]) < $arOut[0] Then
    $arOut[0] = Number($ARRAY[$i][$iCol])
    $arOut[1] = $i & $sDelim & $iCol
    EndIf
    EndIf
    Next
    EndIf
    EndIf
    Return $arOut
    EndFunc ;==>_Array2DMinMax

    [/autoit]
  • Hi BugFix,
    ich muß deinen Thread nochmal ausgraben :P

    Ich habe versucht deine Funktion "_Array2DSortFree" zu verwenden.
    Leider funktioniert diese nicht.
    Vermute, dass es an AutoIt 3.3.0.0 liegt.

    Zum einen mußte ich

    [autoit]

    #include <SQLite.au3>

    [/autoit]


    in die UDF einfügen.


    Bei diesem Beispiel

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <_Array2DSortFree.au3>

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

    Local $a[10][4] = [ _
    [18,4,6,3], _
    [11,5,6,3], _
    [11,6,7,3], _
    [14,4,4,2], _
    [11,5,6,1], _
    [18,4,8,1], _
    [14,3,4,4], _
    [11,5,7,2], _
    [14,4,4,1], _
    [18,4,6,2]]

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

    _ArrayDisplay($a, 'vorher')
    _Array2DSortFree($a, '0|0,3|1')
    _ArrayDisplay($a, 'Array sortiert, Spalte 0 ASC und innerhalb dann Spalte 3 DESC')

    [/autoit]


    wird nichts sortiert.

    Kannst du es dir bitte mal anschauen?
    Danke

    • Offizieller Beitrag

    Vermute, dass es an AutoIt 3.3.0.0 liegt.


    Das scheint wohl der Fall zu sein :(

    Zitat von Changelog 3.2.12.1 ==&gt; 3.3.0.0

    Changed: _SQLite -> 3.6.7


    Wie es aussieht treten nun Fehler auf. Wenn ich alle SQL-Befehle, die innerhalb meiner Funktion generiert werden, in SQLite-Admin ausführe, funktioniert es tadellos. Jedoch innerhalb von AutoIt wird die Abfrage ( SELECT * FROM tblTEST ORDER BY ABS(field0) ASC,ABS(field3) DESC; ) mit einem SQL-Error abgebrochen.

    Unabhängig davon hattest du aber vergessen den Parameter $NUM zu übergeben, auch wenn das bei der vorliegenden Zahlenauswahl diesmal keinen Einfluß hätte.

    Naja, im Moment habe ich keine Idee, wie sich das lösen läßt. :S

    • Offizieller Beitrag

    So, habe den Fehler entdeckt: _SQLite_Query() ist fehlerhaft. Habe nun mit _SQLite_GetTable2d ersetzt - tutti paletti.
    Nachteil: Nun ist es wieder etwas langsamer, denn Query ist die schnellste Funktion beim Auswerten.
    Korrigierte Version hier.

    Hat evtl. noch jemand die Prod 3.2.12.1 auf dem Rechner? Falls ja, könntet ihr mir bitte die SQLite.au3 dieser Version senden?
    Ich würde schon gern herausfinden, warum diese plötzlich verbugt ist.

  • Ich finde keinen Unterschied ...
    Und 3.2.12.1 gibt es noch im Archiv

    3.2.12.1
    [autoit]

    ;===============================================================================
    ;
    ; Function Name: _SQlite_Query()
    ; Description: Prepares a SQLite Query
    ; Parameter(s): $hDB - An Open Database, Use -1 To use Last Opened Database
    ; $sSQL - SQL Statement to be executed
    ; ByRef $hQuery - Passes out a Query Handle
    ; Return Value(s): On Success - Returns $SQLITE_OK
    ; On Failure - Return Value can be compared against $SQLITE_* Constants
    ; @error Value(s): -1 - SQLite Reported an Error (Check Return value)
    ; 1 - Error Calling SQLite API 'sqlite3_prepare_v2'
    ; 2 - Call prevented by SafeMode
    ; Author(s): piccaso (Fida Florian)
    ;
    ;===============================================================================
    ;
    Func _SQlite_Query($hDB, $sSQL, ByRef $hQuery)
    If Not __SQLite_hChk($hDB, $SQLITE_DBHANDLE) = $SQLITE_OK Then Return SetError(2, 0, $SQLITE_MISUSE)
    Local $iRval
    $iRval = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_prepare_v2", _
    "ptr", $hDB, _
    "str", $sSQL, _
    "int", StringLen($sSQL), _
    "long*", 0, _
    "long*", 0)
    If @error > 0 Then
    Return SetError(1, 0, $SQLITE_MISUSE)
    ElseIf $iRval[0] = $SQLITE_OK Then
    $hQuery = $iRval[4]
    __SQLite_hAdd($iRval[4], $SQLITE_QUERYHANDLE)
    Return $iRval[0]
    Else
    __SQLite_ReportError($hDB, "_SQLite_Query", $sSQL)
    Return SetError(-1, 0, $iRval[0])
    EndIf
    EndFunc ;==>_SQlite_Query

    [/autoit]
  • _Array2DAdd()
    fügt einen Eintrag einem 1D/2D-Array am Ende hinzu
    Spaltenwerte in 2D-Arrays sind durch '|' zu trennen

    Super Library, danke BugFix!


    Aus meiner Erfahrung bei deren Einsatz stammen diese 2 Vorschläge:
    a) als erste Zeile einfügen:

    [autoit]

    #include-once

    [/autoit]

    b) die Funktionssignatur für _Array2DAdd und _Array2DInsert um einen weiteren optionalen Parameter ergänzen:

    [autoit]

    Func _Array2DAdd(ByRef $avArray, $sValue='', $p_separator='|')
    Func _Array2DInsert(ByRef $avArray, $iElement, $sValue='', $p_separator='|')

    [/autoit]


    und die in diesen Funktionen enthaltenen StringSplit()-Aufrufe ändern von

    [autoit]

    $arValue = StringSplit($sValue, '|')

    [/autoit]

    zu

    [autoit]

    $arValue = StringSplit($sValue, $p_separator, 1)

    [/autoit]


    Dadurch können auch Parameterstrings, welche die vertikale Linie als gültigen Bestandteil haben, verwendet werden,
    z.Bsp. kann so mit diesem Aufruf

    [autoit]

    _Array2DAdd($array, "Wert der Spalte 1^Wert|Inhalt der Spalte 2", "^")

    [/autoit]

    eine Reihe mit den 2 Spaltenwerten "Wert der Spalte 1" und "Wert|Inhalt der Spalte 2" zu $array hinzugefügt werden

    Einmal editiert, zuletzt von onderhold (14. September 2009 um 18:39)

  • Hi BugFix,
    kannst du deine

    [autoit]

    _Array2DSortFree

    [/autoit]


    noch um einen optionalen Parameter erweitern?
    Er wäre super, wenn man den Index des Beginns des Sortierens (meistens ja 1 und nicht 0) selbst wählen könnte.

  • Ich habe versucht deine Funktion "_Array2DSortFree" zu verwenden.

    Hi BugFix,

    verzeiht, dass ich diesen Thread wieder ausgraben...

    Bei mir funktioniert _Array2DSortFree() leider auch nicht, bekomme aber auch keine Fehlermeldung (@error = 0).

    Ich habe das Beispiel hier aus diesem Thread genommen. Die erste Spalte wird sortiert, der Rest nicht.

    Wenn du da bitte noch mal eine Bick drauf werfen würdest, wäre ich dir dankbar.

    Momentan benutze ich noch die AutoItVersion: 3.3.10.2, möchte aber die Tage ein Update machen, sobald ich mir sicher bin, worauf ich dabei achten muss, damit meine persönlichen Einstellungen nicht verloren gehen.

    Deweiteren sind mir in der _Array2DSortFree 3.3.0.0 und ArrayMore.au3 v 0.4 noch ein paar Dinge aufgefallen...

    _Array2DSortFree()

    [autoit]

    Local $aOut[UBound($ARRAY)][$ub2nd]

    [/autoit]


    Find: $aOut
    Count: 1 match
    $aOut wird an keiner Stelle weiter verwendet...


    ArrayMore.au3

    [autoit]

    _ArraySortDblDel()

    [/autoit]


    Find: _ArraySortDblDel .........Count: 1 match
    ...ist nur im Header als Kommentar zu finden

    [autoit]

    _SubArrayGetEntry()

    [/autoit]


    Find: _SubArrayGetEntry ........Count: 1 match
    ...ist nur im Header als Kommentar zu finden ...soll wohl _SubArray2DGetEntry() heißen?

    [autoit]

    _SubArraySetEntry()

    [/autoit]


    Find: _SubArraySetEntry ........Count: 1 match
    ...ist nur im Header als Kommentar zu finden ...soll wohl _SubArray2DSetEntry() heißen?

    • Offizieller Beitrag

    Bei mir funktioniert _Array2DSortFree() leider auch nicht, bekomme aber auch keine Fehlermeldung (@error = 0).


    OK, schaue es mir die Tage mal an.
    Was die anderen angesprochenen Punkte angeht: Ich hatte damals viele Versionen getestet, kann also sein, dass einige Variablen dabei "auf der Strecke blieben" und ich einfach vergaß sie zu löschen. Die anderen Sachen waren Änderungen in der Namensgebung, die ich zwar in den Funktionen ausgeführt - in der Beschreibung aber vergessen hatte. ;)

  • Durch die AutoIt Version 3.3.12.0 sind meine ich folgende Funktionen überflüssig

    _Array2DAdd: Ersatz _ArrayAdd
    _Array2DInsert Ersatz _ArrayInsert
    _Array2DDelete Ersatz _ArrayDelete
    _Array2DSearch Ersatz _ArraySearch (Ergebnis 1 oder 0)
    _Array2DMirror Ersatz _ArrayTranspose
    _ArraySort_2ary Ersatz _ArraySort (in arraymore.au3 wird es noch anderweitig verwendet)

  • Schön ...
    Wobei ich auch gleich von der 3.3.8.1 auf die 3.3.12.0 gewechselt habe.

    Vielleicht kannst du es wenigstens im Startpost ergänzen als Info.

  • Edit 30.12.2013
    Bugs in _Array2DEmptyDel() und _Array2DDblDel() beseitigt. Aktuelle Version: v 0.4

    EDIT 25.07.07
    Es ist doch einiges hinzugekommen, bzw. wurden die Funktionen, die bisher nur mit 1D-Arrays arbeiteten (oder Dim 2 begrenzt auf 2) erweitert auf 2D ohne Begrenzung.

    Lange ist es her ...

    Ich habe die ArrayMore.au3 heute eingebunden (voher neu runtergeladen) und stoße bei der Überprüfung mit ISN auf folgende Fehlermeldung:

    Liegt der Fehler in der Prüfroutine oder in der au3?

    Magst Du noch mal in den Code schauen?