Hallo. Ich möchte ein Array erstellen welches mehr Einträge beinhaltet als es bisher vorgesehen ist. Derzeitige Größe ~3.000.000. Ist das irgendwie machbar?
Arraylimit von 65.530 übersteigen
-
- [ offen ]
-
Scritch -
14. August 2012 um 12:25 -
Geschlossen -
Erledigt
-
-
oO Wofür denn das?
-
Per Struct ist das sicherlich möglich.
Was brauchst du denn alles an Funktionalität ? -
Wo hast du denn diese Grenze von 65530 her?
[autoit]
Es ist bei mir problemlos möglich 3.000.000 Array-Elemente zu erstellen und auch zu nutzen:Global $a_Test[3000000]
[/autoit][autoit][/autoit][autoit][/autoit][autoit]$a_Test[2999999] = "Test"
[/autoit]
ConsoleWrite($a_Test[2999999] & @CRLF) -
Das dürfte das Limit von _Arraydisplay sein?
Ein Array kann in Autoit 2^24 Elemente haben.
Ab einer gewissen Anzahl wird es dann auch schwierig mit _Arraydisplay zu arbeiten. -
Wo hast du denn diese Grenze von 65530 her?
[autoit]
Es ist bei mir problemlos möglich 3.000.000 Array-Elemente zu erstellen und auch zu nutzen:Global $a_Test[3000000]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$a_Test[2999999] = "Test"
[/autoit]
ConsoleWrite($a_Test[2999999] & @CRLF)Du hast Recht, das Anzeigen von Elementen aus Spalten jenseits der 65.530 funktioniert. Scheint wirklich die max. Grenze von _ArrayDisplay sein unter einem 32Bit OS.
-
Hatte das ganze bei mit unter Vista 64bit aber auch als 32bit Anwendung erfolgeich getestet, also vllt eher ein Limit von XP bzgl. Listviews?
Letzten Endes für dein vorhaben aber irrelevant, denn es ist ja nicht notwendig die komplette Registry per arraydisplay darzustellen, es langt ja die unterschiede beider Arrays zu ermitteln und anzuzeigen. -
Die maximale Anzahl an Controls ist bei AutoIt auf 65.535 beschränkt.
Es hat also nicht direkt etwas mit _ArrayDisplay zu tun.Notfalls kann man dafür eine Anzeige mit GDI+ basteln.
-
Ein Array in Autoit unterstützt Zitat:
"Arrays: Ein Maximum von 64 Dimensionen und/oder ein Maximum von 16 Millionen Elementen"
-
Hatte das ganze bei mit unter Vista 64bit aber auch als 32bit Anwendung erfolgeich getestet, also vllt eher ein Limit von XP bzgl. Listviews?
Letzten Endes für dein vorhaben aber irrelevant, denn es ist ja nicht notwendig die komplette Registry per arraydisplay darzustellen, es langt ja die unterschiede beider Arrays zu ermitteln und anzuzeigen.
Da hast du Recht, für mein Projekt irrelevant _ArrayDisplay ist aber für die Kontrolle bisher trotzdem immer ganz nett gewesen. -
Bei _ArrayDisplay greift folgendes AutoIt-Limit:
GUI_MAXCONTROLS 65532 Maximum number of controls in GUI box.
Man kann in einer Anwendung einfach nicht mehr als 65532 Controls erzeugen.
Aber man könnte _ArrayDisplay umbauen, damit es mit der GuiListView-UDF läuft, dann greift diese Grenze nicht mehr, da dann keine 'Controls' für jedes Item erstellt werden. -
Also bei mir zeigt arraydisplay durchaus mehr als 65k Zeilen Große Listviews an. Wenn das controllimit hier greifen sollte muss das Betriebssystemabhängig unterschiedlich hoch sein.
-
Bei mir können maximal 65531 Elemente angezeigt werden (WinXP x86). Ein Control ist ja die ListView selbst. Vielleicht ist das Limit in einer der letzten Beta-Versionen angehoben worden, die du vielleicht benutzt. Oder es hängt wirklich vom Betriebssystem ab, was ich mir aber eigentlich nicht vorstellen kann. Es könnte aber auch die x64-Version von AutoIt andere Limits verwenden!?
-
Nope keine Beta, noch nichtmal die aktuellste stable Version. Ich verwende hier noch 3.3.6.1
Mit 32/64bit kann es eigentlich auch nicht zusammenhängen, denn ich habe in meinem Testscript ja sogar den 32bit Interpreter erzwungen. -
Komisch in der Beta 3.3.9.1 wurde sogar noch folgendes zur Dokumentation hinzugefügt.
Code- Added #2126: Documentation remark about _ArrayDisplay being able to display a maximum of 65530 items.
Demnach ist es und war es nicht möglich mehr als die angegebene Anzahl von Elementen darzustellen.Hm, komisch.
[autoit]
Hier noch ein kleines Skript, das meine Theorie unterstützen sollte.#include <Array.au3>
[/autoit][autoit][/autoit][autoit]Global $a[65531]
[/autoit][autoit][/autoit][autoit]
$a[UBound($a) -1] = "Test"_ArrayDisplay($a) ;letztes Element sichtbar
[/autoit][autoit][/autoit][autoit]GUICreate("Test")
[/autoit][autoit][/autoit][autoit]
GUICtrlCreateButton("Hallo", 10, 10)_ArrayDisplay($a) ;letztes Element nicht mehr sichtbar
[/autoit] -
Wie erwartet zeigt mir dein Script nachwievor alle Elemente an, selbst wenn ich die arraygröße auf 99999 erhöhe, was definitiv über dem control limit liegt. Im übrigen hab ich das zwischenzeitlich auch noch in meiner Windows 2003 R2 32bit VM getestet, auch hier werden alle listview Elemente angezeigt. Also entweder wurde die Funktion in den neueren Autoit Versionen tatsächlich verschlechtert oder das Limit bezieht sich ausschliesslich auf Windows XP 32bit.
-
Kaum zu glauben, aber der Fehler entsteht tatsächlich durch die überarbeitete Funktion arraydisplay aus den neuren Versionen. Hier ein Testscript, das sowohl die neue als auch die alte arraydisplay Funktion enthält. Bei der neueren Version erhalte ich auch nur noch ein 65k Listview. Das bestätigt mich mal wieder darin, dass neu nicht immer besser ist:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseX64=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <array.au3>Global $a[99999]
[/autoit] [autoit][/autoit] [autoit]
$a[UBound($a) -1] = "Test"$timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayOLD($a) ; 3.3.6.1
ConsoleWrite("OLD: " & TimerDiff($timer) & @CRLF)$timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayNEW($a) ; 3.3.8.1
ConsoleWrite("NEW: " & TimerDiff($timer) & @CRLF);aus Version 3.3.6.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayOLD(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
;~ If $sSeparator = "" Then $sSeparator = Chr(1)
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 64
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
$avArrayText[$i] &= $sSeparator & $vTmp; Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
$iBuffer += 1; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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 $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
[/autoit] [autoit][/autoit] [autoit]
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); Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
Local $aItem
For $i = 0 To $iUBound
If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
; use GUICtrlSendMsg() to overcome AutoIt limitation
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1]); Add listview item
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem); Set listview subitem text
[/autoit] [autoit][/autoit] [autoit]
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_SETITEMW, 0, $pItem)
Next
EndIf
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth)/2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ArrayDisplay; aus Version 3.3.8.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayNEW(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 4094 ; AutoIt max item size
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1); Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)$avArrayText[$i] &= $sSeparator & $vTmp
[/autoit] [autoit][/autoit] [autoit]
Next
Next; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
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; Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iUBound
GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit]
EndFunc ;==>_ArrayDisplayEDIT:
Dieser "Bug" wurde bereits vor 6 Monaten hier diskutiert: http://www.autoitscript.com/trac/autoit/ticket/2126
Unverständlich warum man das nicht längst wieder auf die alte Methode geändert hat und stattdessen mit der Limitierung leben will. -
Die alte Funktion, mit der das AutoIt-Limit übergangen wurde war fehlerhaft, wie im Trac 1833 beschrieben.
Wenn das Windows-Limit von 4094 Zeichen pro Eintrag überschritten wurde, dann wurde der String nicht abgeschnitten, sondern einfach nichts mehr angezeigt.
Das dürfte aber trotzdem irgendwie zu beheben sein, denke ich.Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]Dim $A [6][2] ; Array of strings, col 0 is only for documentation
[/autoit] [autoit][/autoit] [autoit]
; col 1 is the string
dim $s_long = "XXXXXXXXXX" ; build a very long string
$s_long = StringReplace($s_long,"X","XXXXXXXXXX") ; 100 bytes
$s_long = stringreplace($s_long,"X","XXXXXXXXXX") ;1,000 -,,-
$s_long = StringReplace($s_long,"X","XXXXX") ;5,000 -,,- long
$A[1][0] = 4093
$A[1][1] =stringleft($s_long,$A[1][0])
$A[2][0] = 4094
$A[2][1] =stringleft($s_long,$A[2][0])
$A[3][0] = 4095
$A[3][1] =stringleft($s_long,$A[3][0])
$A[4][0] = 4096
$A[4][1] =stringleft($s_long,$A[4][0])
$A[5][0] = 0
$A[5][1] = ""_ArrayDisplayOLD($A)
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayNEW($A)#cs
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Col 0 is the length of col 1 element
but with one-dimensional array hapens the same,
Col 0 is hopefuly helpful at display
#ce;aus Version 3.3.6.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayOLD(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
;~ If $sSeparator = "" Then $sSeparator = Chr(1)
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 64
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
$avArrayText[$i] &= $sSeparator & $vTmp; Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
$iBuffer += 1; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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 $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
[/autoit] [autoit][/autoit] [autoit]
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); Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
Local $aItem
For $i = 0 To $iUBound
If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
; use GUICtrlSendMsg() to overcome AutoIt limitation
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1]); Add listview item
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem); Set listview subitem text
[/autoit] [autoit][/autoit] [autoit]
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_SETITEMW, 0, $pItem)
Next
EndIf
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth)/2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ArrayDisplay; aus Version 3.3.8.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayNEW(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 4094 ; AutoIt max item size
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1); Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)$avArrayText[$i] &= $sSeparator & $vTmp
[/autoit] [autoit][/autoit] [autoit]
Next
Next; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
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; Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iUBound
GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit]
EndFunc ;==>_ArrayDisplay -
Man muss prinzipiell nur den fill listview Teil und die gui constants Codezeilen der alten Funktion in der neuen Funktion austauschen, dann funktioniert zum einen die Sache mit den langen Strings, als auch das Anzeigen von mehr als 65k Zeilen. Die neue Methode ist aber in der Tat deutlich flotter, nur was nutzt einem das, wenn die Hälfte des Arrays nicht angezeigt wird...
EDIT: Eigentlich ist die neue Methode nicht schneller, bei 65k Zeilen nehmen sich beide Funktionen sogut wie nichts, der Geschwindigkeitsvorteil wird im Prinzip nur durch die Limitierung erkauft.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>Dim $A [100000][2] ; Array of strings, col 0 is only for documentation
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; col 1 is the string
dim $s_long = "XXXXXXXXXX" ; build a very long string
$s_long = StringReplace($s_long,"X","XXXXXXXXXX") ; 100 bytes
$s_long = stringreplace($s_long,"X","XXXXXXXXXX") ;1,000 -,,-
$s_long = StringReplace($s_long,"X","XXXXX") ;5,000 -,,- long
$A[1][0] = 4093
$A[1][1] =stringleft($s_long,$A[1][0])
$A[2][0] = 4094
$A[2][1] =stringleft($s_long,$A[2][0])
$A[3][0] = 4095
$A[3][1] =stringleft($s_long,$A[3][0])
$A[4][0] = 4096
$A[4][1] =stringleft($s_long,$A[4][0])
$A[5][0] = 0
$A[5][1] = ""$timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayOLD($A)
ConsoleWrite("OLD: " & TimerDiff($timer) & @CRLF)$timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayNEW($A)
ConsoleWrite("NEW: " & TimerDiff($timer) & @CRLF)$timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplayNEW_fixed($A)
ConsoleWrite("NEW_fixed: " & TimerDiff($timer) & @CRLF)#cs
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Col 0 is the length of col 1 element
but with one-dimensional array hapens the same,
Col 0 is hopefuly helpful at display
#ce;aus Version 3.3.6.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayOLD(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
;~ If $sSeparator = "" Then $sSeparator = Chr(1)
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 64
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
$avArrayText[$i] &= $sSeparator & $vTmp; Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
$iBuffer += 1; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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 $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
[/autoit] [autoit][/autoit] [autoit]
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); Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
Local $aItem
For $i = 0 To $iUBound
If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
; use GUICtrlSendMsg() to overcome AutoIt limitation
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1]); Add listview item
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem); Set listview subitem text
[/autoit] [autoit][/autoit] [autoit]
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_SETITEMW, 0, $pItem)
Next
EndIf
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth)/2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ArrayDisplay; aus Version 3.3.8.1
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayNEW(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 4094 ; AutoIt max item size
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1); Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)$avArrayText[$i] &= $sSeparator & $vTmp
[/autoit] [autoit][/autoit] [autoit]
Next
Next; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
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; Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iUBound
GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ArrayDisplay; aus Version 3.3.8.1 mit alten codezeilen on "Fill listview" + "GUI constants"
[/autoit] [autoit][/autoit] [autoit]
Func _ArrayDisplayNEW_fixed(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; 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); Separator handling
[/autoit] [autoit][/autoit] [autoit]
If $sSeparator = "" Then $sSeparator = Chr(124); Check the separator to make sure it's not used literally in the array
[/autoit] [autoit][/autoit] [autoit]
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; Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $vTmp, $iBuffer = 4094 ; AutoIt max item size
Local $iColLimit = 250
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit; Set header up
[/autoit] [autoit][/autoit] [autoit]
If $sHeader = "" Then
$sHeader = "Row " ; blanks added to adjust column size for big number of rows
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next
EndIf; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
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; Add to text array
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1); Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
If StringLen($vTmp) > $iBuffer Then $vTmp = StringLeft($vTmp, $iBuffer)$avArrayText[$i] &= $sSeparator & $vTmp
[/autoit] [autoit][/autoit] [autoit]
Next
Next; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
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 $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
[/autoit] [autoit][/autoit] [autoit]
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); Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $iWidth = 640, $iHeight = 480
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
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); Fill listview
[/autoit] [autoit][/autoit] [autoit]
Local $aItem
For $i = 0 To $iUBound
If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
; use GUICtrlSendMsg() to overcome AutoIt limitation
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1]); Add listview item
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem); Set listview subitem text
[/autoit] [autoit][/autoit] [autoit]
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_SETITEMW, 0, $pItem)
Next
EndIf
Next; adjust window width
[/autoit] [autoit][/autoit] [autoit]
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
$iWidth += 20If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
[/autoit] [autoit][/autoit] [autoit]WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
[/autoit] [autoit][/autoit] [autoit]; Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
ExitLoopCase $hCopy
[/autoit] [autoit][/autoit] [autoit]
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
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; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
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)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit]
EndFunc ;==>_ArrayDisplay -
- Offizieller Beitrag
Nun, ich finde ~65.000 Elemente im Listview völlig ausreichend.
Ich persönlich verwende _ArrayDisplay nur bei kleinen Arrays. Sind es große Mengen an Einträgen gebe ich das lieber in die Konsole aus. -