Hi Leute!
Ich Spiele zur zeit mit 3 Dimension Array´s wie oft auch schon angsprochen kann man die Daten nur umstäntlich Kontrolieren, ich habe dafür eine lösung wobei ich den mitgelieferten _ArrayDisplay integriert habe wenn 1D o. 2D übergeben werden.
Ich habe schon gesehen das es viele lösungen mit TreeView gibt nur finde ich die lösungen nicht übersichtlich.
Update: Habe den 'Copy Selected' Button hinzugefügt!
Update2: Nochmasl überarbeitet, keine weiterleitung mehr an das Integrierte ArrayDisplay, Es werden jetzt 1D 2D 3D u. Array in Array unterstützt.
BugFix ich habe dein _ArrayMultiDisplay umgeschrieben das, alle unsere Funktionen unter einem dach sind, den Namen habe ich beibehalten.
Beispiel:
Spoiler anzeigen
#AutoIt3Wrapper_UseX64=n
#include <_ArrayMultiDisplay.au3>
Dim $max = 10
Dim $aArray[$max][7][7]
Dim $aArray_[$max][10]
Dim $aArray1[$max]
Dim $aArray__[$max]
Local $iDimensio = UBound($aArray, 0), $iUBoun = UBound($aArray, 1) - 1, $iSubMa = UBound($aArray, 2) - 1
For $iUB = 0 To $iUBoun
$aArray1[$iUB] = Chr(Random(65, 90, 1)) & Chr(Random(65, 68, 1))
Next
For $iUB = 0 To $iUBoun
$aArray[$iUB][0][0] = $aArray1
$aArray[$iUB][1][0] = 'Spalte 2'
$aArray[$iUB][2][0] = Chr(Random(65, 90, 1)) & Chr(Random(65, 80, 1))
$aArray[$iUB][0][1] = $iUB + $aArray[$iUB][0][0]
$aArray[$iUB][1][3] = $aArray1
$aArray[$iUB][6][4] = Chr(Random(65, 90, 1)) & Chr(Random(65, 68, 1))
Next
_ArrayMultiDisplay($aArray, '3D Array Display')
For $iUB = 0 To $iUBoun
$aArray_[$iUB][0] = $iUB + $iUB
$aArray_[$iUB][1] = 'Spalte 2'
$aArray_[$iUB][2] = Chr(Random(65, 90, 1)) & Chr(Random(65, 80, 1))
$aArray_[$iUB][3] = $iUB + $aArray_[$iUB][0]
$aArray_[$iUB][4] = $aArray1
$aArray_[$iUB][5] = Chr(Random(65, 90, 1)) & Chr(Random(65, 68, 1))
Next
_ArrayMultiDisplay($aArray_, '2D Array Display')
$aArray__[0] = $aArray1
For $iUB = 1 To $iUBoun
$aArray__[$iUB] = Chr(Random(65, 90, 1)) & Chr(Random(65, 80, 1))
Next
_ArrayMultiDisplay($aArray__, '1D Array Display')
_ArrayDisplay3D: New _ArrayMultiDisplay
Spoiler anzeigen
#include-once
#include <Array.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayMultiDisplay
; Description ...: Displays given 1D or 2D or 3D u. bei 2D Array ( Array in Array )array in a listview.
; Array elements, which is itself a 1D/2D-Array to be, as "[sub-array]" marked and can be displayed mouse button by Right.
; Syntax.........: _ArrayDisplay(Const ByRef $avArray[, $sTitle = "Array: ListView Display"[, $iItemLimit = -1[, $iTranspose = 0[, $sSeparator = ""[, $sReplace = "|"[, $sHeader = ""]]]]]])
; Parameters ....: $avArray - Array to display
; $sTitle - [optional] Title to use for window
; $iItemLimit - [optional] Maximum number of listview items (rows) to show
; $iTranspose - [optional] If set differently than default, will transpose the array if 2D
; $sSeparator - [optional] Change Opt("GUIDataSeparatorChar") on-the-fly
; $sReplace - [optional] String to replace any occurrence of $sSeparator with in each array element
; $sheader - [optional] Header column names
; Return values .: Success - 1
; Failure - 0, sets @error:
; |1 - $avArray is not an array
; |2 - $avArray has too many dimensions (only up to 3D supported)
; Author ........: randallc, Ultima, BugFix, Kleiner
; Modified.......: Gary Frost (gafrost), Ultima, Zedna, jpm, BugFix, Kleiner
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _ArrayMultiDisplay(Const ByRef $avArray, $sTitle = 'Array: ListView Display', $iItemLimit = -1, $iTranspose = 0, $sSeparator = '', $sReplace = '|', $sHeader = '')
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
Global $avArrayMultiDisplay = $avArray
Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1, $3DiUB = UBound($avArray, 3)
If ($iDimension > 3) Then Return SetError(2, 0, 0)
If ($sSeparator = '') Then $sSeparator = Chr(124)
If _ArraySearch($avArray, $sSeparator, 0, 0, 0, 1) <> -1 Then
For $x = 1 To 255
If $x >= 32 And $x <= 127 Then ContinueLoop
Local $sFind = _ArraySearch($avArray, Chr($x), 0, 0, 0, 1)
If $sFind = -1 Then
$sSeparator = Chr($x)
ExitLoop
EndIf
Next
EndIf
Local $vTmp, $iBuffer = 64
Local $iColLimit = 250, $iLVIAddUDFThreshold = 4000
Local $iOnEventMode = Opt('GUIOnEventMode', 0), $sDataSeparatorChar = Opt('GUIDataSeparatorChar', $sSeparator)
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit
If $iLVIAddUDFThreshold > $iUBound Then $iLVIAddUDFThreshold = $iUBound
If ($sHeader = '') Then
$sHeader = 'Row '
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & 'Col ' & $i
Next
EndIf
If Not $3DiUB Then $3DiUB = 1
Local $Sub = False
Local $avArrayText[$iUBound + 1][$3DiUB]
For $3D = 0 To $3DiUB - 1
For $i = 0 To $iUBound
$avArrayText[$i][$3D] = '[' & $i & ']'
For $j = 0 To $iSubMax
If ($iDimension = 1) Then
If $iTranspose Then
$vTmp = $avArray[$j]
Else
$vTmp = $avArray[$i]
EndIf
Else
If ($iDimension = 3) Then
If $iTranspose Then
$vTmp = $avArray[$j][$i][$3D]
Else
$vTmp = $avArray[$i][$j][$3D]
EndIf
Else
If $iTranspose Then
$vTmp = $avArray[$j][$i]
Else
$vTmp = $avArray[$i][$j]
EndIf
EndIf
EndIf
If IsArray($vTmp) Then
$vTmp = '[SubArray]'
$Sub = True
Else
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
EndIf
$avArrayText[$i][$3D] &= $sSeparator & $vTmp
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
Next
$iBuffer += 1
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_INSERTITEMW = (0x1000 + 77)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
Local Const $_ARRAYCONSTANT_LVM_SETITEMW = (0x1000 + 76)
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_TCM_GETCURSEL = (0x1300 + 11)
Local Const $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG = 0x00100000
Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
Local $tBuffer = DllStructCreate('wchar 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)
Local $hListView[$3DiUB]
Local $iWidth = 640, $iHeight = 480
Global $hArrayDisplayListView[$3DiUB]
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Global $hArrayDisplayGUI = $hGUI
Local $Tab = GUICtrlCreateTab(Default, Default, $aiGUISize[0] + 2, $aiGUISize[1] - 48)
Local $hCopy = GUICtrlCreateButton('Copy Selected', 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
If $3DiUB > 1 Then
For $i = 0 To $3DiUB - 1
GUICtrlCreateTabItem('D' & $i)
$hListView[$i] = GUICtrlCreateListView($sHeader, 0, 22, $aiGUISize[0], $aiGUISize[1] - 48, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
GUICtrlSetResizing($hListView[$i], $_ARRAYCONSTANT_GUI_DOCKBORDERS)
$hArrayDisplayListView[$i] = $hListView[$i]
Next
Else
$hListView[0] = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
GUICtrlSetResizing($hListView[0], $_ARRAYCONSTANT_GUI_DOCKBORDERS)
$hArrayDisplayListView[0] = $hListView[0]
EndIf
GUICtrlSetResizing($Tab, $GUI_DOCKTOP + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM)
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)
Local $aItem
For $i = 0 To $iUBound
If ($3DiUB > 1) Then
For $3D = 0 To $3DiUB - 1
If GUICtrlCreateListViewItem($avArrayText[$i][$3D], $hListView[$3D]) = 0 Then
$aItem = StringSplit($avArrayText[$i][$3D], $sSeparator)
DllStructSetData($tBuffer, 'Text', $aItem[1])
DllStructSetData($tItem, 'Item', $i)
DllStructSetData($tItem, 'SubItem', 0)
DllStructSetData($tItem, 'Mask', $iAddMask)
GUICtrlSendMsg($hListView[$i], $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem)
DllStructSetData($tItem, 'Mask', $_ARRAYCONSTANT_LVIF_TEXT)
For $j = 2 To $aItem[0]
DllStructSetData($tBuffer, 'Text', $aItem[$j])
DllStructSetData($tItem, 'SubItem', $j - 1)
GUICtrlSendMsg($hListView[$i], $_ARRAYCONSTANT_LVM_SETITEMW, 0, $pItem)
Next
EndIf
Next
Else
If GUICtrlCreateListViewItem($avArrayText[$i][0], $hListView[0]) = 0 Then
$aItem = StringSplit($avArrayText[$i][0], $sSeparator)
DllStructSetData($tBuffer, 'Text', $aItem[1])
DllStructSetData($tItem, 'Item', $i)
DllStructSetData($tItem, 'SubItem', 0)
DllStructSetData($tItem, 'Mask', $iAddMask)
GUICtrlSendMsg($hListView[0], $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem)
DllStructSetData($tItem, 'Mask', $_ARRAYCONSTANT_LVIF_TEXT)
For $j = 2 To $aItem[0]
DllStructSetData($tBuffer, 'Text', $aItem[$j])
DllStructSetData($tItem, 'SubItem', $j - 1)
GUICtrlSendMsg($hListView[0], $_ARRAYCONSTANT_LVM_SETITEMW, 0, $pItem)
Next
EndIf
EndIf
Next
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView[0], $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20
If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
WinMove($hGUI, '', (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
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 = ''
Local $aiCurItems[1] = [0]
Local $HWnd = GUICtrlSendMsg($Tab, $_ARRAYCONSTANT_TCM_GETCURSEL, 0, 0)
If (Not $HWnd) Or ($HWnd = -1) Then $HWnd = 0
For $i = 0 To GUICtrlSendMsg($hListView[$HWnd], $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
If GUICtrlSendMsg($hListView[$HWnd], $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
$aiCurItems[0] += 1
ReDim $aiCurItems[$aiCurItems[0] + 1]
$aiCurItems[$aiCurItems[0]] = $i
EndIf
Next
If Not $aiCurItems[0] Then
For $sItem = 0 To UBound($avArrayText) - 1
$sClip &= $avArrayText[$sItem][$HWnd] & @CRLF
ConsoleWrite('1Array lauf : ' & $sClip & @CRLF)
Next
Else
For $i = 1 To UBound($aiCurItems) - 1
$sClip &= $avArrayText[$aiCurItems[$i]][$HWnd] & @CRLF
ConsoleWrite('2Array lauf : ' & $sClip & @CRLF)
Next
EndIf
ClipPut($sClip)
EndSwitch
WEnd
GUIDelete($hGUI)
Opt('GUIOnEventMode', $iOnEventMode)
Opt('GUIDataSeparatorChar', $sDataSeparatorChar)
Return 1
EndFunc ;==>_ArrayMultiDisplay
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, $lwHw
Local Const $USEtagNMHDR = 'hwnd hWndFrom;int IDFrom;int Code'
Local Const $USEtagNMITEMACTIVATE = '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($USEtagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
$iIDFrom = DllStructGetData($tNMHDR, 'IDFrom')
$iCode = DllStructGetData($tNMHDR, 'Code')
For $i = 0 To UBound($hArrayDisplayListView) - 1
If ($hWndFrom = GUICtrlGetHandle($hArrayDisplayListView[$i])) Then
$hWndListView = GUICtrlGetHandle($hArrayDisplayListView[$i])
$lwHw = $i
ExitLoop
EndIf
Next
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case -5
Local $tInfo = DllStructCreate($USEtagNMITEMACTIVATE, $ilParam)
Local $ItemIndex = DllStructGetData($tInfo, 'Index'), $SubIndex = DllStructGetData($tInfo, 'SubItem')
If _GUICtrlListView_GetItemText($hWndListView, $ItemIndex, $SubIndex) = '[SubArray]' Then
If Not IsArray($avArrayMultiDisplay) Then Return 0
Local $avArraySub
If (UBound($avArrayMultiDisplay, 0) = 3) Then
$avArraySub = $avArrayMultiDisplay[$ItemIndex][$SubIndex - 1][$lwHw]
ElseIf (UBound($avArrayMultiDisplay, 0) = 2) Then
$avArraySub = $avArrayMultiDisplay[$ItemIndex][$SubIndex - 1]
Else
$avArraySub = $avArrayMultiDisplay[$ItemIndex]
EndIf
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
LG Kleiner