| 1 | #include-Once | 
|---|
| 2 | ; #INDEX# ======================================================================================================================= | 
|---|
| 3 | ; Title .........: Array | 
|---|
| 4 | ; AutoIt Version : 3.2.10++ | 
|---|
| 5 | ; Language ......: English | 
|---|
| 6 | ; Description ...: Functions for manipulating arrays. | 
|---|
| 7 | ; Author(s) .....: JdeB, Erik Pilsits, Ultima, Dale (Klaatu) Thompson, Cephas,randallc, Gary Frost, GEOSoft, | 
|---|
| 8 | ;                  Helias Gerassimou(hgeras), Brian Keene, SolidSnake, gcriaco, LazyCoder, Tylo, David Nuttall, | 
|---|
| 9 | ;                  Adam Moore (redndahead), SmOke_N, litlmike, Valik | 
|---|
| 10 | ; =============================================================================================================================== | 
|---|
| 11 | ; #NO_DOC_FUNCTION# ============================================================================================================= | 
|---|
| 12 | ; Not documented - function(s) no longer needed, will be worked out of the file at a later date | 
|---|
| 13 | ; | 
|---|
| 14 | ;_ArrayCreate | 
|---|
| 15 | ; =============================================================================================================================== | 
|---|
| 16 | ; #CURRENT# ===================================================================================================================== | 
|---|
| 17 | ;_ArrayAdd * | 
|---|
| 18 | ;_ArrayBinarySearch * | 
|---|
| 19 | ;_ArrayCombinations | 
|---|
| 20 | ;_ArrayConcatenate * | 
|---|
| 21 | ;_ArrayDelete | 
|---|
| 22 | ;_ArrayDisplay * | 
|---|
| 23 | ;_ArrayFindAll | 
|---|
| 24 | ;_ArrayInsert * | 
|---|
| 25 | ;_ArrayMax * | 
|---|
| 26 | ;_ArrayMaxIndex | 
|---|
| 27 | ;_ArrayMin * | 
|---|
| 28 | ;_ArrayMinIndex | 
|---|
| 29 | ;_ArrayPermute | 
|---|
| 30 | ;_ArrayPop * | 
|---|
| 31 | ;_ArrayPush * | 
|---|
| 32 | ;_ArrayReverse * | 
|---|
| 33 | ;_ArraySearch | 
|---|
| 34 | ;_ArraySort | 
|---|
| 35 | ;_ArraySwap | 
|---|
| 36 | ;_ArrayToClip * | 
|---|
| 37 | ;_ArrayToString * | 
|---|
| 38 | ;_ArrayTrim * | 
|---|
| 39 | ;_ArrayUnique (Corrected the header information) | 
|---|
| 40 | ; * - #MODIFIED FUNCTIONS# | 
|---|
| 41 | ; =============================================================================================================================== | 
|---|
| 42 | ; #NEW FUNCTIONS ADDED# ========================================================================================================= | 
|---|
| 43 | ;_ArrayAddColumns | 
|---|
| 44 | ;_ArrayDeleteColumn | 
|---|
| 45 | ;_ArrayMaxIndex2D | 
|---|
| 46 | ;_ArrayMinIndex2D | 
|---|
| 47 | ; =============================================================================================================================== | 
|---|
| 48 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 49 | ;__ArrayQuickSort1D | 
|---|
| 50 | ;__ArrayQuickSort2D | 
|---|
| 51 | ;__Array_ExeterInternal | 
|---|
| 52 | ;__Array_Combinations | 
|---|
| 53 | ;__Array_GetNext | 
|---|
| 54 | ; =============================================================================================================================== | 
|---|
| 55 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 56 | ; Name...........: _ArrayAdd | 
|---|
| 57 | ; Description ...: Adds a specified value at the end of an existing array. Also will add a delimited string to a 2D array. | 
|---|
| 58 | ; Syntax.........: _ArrayAdd(ByRef $avArray, $vValue) | 
|---|
| 59 | ; Parameters ....: $avArray - Array to modify | 
|---|
| 60 | ;                  $vValue  - Value to add | 
|---|
| 61 | ; Return values .: Success - Index of last added item | 
|---|
| 62 | ;                  Failure - -1, sets @error | 
|---|
| 63 | ;                  |1 - $avArray is not an array | 
|---|
| 64 | ;                  |2 - $avArray is not a 1 or 2 dimensional array | 
|---|
| 65 | ;                  |3 - $vValue has too many subitems | 
|---|
| 66 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com> | 
|---|
| 67 | ; Modified.......: Ultima - code cleanup, BrewManNH - 2D array support | 
|---|
| 68 | ; Remarks .......: | 
|---|
| 69 | ; Related .......: _ArrayConcatenate, _ArrayDelete, _ArrayInsert, _ArrayPop, _ArrayPush | 
|---|
| 70 | ; Link ..........: | 
|---|
| 71 | ; Example .......: Yes | 
|---|
| 72 | ; =============================================================================================================================== | 
|---|
| 73 | Func _ArrayAdd(ByRef $avArray, $vValue, $sSeparator = "|") | 
|---|
| 74 | If Not IsArray($avArray) Then Return SetError(1, 0, -1) | 
|---|
| 75 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, -1) | 
|---|
| 76 | Local $avValue = StringSplit($vValue, $sSeparator) | 
|---|
| 77 | If Not @error Then | 
|---|
| 78 | ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $avValue = ' & $avValue & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console | 
|---|
| 79 | $iSubMax = $avValue[0] | 
|---|
| 80 | If $iSubMax <> UBound($avArray, 2) Then Return SetError(3, 0, 0) | 
|---|
| 81 | EndIf | 
|---|
| 82 | If UBound($avArray, 0) = 1 Then | 
|---|
| 83 | Local $iUBound = UBound($avArray) | 
|---|
| 84 | ReDim $avArray[$iUBound + 1] | 
|---|
| 85 | $avArray[$iUBound] = $vValue | 
|---|
| 86 | Return $iUBound | 
|---|
| 87 | Else | 
|---|
| 88 | Local $iUBound = UBound($avArray) | 
|---|
| 89 | ReDim $avArray[$iUBound + 1][$iSubMax] | 
|---|
| 90 | For $i = 0 To $iSubMax - 1 | 
|---|
| 91 | $avArray[$iUBound][$i] = $avValue[$i + 1] | 
|---|
| 92 | Next | 
|---|
| 93 | Return $iUBound | 
|---|
| 94 | EndIf | 
|---|
| 95 | EndFunc   ;==>_ArrayAdd | 
|---|
| 96 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 97 | ; Name...........: _ArrayAddColumns | 
|---|
| 98 | ; Description ...: Adds a specified number of columns to an array. | 
|---|
| 99 | ; Syntax.........: _ArrayAddColumns(ByRef $aArrayIn, $NumColCount) | 
|---|
| 100 | ; Parameters ....: $aArrayIn - Array to modify | 
|---|
| 101 | ;                  $NumColCount  - Number of columns to add (default = 1) | 
|---|
| 102 | ; Return values .: Success - New array with columns added | 
|---|
| 103 | ;                  Failure - -1, sets @error | 
|---|
| 104 | ;                  |1 - $aArrayIn is not an array | 
|---|
| 105 | ;                  |2 - $NumColCount is an invalid number | 
|---|
| 106 | ;                  |3 - Array has too many dimensions (2D array max) | 
|---|
| 107 | ; Author ........: Malkey | 
|---|
| 108 | ; Remarks .......: This will add any number of columns to a 1D or 2D array of any size and preserves | 
|---|
| 109 | ;                  the contents of the array being modified | 
|---|
| 110 | ; Related .......: _ArrayConcatenate2D, _ArrayDelete, _ArrayInsert, _ArrayPop2D, _ArrayPush | 
|---|
| 111 | ; Link ..........: | 
|---|
| 112 | ; Example .......: Yes | 
|---|
| 113 | ; =============================================================================================================================== | 
|---|
| 114 | Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1) | 
|---|
| 115 | If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array | 
|---|
| 116 | If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column. | 
|---|
| 117 | If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array past this line. | 
|---|
| 118 | If UBound($aArr, 0) = 1 Then ; ====== For 1d array ======== | 
|---|
| 119 | Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array. | 
|---|
| 120 | For $R = 0 To UBound($aArr) - 1 | 
|---|
| 121 | $aRet[$R][0] = $aArr[$R] | 
|---|
| 122 | Next | 
|---|
| 123 | Else ; ======= For 2d array ============ | 
|---|
| 124 | Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function. | 
|---|
| 125 | ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only. | 
|---|
| 126 | EndIf | 
|---|
| 127 | Return $aRet | 
|---|
| 128 | EndFunc   ;==>_ArrayAddColumns | 
|---|
| 129 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 130 | ; Name...........: _ArrayBinarySearch | 
|---|
| 131 | ; Description ...: Uses the binary search algorithm to search through a 1 or 2-dimensional array. | 
|---|
| 132 | ; Syntax.........: _ArrayBinarySearch(Const ByRef $avArray, $vValue[, $iSubItem = 0[, $iStart = 0[, $iEnd = 0]]]) | 
|---|
| 133 | ; Parameters ....: $avArray - Array to search | 
|---|
| 134 | ;                  $vValue  - Value to find | 
|---|
| 135 | ;                  $iSubItem - [optional] Which column to search on [Default = First (0) column] | 
|---|
| 136 | ;                  $iStart  - [optional] Index of array to start searching at [Default = start of array] | 
|---|
| 137 | ;                  $iEnd    - [optional] Index of array to stop searching at [Default = end of array] | 
|---|
| 138 | ; Return values .: Success - Index that value was found at | 
|---|
| 139 | ;                  Failure - -1, sets @error to: | 
|---|
| 140 | ;                  |1 - $avArray is not an array | 
|---|
| 141 | ;                  |2 - $vValue outside of array's min/max values | 
|---|
| 142 | ;                  |3 - $vValue was not found in array | 
|---|
| 143 | ;                  |4 - $iStart is greater than $iEnd | 
|---|
| 144 | ;                                  |5 - $iSubItem is greater than actual number of columns | 
|---|
| 145 | ;                  |6 - $avArray has too many dimensions | 
|---|
| 146 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com> | 
|---|
| 147 | ; Modified.......: Ultima - added $iEnd as parameter, code cleanup | 
|---|
| 148 | ; Modified.......: BrewManNH - added ability to search a 2D array | 
|---|
| 149 | ; Remarks .......: When performing a binary search on an array of items, the contents of the column being searched MUST be | 
|---|
| 150 | ;                  sorted before the search is done, otherwise undefined results will be returned. | 
|---|
| 151 | ; Related .......: _ArrayFindAll, _ArraySearch, _ArrayBinarySearch | 
|---|
| 152 | ; Link ..........: | 
|---|
| 153 | ; Example .......: Yes | 
|---|
| 154 | ; =============================================================================================================================== | 
|---|
| 155 | Func _ArrayBinarySearch(Const ByRef $avArray, $vValue, $iSubItem = 0, $iStart = 0, $iEnd = 0) | 
|---|
| 156 | If UBound($avArray, 0) > 2 Then Return SetError(6, 0, -1) | 
|---|
| 157 | Local $Is2D = False | 
|---|
| 158 | If UBound($avArray, 0) > 1 Then | 
|---|
| 159 | $Is2D = True | 
|---|
| 160 | EndIf | 
|---|
| 161 | If UBound($avArray, 2) < $iSubItem Then Return SetError(5, 0, -1) | 
|---|
| 162 | If Not IsArray($avArray) Then Return SetError(1, 0, -1) | 
|---|
| 163 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 164 | ; Bounds checking | 
|---|
| 165 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 166 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 167 | If $iStart > $iEnd Then Return SetError(4, 0, -1) | 
|---|
| 168 | Local $iMid = Int(($iEnd + $iStart) / 2) | 
|---|
| 169 | If Not $Is2D Then | 
|---|
| 170 | If $avArray[$iStart] > $vValue Or $avArray[$iEnd] < $vValue Then Return SetError(2, 0, -1) | 
|---|
| 171 | ; Search | 
|---|
| 172 | While $iStart <= $iMid And $vValue <> $avArray[$iMid] | 
|---|
| 173 | If $vValue < $avArray[$iMid] Then | 
|---|
| 174 | $iEnd = $iMid - 1 | 
|---|
| 175 | Else | 
|---|
| 176 | $iStart = $iMid + 1 | 
|---|
| 177 | EndIf | 
|---|
| 178 | $iMid = Int(($iEnd + $iStart) / 2) | 
|---|
| 179 | WEnd | 
|---|
| 180 | If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found | 
|---|
| 181 | Return $iMid | 
|---|
| 182 | Else | 
|---|
| 183 | If $avArray[$iStart][$iSubItem] > $vValue Or $avArray[$iEnd][$iSubItem] < $vValue Then Return SetError(2, 0, -1) | 
|---|
| 184 | ; Search | 
|---|
| 185 | While $iStart <= $iMid And $vValue <> $avArray[$iMid][$iSubItem] | 
|---|
| 186 | If $vValue < $avArray[$iMid][$iSubItem] Then | 
|---|
| 187 | $iEnd = $iMid - 1 | 
|---|
| 188 | Else | 
|---|
| 189 | $iStart = $iMid + 1 | 
|---|
| 190 | EndIf | 
|---|
| 191 | $iMid = Int(($iEnd + $iStart) / 2) | 
|---|
| 192 | WEnd | 
|---|
| 193 | If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found | 
|---|
| 194 | Return $iMid | 
|---|
| 195 | EndIf | 
|---|
| 196 | EndFunc   ;==>_ArrayBinarySearch | 
|---|
| 197 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 198 | ; Name...........: _ArrayCombinations | 
|---|
| 199 | ; Description ...: Returns an Array of the Combinations of a Set of Elements from a Selected Array | 
|---|
| 200 | ; Syntax.........: _ArrayCombinations(ByRef $avArray, $iSet[, $sDelim = ""]) | 
|---|
| 201 | ; Parameters ....: $avArray - The Array to use | 
|---|
| 202 | ;                  $iSet - Size of the combinations set | 
|---|
| 203 | ;                  $sDelim - [optional] String result separator, default is "" for none | 
|---|
| 204 | ; Return values .: Success - Returns an Array of Combinations | 
|---|
| 205 | ;                  |Returns an array, the first element ($array[0]) contains the number of strings returned. | 
|---|
| 206 | ;                  |The remaining elements ($array[1], $array[2], etc.) contain the Combinations. | 
|---|
| 207 | ;                  Failure - Returns 0 and Sets @error: | 
|---|
| 208 | ;                  |1 - The Input Must be an Array | 
|---|
| 209 | ;                  |2 - $avArray is not a 1 dimensional array | 
|---|
| 210 | ; Author ........: Erik Pilsits | 
|---|
| 211 | ; Modified.......: 07/08/2008 | 
|---|
| 212 | ; Remarks .......: The input array must be 0-based, i.e. no counter in $array[0]. Based on an algorithm by Kenneth H. Rosen. | 
|---|
| 213 | ;+ | 
|---|
| 214 | ;                  http://www.merriampark.com/comb.htm | 
|---|
| 215 | ; Related .......: _ArrayPermute | 
|---|
| 216 | ; Link ..........: | 
|---|
| 217 | ; Example .......: Yes | 
|---|
| 218 | ; ========================================================================================== | 
|---|
| 219 | Func _ArrayCombinations(ByRef $avArray, $iSet, $sDelim = "") | 
|---|
| 220 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 221 | If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, 0) | 
|---|
| 222 | Local $iN = UBound($avArray) | 
|---|
| 223 | Local $iR = $iSet | 
|---|
| 224 | Local $aIdx[$iR] | 
|---|
| 225 | For $i = 0 To $iR - 1 | 
|---|
| 226 | $aIdx[$i] = $i | 
|---|
| 227 | Next | 
|---|
| 228 | Local $iTotal = __Array_Combinations($iN, $iR) | 
|---|
| 229 | Local $iLeft = $iTotal | 
|---|
| 230 | Local $aResult[$iTotal + 1] | 
|---|
| 231 | $aResult[0] = $iTotal | 
|---|
| 232 | Local $iCount = 1 | 
|---|
| 233 | While $iLeft > 0 | 
|---|
| 234 | __Array_GetNext($iN, $iR, $iLeft, $iTotal, $aIdx) | 
|---|
| 235 | For $i = 0 To $iSet - 1 | 
|---|
| 236 | $aResult[$iCount] &= $avArray[$aIdx[$i]] & $sDelim | 
|---|
| 237 | Next | 
|---|
| 238 | If $sDelim <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1) | 
|---|
| 239 | $iCount += 1 | 
|---|
| 240 | WEnd | 
|---|
| 241 | Return $aResult | 
|---|
| 242 | EndFunc   ;==>_ArrayCombinations | 
|---|
| 243 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 244 | ; Name...........: _ArrayConcatenate | 
|---|
| 245 | ; Description ...: Concatenate two arrays. | 
|---|
| 246 | ; Syntax.........: _ArrayConcatenate(ByRef $avArrayTarget, Const ByRef $avArraySource, $iStart = 0) | 
|---|
| 247 | ; Parameters ....: $avArrayTarget - The array to concatenate onto | 
|---|
| 248 | ;                  $avArraySource - The array to concatenate from | 
|---|
| 249 | ;                  $iStart - index of the first Source Array entry | 
|---|
| 250 | ; Return values .: Success - $avArrayTarget's new size | 
|---|
| 251 | ;                  Failure - 0, sets @error to: | 
|---|
| 252 | ;                  |1 - $avArrayTarget is not an array | 
|---|
| 253 | ;                  |2 - $avArraySource is not an array | 
|---|
| 254 | ;                  |3 - $avArrayTarget is not a 1 or 2 dimensional array | 
|---|
| 255 | ;                  |4 - $avArraySource is not a 1 or 2 dimensional array | 
|---|
| 256 | ;                  |5 - $avArrayTarget and $avArraySource is not a 1 or 2 dimensional array | 
|---|
| 257 | ;                  |6 - Arrays have different number of subitems | 
|---|
| 258 | ;                  |7 - Arrays have different number of dimensions | 
|---|
| 259 | ; Author ........: Ultima | 
|---|
| 260 | ; Modified.......: Partypooper - added target start index | 
|---|
| 261 | ; Remarks .......: | 
|---|
| 262 | ; Related .......: _ArrayAdd, _ArrayPush | 
|---|
| 263 | ; Link ..........: | 
|---|
| 264 | ; Example .......: Yes | 
|---|
| 265 | ; =============================================================================================================================== | 
|---|
| 266 | Func _ArrayConcatenate(ByRef $avArrayTarget, Const ByRef $avArraySource, $iStart = 0) | 
|---|
| 267 | If Not IsArray($avArrayTarget) Then Return SetError(1, 0, 0) | 
|---|
| 268 | If Not IsArray($avArraySource) Then Return SetError(2, 0, 0) | 
|---|
| 269 | If UBound($avArraySource, 0) <> UBound($avArrayTarget, 0) Then Return SetError(7, 0, 0) | 
|---|
| 270 | If UBound($avArrayTarget, 0) > 2 Then | 
|---|
| 271 | If UBound($avArraySource, 0) > 2 Then Return SetError(5, 0, 0) | 
|---|
| 272 | Return SetError(3, 0, 0) | 
|---|
| 273 | EndIf | 
|---|
| 274 | If UBound($avArraySource, 0) > 2 Then Return SetError(4, 0, 0) | 
|---|
| 275 | If UBound($avArrayTarget, 2) <> UBound($avArraySource, 2) Then Return SetError(6, 0, 0) | 
|---|
| 276 | If UBound($avArraySource, 0) = 1 Then | 
|---|
| 277 | Local $iUBoundTarget = UBound($avArrayTarget) - $iStart, $iUBoundSource = UBound($avArraySource) | 
|---|
| 278 | ReDim $avArrayTarget[$iUBoundTarget + $iUBoundSource] | 
|---|
| 279 | For $i = $iStart To $iUBoundSource - 1 | 
|---|
| 280 | $avArrayTarget[$iUBoundTarget + $i] = $avArraySource[$i] | 
|---|
| 281 | Next | 
|---|
| 282 | Return $iUBoundTarget + $iUBoundSource | 
|---|
| 283 | Else | 
|---|
| 284 | Local $iUBoundTarget = UBound($avArrayTarget) - $iStart, $iUBoundSource = UBound($avArraySource), $iSubItems = UBound($avArrayTarget, 2) | 
|---|
| 285 | ReDim $avArrayTarget[$iUBoundTarget + $iUBoundSource][$iSubItems] | 
|---|
| 286 | For $i = $iStart To $iUBoundSource - 1 | 
|---|
| 287 | For $x = 0 To $iSubItems - 1 | 
|---|
| 288 | $avArrayTarget[$iUBoundTarget + $i][$x] = $avArraySource[$i][$x] | 
|---|
| 289 | Next | 
|---|
| 290 | Next | 
|---|
| 291 | Return $iUBoundTarget + $iUBoundSource | 
|---|
| 292 | EndIf | 
|---|
| 293 | EndFunc   ;==>_ArrayConcatenate | 
|---|
| 294 | ; #NO_DOC_FUNCTION# ============================================================================================================= | 
|---|
| 295 | ; Name...........: _ArrayCreate | 
|---|
| 296 | ; Description ...: Create a small array and quickly assign values. | 
|---|
| 297 | ; Syntax.........: _ArrayCreate ($v_0 [,$v_1 [,... [, $v_20 ]]]) | 
|---|
| 298 | ; Parameters ....: $v_0  - The first element of the array | 
|---|
| 299 | ;                  $v_1  - [optional] The second element of the array | 
|---|
| 300 | ;                  ... | 
|---|
| 301 | ;                  $v_20 - [optional] The twenty-first element of the array | 
|---|
| 302 | ; Return values .: Success - The array with values | 
|---|
| 303 | ; Author ........: Dale (Klaatu) Thompson, Jos van der Zande <jdeb at autoitscript dot com> - rewritten to avoid Eval() errors in Obsufcator | 
|---|
| 304 | ; Modified.......: Ultima | 
|---|
| 305 | ; Remarks .......: Arrays of up to 21 elements in size can be created with this function. | 
|---|
| 306 | ; Related .......: | 
|---|
| 307 | ; Link ..........: | 
|---|
| 308 | ; Example .......: Yes | 
|---|
| 309 | ; =============================================================================================================================== | 
|---|
| 310 | Func _ArrayCreate($v_0, $v_1 = 0, $v_2 = 0, $v_3 = 0, $v_4 = 0, $v_5 = 0, $v_6 = 0, $v_7 = 0, $v_8 = 0, $v_9 = 0, $v_10 = 0, $v_11 = 0, $v_12 = 0, $v_13 = 0, $v_14 = 0, $v_15 = 0, $v_16 = 0, $v_17 = 0, $v_18 = 0, $v_19 = 0, $v_20 = 0) | 
|---|
| 311 | Local $av_Array[21] = [$v_0, $v_1, $v_2, $v_3, $v_4, $v_5, $v_6, $v_7, $v_8, $v_9, $v_10, $v_11, $v_12, $v_13, $v_14, $v_15, $v_16, $v_17, $v_18, $v_19, $v_20] | 
|---|
| 312 | ReDim $av_Array[@NumParams] | 
|---|
| 313 | Return $av_Array | 
|---|
| 314 | EndFunc   ;==>_ArrayCreate | 
|---|
| 315 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 316 | ; Name...........: _ArrayDelete | 
|---|
| 317 | ; Description ...: Deletes the specified element from the given array. | 
|---|
| 318 | ; Syntax.........: _ArrayDelete(ByRef $avArray, $iElement) | 
|---|
| 319 | ; Parameters ....: $avArray  - Array to modify | 
|---|
| 320 | ;                  $iElement - Element to delete | 
|---|
| 321 | ; Return values .: Success - New size of the array | 
|---|
| 322 | ;                  Failure - 0, sets @error to: | 
|---|
| 323 | ;                  |1 - $avArray is not an array | 
|---|
| 324 | ;                  |3 - $avArray has too many dimensions (only up to 2D supported) | 
|---|
| 325 | ;                  |(2 - Deprecated error code) | 
|---|
| 326 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 327 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - array passed ByRef, Ultima - 2D arrays supported, reworked function (no longer needs temporary array; faster when deleting from end) | 
|---|
| 328 | ; Remarks .......: If the array has one element left (or one row for 2D arrays), it will be set to "" after _ArrayDelete() is used on it. | 
|---|
| 329 | ;+ | 
|---|
| 330 | ;                  If the $ilement is greater than the array size then the last element is destroyed. | 
|---|
| 331 | ; Related .......: _ArrayAdd, _ArrayInsert, _ArrayPop, _ArrayPush | 
|---|
| 332 | ; Link ..........: | 
|---|
| 333 | ; Example .......: Yes | 
|---|
| 334 | ; =============================================================================================================================== | 
|---|
| 335 | Func _ArrayDelete(ByRef $avArray, $iElement) | 
|---|
| 336 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 337 | Local $iUBound = UBound($avArray, 1) - 1 | 
|---|
| 338 | If Not $iUBound Then | 
|---|
| 339 | $avArray = "" | 
|---|
| 340 | Return 0 | 
|---|
| 341 | EndIf | 
|---|
| 342 | ; Bounds checking | 
|---|
| 343 | If $iElement < 0 Then $iElement = 0 | 
|---|
| 344 | If $iElement > $iUBound Then $iElement = $iUBound | 
|---|
| 345 | ; Move items after $iElement up by 1 | 
|---|
| 346 | Switch UBound($avArray, 0) | 
|---|
| 347 | Case 1 | 
|---|
| 348 | For $i = $iElement To $iUBound - 1 | 
|---|
| 349 | $avArray[$i] = $avArray[$i + 1] | 
|---|
| 350 | Next | 
|---|
| 351 | ReDim $avArray[$iUBound] | 
|---|
| 352 | Case 2 | 
|---|
| 353 | Local $iSubMax = UBound($avArray, 2) - 1 | 
|---|
| 354 | For $i = $iElement To $iUBound - 1 | 
|---|
| 355 | For $j = 0 To $iSubMax | 
|---|
| 356 | $avArray[$i][$j] = $avArray[$i + 1][$j] | 
|---|
| 357 | Next | 
|---|
| 358 | Next | 
|---|
| 359 | ReDim $avArray[$iUBound][$iSubMax + 1] | 
|---|
| 360 | Case Else | 
|---|
| 361 | Return SetError(3, 0, 0) | 
|---|
| 362 | EndSwitch | 
|---|
| 363 | Return $iUBound | 
|---|
| 364 | EndFunc   ;==>_ArrayDelete | 
|---|
| 365 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 366 | ; Name...........: _ArrayDeleteColumn | 
|---|
| 367 | ; Description ...: Deletes a specified column from a 2D array. | 
|---|
| 368 | ; Syntax.........: _ArrayDeleteColumn(ByRef $aArrayIn, $iSubItem) | 
|---|
| 369 | ; Parameters ....: $aArrayIn - Array to modify | 
|---|
| 370 | ;                  $iSubItem  - The column to delete | 
|---|
| 371 | ; Return values .: Success - New array with column deleted | 
|---|
| 372 | ;                  Failure - -1, sets @error | 
|---|
| 373 | ;                  |1 - $aArrayIn is not an array | 
|---|
| 374 | ;                  |2 - Array is not a 2D array | 
|---|
| 375 | ;                  |3 - $iSubItem is an invalid number | 
|---|
| 376 | ; Author ........: PsaltyDS | 
|---|
| 377 | ; Remarks .......: This will delete a column from a 2D array of any size and preserves the contents of the | 
|---|
| 378 | ;                  array being modified | 
|---|
| 379 | ; Notes .........: This will NOT create a 1D array from a 2D array even if your final array contains only 1 column | 
|---|
| 380 | ;                  this is because the final array will be dimensioned as a 2D array with the second subitem dimensioned | 
|---|
| 381 | ;                  to zero. | 
|---|
| 382 | ; Related .......: _ArrayConcatenate2D, _ArrayDelete, _ArrayInsert, _ArrayPop2D, _ArrayPush, _ArrayAddColumn | 
|---|
| 383 | ; Link ..........: | 
|---|
| 384 | ; Example .......: No | 
|---|
| 385 | ; =============================================================================================================================== | 
|---|
| 386 | Func _ArrayDeleteColumn(ByRef $aArrayIn, $iSubItem) | 
|---|
| 387 | If Not IsArray($aArrayIn) Then Return SetError(1, 0, -1); Not an array | 
|---|
| 388 | If UBound($aArrayIn, 0) <> 2 Then Return SetError(2, 0, -1); Not a 2D array | 
|---|
| 389 | If ($iSubItem < 0) Or ($iSubItem > (UBound($aArrayIn, 2) - 1)) Then Return SetError(3, 0, -1); $iSubItem out of range | 
|---|
| 390 | If $iSubItem < UBound($aArrayIn, 2) - 1 Then | 
|---|
| 391 | For $c = $iSubItem To UBound($aArrayIn, 2) - 2 | 
|---|
| 392 | For $R = 0 To UBound($aArrayIn) - 1 | 
|---|
| 393 | $aArrayIn[$R][$c] = $aArrayIn[$R][$c + 1] | 
|---|
| 394 | Next | 
|---|
| 395 | Next | 
|---|
| 396 | EndIf | 
|---|
| 397 | ReDim $aArrayIn[UBound($aArrayIn)][UBound($aArrayIn, 2) - 1] | 
|---|
| 398 | Return 1 | 
|---|
| 399 | EndFunc   ;==>_ArrayDeleteColumn | 
|---|
| 400 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 401 | ; Name...........: _ArrayDisplay | 
|---|
| 402 | ; Description ...: Displays given 1D or 2D array array in a listview. | 
|---|
| 403 | ; Syntax.........: _ArrayDisplay(Const ByRef $avArray[, $sTitle = "Array: ListView Display"[, $iItemLimit = -1[, $iTranspose = 0[, $sSeparator = ""[, $sReplace = "|"[, $sHeader = ""]]]]]]) | 
|---|
| 404 | ; Parameters ....: $avArray    - Array to display | 
|---|
| 405 | ;                  $sTitle     - [optional] Title to use for window | 
|---|
| 406 | ;                  $iItemLimit - [optional] Maximum number of listview items (rows) to show | 
|---|
| 407 | ;                  $iTranspose - [optional] If set differently than default, will transpose the array if 2D | 
|---|
| 408 | ;                  $sSeparator - [optional] Change Opt("GUIDataSeparatorChar") on-the-fly | 
|---|
| 409 | ;                  $sReplace   - [optional] String to replace any occurrence of $sSeparator with in each array element | 
|---|
| 410 | ;                  $sheader     - [optional] Header column names | 
|---|
| 411 | ; Return values .: Success - 1 | 
|---|
| 412 | ;                  Failure - 0, sets @error: | 
|---|
| 413 | ;                  |1 - $avArray is not an array | 
|---|
| 414 | ;                  |2 - $avArray has too many dimensions (only up to 2D supported) | 
|---|
| 415 | ; Author ........: randallc, Ultima | 
|---|
| 416 | ; Modified.......: Gary Frost (gafrost), Ultima, Zedna, jpm, BrewManNH | 
|---|
| 417 | ; Remarks .......: This will now autosize the GUI Window and autosize the column widths to match the longest items | 
|---|
| 418 | ; Related .......: | 
|---|
| 419 | ; Link ..........: | 
|---|
| 420 | ; Example .......: Yes | 
|---|
| 421 | ; =============================================================================================================================== | 
|---|
| 422 | Func _ArrayDisplay(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "") | 
|---|
| 423 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 424 | ; Dimension checking | 
|---|
| 425 | Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1 | 
|---|
| 426 | If $iDimension > 2 Then Return SetError(2, 0, 0) | 
|---|
| 427 | ; Separator handling | 
|---|
| 428 | ;~     If $sSeparator = "" Then $sSeparator = Chr(1) | 
|---|
| 429 | If $sSeparator = "" Then $sSeparator = Chr(124) | 
|---|
| 430 | ;  Check the separator to make sure it's not used literally in the array | 
|---|
| 431 | If _ArraySearch($avArray, $sSeparator, 0, 0, 0, 1) <> -1 Then | 
|---|
| 432 | For $x = 1 To 255 | 
|---|
| 433 | If $x >= 32 And $x <= 127 Then ContinueLoop | 
|---|
| 434 | Local $sFind = _ArraySearch($avArray, Chr($x), 0, 0, 0, 1) | 
|---|
| 435 | If $sFind = -1 Then | 
|---|
| 436 | $sSeparator = Chr($x) | 
|---|
| 437 | ExitLoop | 
|---|
| 438 | EndIf | 
|---|
| 439 | Next | 
|---|
| 440 | EndIf | 
|---|
| 441 | ; Declare variables | 
|---|
| 442 | Local $vTmp, $iBuffer = 64 | 
|---|
| 443 | Local $iColLimit = 250 | 
|---|
| 444 | Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator) | 
|---|
| 445 | ; Swap dimensions if transposing | 
|---|
| 446 | If $iSubMax < 0 Then $iSubMax = 0 | 
|---|
| 447 | If $iTranspose Then | 
|---|
| 448 | $vTmp = $iUBound | 
|---|
| 449 | $iUBound = $iSubMax | 
|---|
| 450 | $iSubMax = $vTmp | 
|---|
| 451 | EndIf | 
|---|
| 452 | ; Set limits for dimensions | 
|---|
| 453 | If $iSubMax > $iColLimit Then $iSubMax = $iColLimit | 
|---|
| 454 | If $iItemLimit < 1 Then $iItemLimit = $iUBound | 
|---|
| 455 | If $iUBound > $iItemLimit Then $iUBound = $iItemLimit | 
|---|
| 456 | ; Set header up | 
|---|
| 457 | If $sHeader = "" Then | 
|---|
| 458 | $sHeader = "Row  " ; blanks added to adjust column size for big number of rows | 
|---|
| 459 | For $i = 0 To $iSubMax | 
|---|
| 460 | $sHeader &= $sSeparator & "Col " & $i | 
|---|
| 461 | Next | 
|---|
| 462 | EndIf | 
|---|
| 463 | ; Convert array into text for listview | 
|---|
| 464 | Local $avArrayText[$iUBound + 1] | 
|---|
| 465 | For $i = 0 To $iUBound | 
|---|
| 466 | $avArrayText[$i] = "[" & $i & "]" | 
|---|
| 467 | For $j = 0 To $iSubMax | 
|---|
| 468 | ; Get current item | 
|---|
| 469 | If $iDimension = 1 Then | 
|---|
| 470 | If $iTranspose Then | 
|---|
| 471 | $vTmp = $avArray[$j] | 
|---|
| 472 | Else | 
|---|
| 473 | $vTmp = $avArray[$i] | 
|---|
| 474 | EndIf | 
|---|
| 475 | Else | 
|---|
| 476 | If $iTranspose Then | 
|---|
| 477 | $vTmp = $avArray[$j][$i] | 
|---|
| 478 | Else | 
|---|
| 479 | $vTmp = $avArray[$i][$j] | 
|---|
| 480 | EndIf | 
|---|
| 481 | EndIf | 
|---|
| 482 | ; Add to text array | 
|---|
| 483 | $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1) | 
|---|
| 484 | $avArrayText[$i] &= $sSeparator & $vTmp | 
|---|
| 485 | ; Set max buffer size | 
|---|
| 486 | $vTmp = StringLen($vTmp) | 
|---|
| 487 | If $vTmp > $iBuffer Then $iBuffer = $vTmp | 
|---|
| 488 | Next | 
|---|
| 489 | Next | 
|---|
| 490 | $iBuffer += 1 | 
|---|
| 491 | ; GUI Constants | 
|---|
| 492 | Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66 | 
|---|
| 493 | Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40 | 
|---|
| 494 | Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200 | 
|---|
| 495 | Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2 | 
|---|
| 496 | Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4 | 
|---|
| 497 | Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3 | 
|---|
| 498 | Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4 | 
|---|
| 499 | Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1 | 
|---|
| 500 | Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29) | 
|---|
| 501 | Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4) | 
|---|
| 502 | Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44) | 
|---|
| 503 | Local Const $_ARRAYCONSTANT_LVM_INSERTITEMW = (0x1000 + 77) | 
|---|
| 504 | Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54) | 
|---|
| 505 | Local Const $_ARRAYCONSTANT_LVM_SETITEMW = (0x1000 + 76) | 
|---|
| 506 | Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20 | 
|---|
| 507 | Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1 | 
|---|
| 508 | Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8 | 
|---|
| 509 | Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200 | 
|---|
| 510 | Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000 | 
|---|
| 511 | Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000 | 
|---|
| 512 | Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000 | 
|---|
| 513 | 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" | 
|---|
| 514 | Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM) | 
|---|
| 515 | Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer) | 
|---|
| 516 | Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem) | 
|---|
| 517 | DllStructSetData($tItem, "Param", 0) | 
|---|
| 518 | DllStructSetData($tItem, "Text", $pBuffer) | 
|---|
| 519 | DllStructSetData($tItem, "TextMax", $iBuffer) | 
|---|
| 520 | ; Set interface up | 
|---|
| 521 | Local $iWidth = 640, $iHeight = 480 | 
|---|
| 522 | Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX)) | 
|---|
| 523 | Local $aiGUISize = WinGetClientSize($hGUI) | 
|---|
| 524 | Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS) | 
|---|
| 525 | Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20) | 
|---|
| 526 | GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS) | 
|---|
| 527 | GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT) | 
|---|
| 528 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES) | 
|---|
| 529 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT) | 
|---|
| 530 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE) | 
|---|
| 531 | ; Fill listview | 
|---|
| 532 | Local $aItem | 
|---|
| 533 | For $i = 0 To $iUBound | 
|---|
| 534 | If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then | 
|---|
| 535 | ; use GUICtrlSendMsg() to overcome AutoIt limitation | 
|---|
| 536 | $aItem = StringSplit($avArrayText[$i], $sSeparator) | 
|---|
| 537 | DllStructSetData($tBuffer, "Text", $aItem[1]) | 
|---|
| 538 | ; Add listview item | 
|---|
| 539 | DllStructSetData($tItem, "Item", $i) | 
|---|
| 540 | DllStructSetData($tItem, "SubItem", 0) | 
|---|
| 541 | DllStructSetData($tItem, "Mask", $iAddMask) | 
|---|
| 542 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem) | 
|---|
| 543 | ; Set listview subitem text | 
|---|
| 544 | DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT) | 
|---|
| 545 | For $j = 2 To $aItem[0] | 
|---|
| 546 | DllStructSetData($tBuffer, "Text", $aItem[$j]) | 
|---|
| 547 | DllStructSetData($tItem, "SubItem", $j - 1) | 
|---|
| 548 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMW, 0, $pItem) | 
|---|
| 549 | Next | 
|---|
| 550 | EndIf | 
|---|
| 551 | Next | 
|---|
| 552 | ;~  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< added lines in this section | 
|---|
| 553 | ;~ | 
|---|
| 554 | ; adjust column size to match longest item in the list | 
|---|
| 555 | GUICtrlSendMsg($hListView, 4126, 1, -1) | 
|---|
| 556 | If $iDimension = 2 Then | 
|---|
| 557 | For $i = 2 To UBound($avArray, 2) | 
|---|
| 558 | GUICtrlSendMsg($hListView, 4126, $i, -1) | 
|---|
| 559 | Next | 
|---|
| 560 | EndIf | 
|---|
| 561 | ;~  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< added lines in this section | 
|---|
| 562 | ;~ | 
|---|
| 563 | ; adjust window width | 
|---|
| 564 | $iWidth = 0 | 
|---|
| 565 | For $i = 0 To $iSubMax + 1 | 
|---|
| 566 | $iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0) | 
|---|
| 567 | Next | 
|---|
| 568 | If $iWidth < 250 Then $iWidth = 230 | 
|---|
| 569 | $iWidth += 40 ;~ <<<<<<<<<<<<<<<<<<<<<< Changed this value from 20 to 40 | 
|---|
| 570 | If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100 | 
|---|
| 571 | WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth) | 
|---|
| 572 | ; Show dialog | 
|---|
| 573 | GUISetState(@SW_SHOW, $hGUI) | 
|---|
| 574 | While 1 | 
|---|
| 575 | Switch GUIGetMsg() | 
|---|
| 576 | Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE | 
|---|
| 577 | ExitLoop | 
|---|
| 578 | Case $hCopy | 
|---|
| 579 | Local $sClip = "" | 
|---|
| 580 | ; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ] | 
|---|
| 581 | Local $aiCurItems[1] = [0] | 
|---|
| 582 | For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0) | 
|---|
| 583 | If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then | 
|---|
| 584 | $aiCurItems[0] += 1 | 
|---|
| 585 | ReDim $aiCurItems[$aiCurItems[0] + 1] | 
|---|
| 586 | $aiCurItems[$aiCurItems[0]] = $i | 
|---|
| 587 | EndIf | 
|---|
| 588 | Next | 
|---|
| 589 | ; Generate clipboard text | 
|---|
| 590 | If Not $aiCurItems[0] Then | 
|---|
| 591 | For $sItem In $avArrayText | 
|---|
| 592 | $sClip &= $sItem & @CRLF | 
|---|
| 593 | Next | 
|---|
| 594 | Else | 
|---|
| 595 | For $i = 1 To UBound($aiCurItems) - 1 | 
|---|
| 596 | $sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF | 
|---|
| 597 | Next | 
|---|
| 598 | EndIf | 
|---|
| 599 | ClipPut($sClip) | 
|---|
| 600 | EndSwitch | 
|---|
| 601 | WEnd | 
|---|
| 602 | GUIDelete($hGUI) | 
|---|
| 603 | Opt("GUIOnEventMode", $iOnEventMode) | 
|---|
| 604 | Opt("GUIDataSeparatorChar", $sDataSeparatorChar) | 
|---|
| 605 | Return 1 | 
|---|
| 606 | EndFunc   ;==>_ArrayDisplay | 
|---|
| 607 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 608 | ; Name...........: _ArrayFindAll | 
|---|
| 609 | ; Description ...: Find the indices of all ocurrences of a search query between two points in a 1D or 2D array using _ArraySearch(). | 
|---|
| 610 | ; Syntax.........: _ArrayFindAll(Const ByRef $avArray, $vValue[, $iStart = 0[, $iEnd = 0[, $iCase = 0[, $iPartial = 0[, $iSubItem = 0]]]]]) | 
|---|
| 611 | ; Parameters ....: $avArray  - The array to search | 
|---|
| 612 | ;                  $vValue   - What to search $avArray for | 
|---|
| 613 | ;                  $iStart   - [optional] Index of array to start searching at | 
|---|
| 614 | ;                  $iEnd     - [optional] Index of array to stop searching at | 
|---|
| 615 | ;                  $iCase    - [optional] If set to 1, search is case sensitive | 
|---|
| 616 | ;                  $iPartial - [optional] If set to 1, executes a partial search | 
|---|
| 617 | ;                  $iSubItem - [optional] Sub-index to search on in 2D arrays | 
|---|
| 618 | ; Return values .: Success - An array of all index numbers in array containing $vValue | 
|---|
| 619 | ;                  Failure - -1, sets @error (see _ArraySearch() description for error codes) | 
|---|
| 620 | ; Author ........: GEOSoft, Ultima | 
|---|
| 621 | ; Modified.......: | 
|---|
| 622 | ; Remarks .......: | 
|---|
| 623 | ; Related .......: _ArrayBinarySearch, _ArraySearch | 
|---|
| 624 | ; Link ..........: | 
|---|
| 625 | ; Example .......: Yes | 
|---|
| 626 | ; =============================================================================================================================== | 
|---|
| 627 | Func _ArrayFindAll(Const ByRef $avArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iPartial = 0, $iSubItem = 0) | 
|---|
| 628 | $iStart = _ArraySearch($avArray, $vValue, $iStart, $iEnd, $iCase, $iPartial, 1, $iSubItem) | 
|---|
| 629 | If @error Then Return SetError(@error, 0, -1) | 
|---|
| 630 | Local $iIndex = 0, $avResult[UBound($avArray)] | 
|---|
| 631 | Do | 
|---|
| 632 | $avResult[$iIndex] = $iStart | 
|---|
| 633 | $iIndex += 1 | 
|---|
| 634 | $iStart = _ArraySearch($avArray, $vValue, $iStart + 1, $iEnd, $iCase, $iPartial, 1, $iSubItem) | 
|---|
| 635 | Until @error | 
|---|
| 636 | ReDim $avResult[$iIndex] | 
|---|
| 637 | Return $avResult | 
|---|
| 638 | EndFunc   ;==>_ArrayFindAll | 
|---|
| 639 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 640 | ; Name...........: _ArrayInsert | 
|---|
| 641 | ; Description ...: Add a new value at the specified position. | 
|---|
| 642 | ; Syntax.........: _ArrayInsert(ByRef $avArray, $iElement[, $vValue = ""[, $sDelim = "|"]]) | 
|---|
| 643 | ; Parameters ....: $avArray  - Array to modify | 
|---|
| 644 | ;                  $iElement - Position to insert item at: | 
|---|
| 645 | ;                                If $iElement <= 0 then item will be inserted at the start of the array | 
|---|
| 646 | ;                                If $iElement > than the size of the array, the item will be added to the end of the array. | 
|---|
| 647 | ;                  $vValue   - [optional] Value of item to insert | 
|---|
| 648 | ;                  $sDelim       - [optional] Delimiter character to split incoming string on, default is | character | 
|---|
| 649 | ; Return values .: Success - New size of the array | 
|---|
| 650 | ;                  Failure - 0, sets @error | 
|---|
| 651 | ;                  |1 - $avArray is not an array | 
|---|
| 652 | ;                  |2 - $avArray is not a 1 or 2 dimensional array | 
|---|
| 653 | ;                  |3 - $vValue has different number of subitems than $avArray, when using a 2D array. | 
|---|
| 654 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com> | 
|---|
| 655 | ; Modified.......: Ultima - code cleanup | 
|---|
| 656 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 657 | ; Remarks .......: | 
|---|
| 658 | ; Related .......: _ArrayAdd, _ArrayDelete, _ArrayPop, _ArrayPush | 
|---|
| 659 | ; Link ..........: | 
|---|
| 660 | ; Example .......: Yes | 
|---|
| 661 | ; =============================================================================================================================== | 
|---|
| 662 | Func _ArrayInsert(ByRef $avArray, $iElement, $vValue = "", $sDelim = "|") | 
|---|
| 663 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 664 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, 0) | 
|---|
| 665 | If $iElement > UBound($avArray) Then $iElement = UBound($avArray) | 
|---|
| 666 | If $iElement < 0 Then $iElement = 0 | 
|---|
| 667 | ; Add 1 to the array | 
|---|
| 668 | Local $iUBound = UBound($avArray) + 1, $iMaxSubItems = UBound($avArray, 2), $iDimension = UBound($avArray, 0) | 
|---|
| 669 | If $iDimension = 1 Then | 
|---|
| 670 | ReDim $avArray[$iUBound] | 
|---|
| 671 | ; Move all entries over til the specified element | 
|---|
| 672 | For $i = $iUBound - 1 To $iElement + 1 Step -1 | 
|---|
| 673 | $avArray[$i] = $avArray[$i - 1] | 
|---|
| 674 | Next | 
|---|
| 675 | ; Add the value in the specified element | 
|---|
| 676 | $avArray[$iElement] = $vValue | 
|---|
| 677 | Return $iUBound | 
|---|
| 678 | Else | 
|---|
| 679 | ReDim $avArray[$iUBound][$iMaxSubItems] | 
|---|
| 680 | Local $avValue = StringSplit($vValue, $sDelim, 2) | 
|---|
| 681 | If UBound($avValue) <> $iMaxSubItems Then Return SetError(3, 0, 0) | 
|---|
| 682 | For $i = $iUBound - 1 To $iElement + 1 Step -1 | 
|---|
| 683 | For $j = 0 To $iMaxSubItems - 1 | 
|---|
| 684 | $avArray[$i][$j] = $avArray[$i - 1][$j] | 
|---|
| 685 | Next | 
|---|
| 686 | Next | 
|---|
| 687 | ; Add the value in the specified element | 
|---|
| 688 | For $j = 0 To $iMaxSubItems - 1 | 
|---|
| 689 | $avArray[$iElement][$j] = $avValue[$j] | 
|---|
| 690 | Next | 
|---|
| 691 | Return $iUBound | 
|---|
| 692 | EndIf | 
|---|
| 693 | EndFunc   ;==>_ArrayInsert | 
|---|
| 694 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 695 | ; Name...........: _ArrayMax | 
|---|
| 696 | ; Description ...: Returns the highest value held in an array. | 
|---|
| 697 | ; Syntax.........: _ArrayMax(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) | 
|---|
| 698 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 699 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 700 | ;                  |0 - compare alphanumerically | 
|---|
| 701 | ;                  |1 - compare numerically | 
|---|
| 702 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 703 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 704 | ;                  $iSubItem     - [optional] Subitem to search (first subitem is 0) | 
|---|
| 705 | ; Return values .: Success - The maximum value in the array | 
|---|
| 706 | ;                  Failure - "", sets @error (see _ArrayMaxIndex() description for error codes) | 
|---|
| 707 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 708 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup | 
|---|
| 709 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 710 | ; Remarks .......: | 
|---|
| 711 | ; Related .......: _ArrayMaxIndex, _ArrayMin, _ArrayMinIndex, _ArrayUnique | 
|---|
| 712 | ; Link ..........: | 
|---|
| 713 | ; Example .......: Yes | 
|---|
| 714 | ; =============================================================================================================================== | 
|---|
| 715 | Func _ArrayMax(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 716 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 717 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 718 | If UBound($avArray, 0) = 1 Then | 
|---|
| 719 | Local $iResult = _ArrayMaxIndex($avArray, $iCompNumeric, $iStart, $iEnd) | 
|---|
| 720 | If @error Then Return SetError(@error, 0, "") | 
|---|
| 721 | Return $avArray[$iResult] | 
|---|
| 722 | Else | 
|---|
| 723 | Local $iResult = _ArrayMaxIndex2D($avArray, $iCompNumeric, $iStart, $iEnd, $iSubItem) | 
|---|
| 724 | If @error Then Return SetError(@error, 0, "") | 
|---|
| 725 | Return $avArray[$iResult][$iSubItem] | 
|---|
| 726 | EndIf | 
|---|
| 727 | EndFunc   ;==>_ArrayMax | 
|---|
| 728 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 729 | ; Name...........: _ArrayMaxIndex | 
|---|
| 730 | ; Description ...: Returns the index where the highest value occurs in the array. | 
|---|
| 731 | ; Syntax.........: _ArrayMaxIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0]]]) | 
|---|
| 732 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 733 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 734 | ;                  |0 - compare alphanumerically | 
|---|
| 735 | ;                  |1 - compare numerically | 
|---|
| 736 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 737 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 738 | ; Return values .: Success - The index of the maximum value in the array | 
|---|
| 739 | ;                  Failure - -1, sets @error to: | 
|---|
| 740 | ;                  |1 - $avArray is not an array | 
|---|
| 741 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 742 | ;                  |3 - $avArray is not a 1 dimensional array | 
|---|
| 743 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 744 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization | 
|---|
| 745 | ; Remarks .......: | 
|---|
| 746 | ; Related .......: _ArrayMax, _ArrayMin, _ArrayMinIndex | 
|---|
| 747 | ; Link ..........: | 
|---|
| 748 | ; Example .......: Yes | 
|---|
| 749 | ; =============================================================================================================================== | 
|---|
| 750 | Func _ArrayMaxIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0) | 
|---|
| 751 | If Not IsArray($avArray) Or UBound($avArray, 0) <> 1 Then Return SetError(1, 0, -1) | 
|---|
| 752 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1) | 
|---|
| 753 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 754 | ; Bounds checking | 
|---|
| 755 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 756 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 757 | If $iStart > $iEnd Then Return SetError(2, 0, -1) | 
|---|
| 758 | Local $iMaxIndex = $iStart | 
|---|
| 759 | ; Search | 
|---|
| 760 | If $iCompNumeric Then | 
|---|
| 761 | For $i = $iStart To $iEnd | 
|---|
| 762 | If Number($avArray[$iMaxIndex]) < Number($avArray[$i]) Then $iMaxIndex = $i | 
|---|
| 763 | Next | 
|---|
| 764 | Else | 
|---|
| 765 | For $i = $iStart To $iEnd | 
|---|
| 766 | If $avArray[$iMaxIndex] < $avArray[$i] Then $iMaxIndex = $i | 
|---|
| 767 | Next | 
|---|
| 768 | EndIf | 
|---|
| 769 | Return $iMaxIndex | 
|---|
| 770 | EndFunc   ;==>_ArrayMaxIndex | 
|---|
| 771 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 772 | ; Name...........: _ArrayMaxIndex2D | 
|---|
| 773 | ; Description ...: Returns the index where the highest value occurs in the array. | 
|---|
| 774 | ; Syntax.........: _ArrayMax2DIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = ]]]]) | 
|---|
| 775 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 776 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 777 | ;                  |0 - compare alphanumerically | 
|---|
| 778 | ;                  |1 - compare numerically | 
|---|
| 779 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 780 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 781 | ;                  $iSubItem     - [optional] Subitem to search | 
|---|
| 782 | ; Return values .: Success - The index of the maximum value in the array | 
|---|
| 783 | ;                  Failure - -1, sets @error to: | 
|---|
| 784 | ;                  |1 - $avArray is not an array | 
|---|
| 785 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 786 | ;                  |3 - $avArray is not a 2 dimensional array | 
|---|
| 787 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 788 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization | 
|---|
| 789 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 790 | ; Remarks .......: This a modified version of _ArrayMaxIndex which adds support for 2D arrays. | 
|---|
| 791 | ; Related .......: _ArrayMax, _ArrayMin, _ArrayMaxIndex | 
|---|
| 792 | ; Link ..........: | 
|---|
| 793 | ; Example .......: Yes | 
|---|
| 794 | ; =============================================================================================================================== | 
|---|
| 795 | Func _ArrayMaxIndex2D(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 796 | If Not IsArray($avArray) Or UBound($avArray, 0) <> 2 Then Return SetError(1, 0, -1) | 
|---|
| 797 | If UBound($avArray, 0) <> 2 Then Return SetError(3, 0, -1) | 
|---|
| 798 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 799 | ; Bounds checking | 
|---|
| 800 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 801 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 802 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 803 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 804 | If $iStart > $iEnd Then Return SetError(2, 0, -1) | 
|---|
| 805 | Local $iMaxIndex = $iStart | 
|---|
| 806 | ; Search | 
|---|
| 807 | If $iCompNumeric Then | 
|---|
| 808 | For $i = $iStart To $iEnd | 
|---|
| 809 | If Number($avArray[$iMaxIndex][$iSubItem]) < Number($avArray[$i][$iSubItem]) Then $iMaxIndex = $i | 
|---|
| 810 | Next | 
|---|
| 811 | Else | 
|---|
| 812 | For $i = $iStart To $iEnd | 
|---|
| 813 | If $avArray[$iMaxIndex][$iSubItem] < $avArray[$i][$iSubItem] Then $iMaxIndex = $i | 
|---|
| 814 | Next | 
|---|
| 815 | EndIf | 
|---|
| 816 | Return $iMaxIndex | 
|---|
| 817 | EndFunc   ;==>_ArrayMaxIndex2D | 
|---|
| 818 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 819 | ; Name...........: _ArrayMin | 
|---|
| 820 | ; Description ...: Returns the lowest value held in an array. | 
|---|
| 821 | ; Syntax.........: _ArrayMin(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) | 
|---|
| 822 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 823 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 824 | ;                  |0 - compare alphanumerically | 
|---|
| 825 | ;                  |1 - compare numerically | 
|---|
| 826 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 827 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 828 | ;                  $iSubItem     - [optional] Subitem to search | 
|---|
| 829 | ; Return values .: Success - The minimum value in the array | 
|---|
| 830 | ;                  Failure - "", sets @error (see _ArrayMinIndex2D() description for error codes) | 
|---|
| 831 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 832 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup | 
|---|
| 833 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 834 | ; Remarks .......: | 
|---|
| 835 | ; Related .......: _ArrayMax2D, _ArrayMax2DIndex, _ArrayMinIndex2D, _ArrayUnique | 
|---|
| 836 | ; Link ..........: | 
|---|
| 837 | ; Example .......: Yes | 
|---|
| 838 | ; =============================================================================================================================== | 
|---|
| 839 | Func _ArrayMin(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 840 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 841 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 842 | If UBound($avArray, 0) = 1 Then | 
|---|
| 843 | Local $iResult = _ArrayMinIndex($avArray, $iCompNumeric, $iStart, $iEnd) | 
|---|
| 844 | If @error Then Return SetError(@error, 0, "") | 
|---|
| 845 | Return $avArray[$iResult] | 
|---|
| 846 | Else | 
|---|
| 847 | Local $iResult = _ArrayMinIndex2D($avArray, $iCompNumeric, $iStart, $iEnd, $iSubItem) | 
|---|
| 848 | If @error Then Return SetError(@error, 0, "") | 
|---|
| 849 | Return $avArray[$iResult][$iSubItem] | 
|---|
| 850 | EndIf | 
|---|
| 851 | EndFunc   ;==>_ArrayMin | 
|---|
| 852 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 853 | ; Name...........: _ArrayMinIndex | 
|---|
| 854 | ; Description ...: Returns the index where the lowest value occurs in the array. | 
|---|
| 855 | ; Syntax.........: _ArrayMinIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0]]]) | 
|---|
| 856 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 857 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 858 | ;                  |0 - compare alphanumerically | 
|---|
| 859 | ;                  |1 - compare numerically | 
|---|
| 860 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 861 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 862 | ; Return values .: Success - The index of the minimum value in the array | 
|---|
| 863 | ;                  Failure - -1, sets @error to: | 
|---|
| 864 | ;                  |1 - $avArray is not an array | 
|---|
| 865 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 866 | ;                  |3 - $avArray is not a 1 dimensional array | 
|---|
| 867 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 868 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization | 
|---|
| 869 | ; Remarks .......: | 
|---|
| 870 | ; Related .......: _ArrayMax, _ArrayMaxIndex, _ArrayMin | 
|---|
| 871 | ; Link ..........: | 
|---|
| 872 | ; Example .......: Yes | 
|---|
| 873 | ; =============================================================================================================================== | 
|---|
| 874 | Func _ArrayMinIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0) | 
|---|
| 875 | If Not IsArray($avArray) Then Return SetError(1, 0, -1) | 
|---|
| 876 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1) | 
|---|
| 877 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 878 | ; Bounds checking | 
|---|
| 879 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 880 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 881 | If $iStart > $iEnd Then Return SetError(2, 0, -1) | 
|---|
| 882 | Local $iMinIndex = $iStart | 
|---|
| 883 | ; Search | 
|---|
| 884 | If $iCompNumeric Then | 
|---|
| 885 | For $i = $iStart To $iEnd | 
|---|
| 886 | If Number($avArray[$iMinIndex]) > Number($avArray[$i]) Then $iMinIndex = $i | 
|---|
| 887 | Next | 
|---|
| 888 | Else | 
|---|
| 889 | For $i = $iStart To $iEnd | 
|---|
| 890 | If $avArray[$iMinIndex] > $avArray[$i] Then $iMinIndex = $i | 
|---|
| 891 | Next | 
|---|
| 892 | EndIf | 
|---|
| 893 | Return $iMinIndex | 
|---|
| 894 | EndFunc   ;==>_ArrayMinIndex | 
|---|
| 895 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 896 | ; Name...........: _ArrayMinIndex2D | 
|---|
| 897 | ; Description ...: Returns the index where the lowest value occurs in the array. | 
|---|
| 898 | ; Syntax.........: _ArrayMinIndex2D(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) | 
|---|
| 899 | ; Parameters ....: $avArray      - Array to search | 
|---|
| 900 | ;                  $iCompNumeric - [optional] Comparison method: | 
|---|
| 901 | ;                  |0 - compare alphanumerically | 
|---|
| 902 | ;                  |1 - compare numerically | 
|---|
| 903 | ;                  $iStart       - [optional] Index of array to start searching at | 
|---|
| 904 | ;                  $iEnd         - [optional] Index of array to stop searching at | 
|---|
| 905 | ;                  $iSubItem     - [optional] Subitem to search | 
|---|
| 906 | ; Return values .: Success - The index of the minimum value in the array | 
|---|
| 907 | ;                  Failure - -1, sets @error to: | 
|---|
| 908 | ;                  |1 - $avArray is not an array | 
|---|
| 909 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 910 | ;                  |3 - $avArray is not a 2 dimensional array | 
|---|
| 911 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 912 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization | 
|---|
| 913 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 914 | ; Remarks .......: This a modified version of _ArrayMinIndex which adds support for 2D arrays. | 
|---|
| 915 | ; Related .......: _ArrayMax2D, _ArrayMaxIndex, _ArrayMin2D | 
|---|
| 916 | ; Link ..........: | 
|---|
| 917 | ; Example .......: Yes | 
|---|
| 918 | ; =============================================================================================================================== | 
|---|
| 919 | Func _ArrayMinIndex2D(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 920 | If Not IsArray($avArray) Then Return SetError(1, 0, -1) | 
|---|
| 921 | If UBound($avArray, 0) <> 2 Then Return SetError(3, 0, -1) | 
|---|
| 922 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 923 | ; Bounds checking | 
|---|
| 924 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 925 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 926 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 927 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 928 | If $iStart > $iEnd Then Return SetError(2, 0, -1) | 
|---|
| 929 | Local $iMinIndex = $iStart | 
|---|
| 930 | ; Search | 
|---|
| 931 | If $iCompNumeric Then | 
|---|
| 932 | For $i = $iStart To $iEnd | 
|---|
| 933 | If Number($avArray[$iMinIndex][$iSubItem]) > Number($avArray[$i][$iSubItem]) Then $iMinIndex = $i | 
|---|
| 934 | Next | 
|---|
| 935 | Else | 
|---|
| 936 | For $i = $iStart To $iEnd | 
|---|
| 937 | If $avArray[$iMinIndex][$iSubItem] > $avArray[$i][$iSubItem] Then $iMinIndex = $i | 
|---|
| 938 | Next | 
|---|
| 939 | EndIf | 
|---|
| 940 | Return $iMinIndex | 
|---|
| 941 | EndFunc   ;==>_ArrayMinIndex2D | 
|---|
| 942 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 943 | ; Name...........: _ArrayPermute | 
|---|
| 944 | ; Description ...: Returns an Array of the Permutations of all Elements in an Array | 
|---|
| 945 | ; Syntax.........: _ArrayPermute(ByRef $avArray[, $sDelim = ""]) | 
|---|
| 946 | ; Parameters ....: $avArray - The Array to get Permutations | 
|---|
| 947 | ;                  $sDelim - [optional] String result separator, default is "" for none | 
|---|
| 948 | ; Return values .: Success - Returns an Array of Permutations | 
|---|
| 949 | ;                  |$array[0] contains the number of strings returned. | 
|---|
| 950 | ;                  |The remaining elements ($array[1], $array[2] ... $array[n]) contain the Permutations. | 
|---|
| 951 | ;                  |Failure - Returns 0 and Sets @error: | 
|---|
| 952 | ;                  |1 - The Input Must be an Array | 
|---|
| 953 | ;                  |2 - $avArray is not a 1 dimensional array | 
|---|
| 954 | ; Author ........: Erik Pilsits | 
|---|
| 955 | ; Modified.......: 07/08/2008 | 
|---|
| 956 | ; Remarks .......: The input array must be 0-based, i.e. no counter in $array[0].  Based on the algorithm by Alexander Bogomolny. | 
|---|
| 957 | ;+ | 
|---|
| 958 | ;                  http://www.bearcave.com/random_hacks/permute.html | 
|---|
| 959 | ; Related .......: _ArrayCombinations | 
|---|
| 960 | ; Link ..........: | 
|---|
| 961 | ; Example .......: Yes | 
|---|
| 962 | ; =============================================================================================================================== | 
|---|
| 963 | Func _ArrayPermute(ByRef $avArray, $sDelim = "") | 
|---|
| 964 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 965 | If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, 0) | 
|---|
| 966 | Local $iSize = UBound($avArray), $iFactorial = 1, $aIdx[$iSize], $aResult[1], $iCount = 1 | 
|---|
| 967 | For $i = 0 To $iSize - 1 | 
|---|
| 968 | $aIdx[$i] = $i | 
|---|
| 969 | Next | 
|---|
| 970 | For $i = $iSize To 1 Step -1 | 
|---|
| 971 | $iFactorial *= $i | 
|---|
| 972 | Next | 
|---|
| 973 | ReDim $aResult[$iFactorial + 1] | 
|---|
| 974 | $aResult[0] = $iFactorial | 
|---|
| 975 | __Array_ExeterInternal($avArray, 0, $iSize, $sDelim, $aIdx, $aResult, $iCount) | 
|---|
| 976 | Return $aResult | 
|---|
| 977 | EndFunc   ;==>_ArrayPermute | 
|---|
| 978 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 979 | ; Name...........: _ArrayPop | 
|---|
| 980 | ; Description ...: Returns the last element of an array, deleting that element from the array at the same time. | 
|---|
| 981 | ; Syntax.........: _ArrayPop(ByRef $avArray[, $cDelim = "|"]) | 
|---|
| 982 | ; Parameters ....: $avArray - Array to modify | 
|---|
| 983 | ;                  $cDelim - [optional] For 2D arrays, the delimiter to insert between elements in the returned string. | 
|---|
| 984 | ; Return values .: Success - The last element of the array, or for 2D arrays, the last "row" of the array in a delimited string | 
|---|
| 985 | ;                  Failure - "", sets @error | 
|---|
| 986 | ;                  |1 - The Input Must be an Array | 
|---|
| 987 | ;                  |2 - $avArray is not a 1 or 2 dimensional array | 
|---|
| 988 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 989 | ; Modified.......: Ultima - code cleanup | 
|---|
| 990 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 991 | ; Remarks .......: If the array has one element left, it will be set to "" after _ArrayPop() is used on it. | 
|---|
| 992 | ; Related .......: _ArrayAdd, _ArrayDelete, _ArrayInsert, _ArrayPush | 
|---|
| 993 | ; Link ..........: | 
|---|
| 994 | ; Example .......: Yes | 
|---|
| 995 | ; =============================================================================================================================== | 
|---|
| 996 | Func _ArrayPop(ByRef $avArray, $cDelim = "|") | 
|---|
| 997 | If (Not IsArray($avArray)) Then Return SetError(1, 0, "") | 
|---|
| 998 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, "") | 
|---|
| 999 | If UBound($avArray, 0) = 1 Then | 
|---|
| 1000 | Local $iUBound = UBound($avArray) - 1, $sLastVal = $avArray[$iUBound] | 
|---|
| 1001 | ; Remove last item | 
|---|
| 1002 | If Not $iUBound Then | 
|---|
| 1003 | $avArray = "" | 
|---|
| 1004 | Else | 
|---|
| 1005 | ReDim $avArray[$iUBound] | 
|---|
| 1006 | EndIf | 
|---|
| 1007 | ; Return last item | 
|---|
| 1008 | Return $sLastVal | 
|---|
| 1009 | Else | 
|---|
| 1010 | Local $iUBound = UBound($avArray) - 1, $iSubItems = UBound($avArray, 2) | 
|---|
| 1011 | Local $sLastVal | 
|---|
| 1012 | $sLastVal = $avArray[$iUBound][0] & $cDelim | 
|---|
| 1013 | For $j = 1 To $iSubItems - 1 | 
|---|
| 1014 | $sLastVal &= $avArray[$iUBound][$j] & $cDelim | 
|---|
| 1015 | Next | 
|---|
| 1016 | ; Remove last item | 
|---|
| 1017 | If Not $iUBound Then | 
|---|
| 1018 | $avArray = "" | 
|---|
| 1019 | Else | 
|---|
| 1020 | ReDim $avArray[$iUBound][$iSubItems] | 
|---|
| 1021 | EndIf | 
|---|
| 1022 | ; Return last item | 
|---|
| 1023 | Return StringTrimRight($sLastVal, StringLen($cDelim)) | 
|---|
| 1024 | EndIf | 
|---|
| 1025 | EndFunc   ;==>_ArrayPop | 
|---|
| 1026 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1027 | ; Name...........: _ArrayPush | 
|---|
| 1028 | ; Description ...: Add new values without increasing array size by inserting at the end the new value and deleting the first one or vice versa. | 
|---|
| 1029 | ; Syntax.........: _ArrayPush(ByRef $avArray, $vValue[, $iDirection = 0]) | 
|---|
| 1030 | ; Parameters ....: $avArray    - Array to modify | 
|---|
| 1031 | ;                  $vValue     - Value(s) to add (can be in an array) | 
|---|
| 1032 | ;                  $iDirection - [optional] Direction to push existing array elements: | 
|---|
| 1033 | ;                  |0 = Slide left (adding at the end) | 
|---|
| 1034 | ;                  |1 = Slide right (adding at the start) | 
|---|
| 1035 | ; Return values .: Success - 1 | 
|---|
| 1036 | ;                  Failure - 0, sets @error: | 
|---|
| 1037 | ;                  |1 - $avArray is not an array | 
|---|
| 1038 | ;                  |2 - $vValue is an array larger than $avArray (so it can't fit) | 
|---|
| 1039 | ;                  |3 - $avArray is not a 1 dimensional array | 
|---|
| 1040 | ; Author ........: Helias Gerassimou(hgeras), Ultima - code cleanup/rewrite (major optimization), fixed support for $vValue as an array | 
|---|
| 1041 | ; Modified.......: | 
|---|
| 1042 | ; Remarks .......: This function is used for continuous updates of data in array, where in other cases a vast size of array would be created. | 
|---|
| 1043 | ;                  It keeps all values inside the array (something like History), minus the first one or the last one depending on direction chosen. | 
|---|
| 1044 | ;                  It is similar to the push command in assembly. | 
|---|
| 1045 | ; Related .......: _ArrayAdd, _ArrayConcatenate, _ArrayDelete, _ArrayInsert, _ArrayPop | 
|---|
| 1046 | ; Link ..........: | 
|---|
| 1047 | ; Example .......: Yes | 
|---|
| 1048 | ; =============================================================================================================================== | 
|---|
| 1049 | Func _ArrayPush(ByRef $avArray, $vValue, $iDirection = 0) | 
|---|
| 1050 | If (Not IsArray($avArray)) Then Return SetError(1, 0, 0) | 
|---|
| 1051 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, 0) | 
|---|
| 1052 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 1053 | If IsArray($vValue) Then ; $vValue is an array | 
|---|
| 1054 | Local $iUBoundS = UBound($vValue) | 
|---|
| 1055 | If ($iUBoundS - 1) > $iUBound Then Return SetError(2, 0, 0) | 
|---|
| 1056 | ; $vValue is an array smaller than $avArray | 
|---|
| 1057 | If $iDirection Then ; slide right, add to front | 
|---|
| 1058 | For $i = $iUBound To $iUBoundS Step -1 | 
|---|
| 1059 | $avArray[$i] = $avArray[$i - $iUBoundS] | 
|---|
| 1060 | Next | 
|---|
| 1061 | For $i = 0 To $iUBoundS - 1 | 
|---|
| 1062 | $avArray[$i] = $vValue[$i] | 
|---|
| 1063 | Next | 
|---|
| 1064 | Else ; slide left, add to end | 
|---|
| 1065 | For $i = 0 To $iUBound - $iUBoundS | 
|---|
| 1066 | $avArray[$i] = $avArray[$i + $iUBoundS] | 
|---|
| 1067 | Next | 
|---|
| 1068 | For $i = 0 To $iUBoundS - 1 | 
|---|
| 1069 | $avArray[$i + $iUBound - $iUBoundS + 1] = $vValue[$i] | 
|---|
| 1070 | Next | 
|---|
| 1071 | EndIf | 
|---|
| 1072 | Else | 
|---|
| 1073 | If $iDirection Then ; slide right, add to front | 
|---|
| 1074 | For $i = $iUBound To 1 Step -1 | 
|---|
| 1075 | $avArray[$i] = $avArray[$i - 1] | 
|---|
| 1076 | Next | 
|---|
| 1077 | $avArray[0] = $vValue | 
|---|
| 1078 | Else ; slide left, add to end | 
|---|
| 1079 | For $i = 0 To $iUBound - 1 | 
|---|
| 1080 | $avArray[$i] = $avArray[$i + 1] | 
|---|
| 1081 | Next | 
|---|
| 1082 | $avArray[$iUBound] = $vValue | 
|---|
| 1083 | EndIf | 
|---|
| 1084 | EndIf | 
|---|
| 1085 | Return 1 | 
|---|
| 1086 | EndFunc   ;==>_ArrayPush | 
|---|
| 1087 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1088 | ; Name...........: _ArrayReverse | 
|---|
| 1089 | ; Description ...: Takes the given array and reverses the order in which the elements appear in the array. | 
|---|
| 1090 | ; Syntax.........: _ArrayReverse(ByRef $avArray[, $iStart = 0[, $iEnd = 0]]) | 
|---|
| 1091 | ; Parameters ....: $avArray - Array to modify | 
|---|
| 1092 | ;                  $iStart  - [optional] Index of array to start modifying at | 
|---|
| 1093 | ;                  $iEnd    - [optional] Index of array to stop modifying at | 
|---|
| 1094 | ; Return values .: Success - 1 | 
|---|
| 1095 | ;                  Failure - 0, sets @error: | 
|---|
| 1096 | ;                  |1 - $avArray is not an array | 
|---|
| 1097 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 1098 | ;                  |3 - $avArray is not a 1 or 2 dimensional array | 
|---|
| 1099 | ; Author ........: Brian Keene | 
|---|
| 1100 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> -  added $iStart parameter and logic, Tylo - added $iEnd parameter and rewrote it for speed, Ultima - code cleanup, minor optimization | 
|---|
| 1101 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 1102 | ; Remarks .......: | 
|---|
| 1103 | ; Related .......: _ArraySwap | 
|---|
| 1104 | ; Link ..........: | 
|---|
| 1105 | ; Example .......: Yes | 
|---|
| 1106 | ; =============================================================================================================================== | 
|---|
| 1107 | Func _ArrayReverse(ByRef $avArray, $iStart = 0, $iEnd = 0) | 
|---|
| 1108 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 1109 | If UBound($avArray, 0) > 2 Then Return SetError(3, 0, 0) | 
|---|
| 1110 | Local $vTmp, $iUBound = UBound($avArray) - 1 | 
|---|
| 1111 | ; Bounds checking | 
|---|
| 1112 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 1113 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 1114 | If $iStart > $iEnd Then Return SetError(2, 0, 0) | 
|---|
| 1115 | If UBound($avArray, 0) = 1 Then | 
|---|
| 1116 | ; Reverse | 
|---|
| 1117 | For $i = $iStart To Int(($iStart + $iEnd - 1) / 2) | 
|---|
| 1118 | $vTmp = $avArray[$i] | 
|---|
| 1119 | $avArray[$i] = $avArray[$iEnd] | 
|---|
| 1120 | $avArray[$iEnd] = $vTmp | 
|---|
| 1121 | $iEnd -= 1 | 
|---|
| 1122 | Next | 
|---|
| 1123 | Return 1 | 
|---|
| 1124 | Else | 
|---|
| 1125 | ; Reverse | 
|---|
| 1126 | For $i = $iStart To Int(($iStart + $iEnd - 1) / 2) | 
|---|
| 1127 | For $j = 0 To UBound($avArray, 2) - 1 | 
|---|
| 1128 | $vTmp = $avArray[$i][$j] | 
|---|
| 1129 | $avArray[$i][$j] = $avArray[$iEnd][$j] | 
|---|
| 1130 | $avArray[$iEnd][$j] = $vTmp | 
|---|
| 1131 | Next | 
|---|
| 1132 | $iEnd -= 1 | 
|---|
| 1133 | Next | 
|---|
| 1134 | Return 1 | 
|---|
| 1135 | EndIf | 
|---|
| 1136 | EndFunc   ;==>_ArrayReverse | 
|---|
| 1137 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1138 | ; Name...........: _ArraySearch | 
|---|
| 1139 | ; Description ...: Finds an entry within a 1D or 2D array. Similar to _ArrayBinarySearch(), except that the array does not need to be sorted. | 
|---|
| 1140 | ; Syntax.........: _ArraySearch(Const ByRef $avArray, $vValue[, $iStart = 0[, $iEnd = 0[, $iCase = 0[, $iPartial = 0[, $iForward = 1[, $iSubItem = -1]]]]]]) | 
|---|
| 1141 | ; Parameters ....: $avArray  - The array to search | 
|---|
| 1142 | ;                  $vValue   - What to search $avArray for | 
|---|
| 1143 | ;                  $iStart   - [optional] Index of array to start searching at | 
|---|
| 1144 | ;                  $iEnd     - [optional] Index of array to stop searching at | 
|---|
| 1145 | ;                  $iCase    - [optional] If set to 1, search is case sensitive | 
|---|
| 1146 | ;                  $iPartial - [optional] If set to 1, executes a partial search | 
|---|
| 1147 | ;                  $iForward - [optional] If set to 0, searches the array from end to beginning (instead of beginning to end) | 
|---|
| 1148 | ;                  $iSubItem - [optional] Sub-index to search on in 2D arrays | 
|---|
| 1149 | ; Return values .: Success - The index that $vValue was found at | 
|---|
| 1150 | ;                  Failure - -1, sets @error: | 
|---|
| 1151 | ;                  |1 - $avArray is not an array | 
|---|
| 1152 | ;                  |2 - $avArray is not a 1 or 2 dimensional array | 
|---|
| 1153 | ;                  |4 - $iStart is greater than $iEnd | 
|---|
| 1154 | ;                  |6 - $vValue was not found in array | 
|---|
| 1155 | ;                  |7 - $avArray has too many dimensions | 
|---|
| 1156 | ;                  |(3, 5 - Deprecated error codes) | 
|---|
| 1157 | ; Author ........: SolidSnake <MetalGX91 at GMail dot com> | 
|---|
| 1158 | ; Modified.......: gcriaco <gcriaco at gmail dot com>, Ultima - 2D arrays supported, directional search, code cleanup, optimization | 
|---|
| 1159 | ; Remarks .......: This function might be slower than _ArrayBinarySearch() but is useful when the array's order can't be altered. | 
|---|
| 1160 | ; Related .......: _ArrayBinarySearch, _ArrayFindAll | 
|---|
| 1161 | ; Link ..........: | 
|---|
| 1162 | ; Example .......: Yes | 
|---|
| 1163 | ; =============================================================================================================================== | 
|---|
| 1164 | Func _ArraySearch(Const ByRef $avArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iPartial = 0, $iForward = 1, $iSubItem = -1) | 
|---|
| 1165 | If Not IsArray($avArray) Then Return SetError(1, 0, -1) | 
|---|
| 1166 | If UBound($avArray, 0) > 2 Or UBound($avArray, 0) < 1 Then Return SetError(2, 0, -1) | 
|---|
| 1167 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 1168 | ; Bounds checking | 
|---|
| 1169 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 1170 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 1171 | If $iStart > $iEnd Then Return SetError(4, 0, -1) | 
|---|
| 1172 | ; Direction (flip if $iForward = 0) | 
|---|
| 1173 | Local $iStep = 1 | 
|---|
| 1174 | If Not $iForward Then | 
|---|
| 1175 | Local $iTmp = $iStart | 
|---|
| 1176 | $iStart = $iEnd | 
|---|
| 1177 | $iEnd = $iTmp | 
|---|
| 1178 | $iStep = -1 | 
|---|
| 1179 | EndIf | 
|---|
| 1180 | ; Search | 
|---|
| 1181 | Switch UBound($avArray, 0) | 
|---|
| 1182 | Case 1 ; 1D array search | 
|---|
| 1183 | If Not $iPartial Then | 
|---|
| 1184 | If Not $iCase Then | 
|---|
| 1185 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1186 | If $avArray[$i] = $vValue Then Return $i | 
|---|
| 1187 | Next | 
|---|
| 1188 | Else | 
|---|
| 1189 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1190 | If $avArray[$i] == $vValue Then Return $i | 
|---|
| 1191 | Next | 
|---|
| 1192 | EndIf | 
|---|
| 1193 | Else | 
|---|
| 1194 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1195 | If StringInStr($avArray[$i], $vValue, $iCase) > 0 Then Return $i | 
|---|
| 1196 | Next | 
|---|
| 1197 | EndIf | 
|---|
| 1198 | Case 2 ; 2D array search | 
|---|
| 1199 | Local $iUBoundSub = UBound($avArray, 2) - 1 | 
|---|
| 1200 | If $iSubItem > $iUBoundSub Then $iSubItem = $iUBoundSub | 
|---|
| 1201 | If $iSubItem < 0 Then | 
|---|
| 1202 | ; will search for all Col | 
|---|
| 1203 | $iSubItem = 0 | 
|---|
| 1204 | Else | 
|---|
| 1205 | $iUBoundSub = $iSubItem | 
|---|
| 1206 | EndIf | 
|---|
| 1207 | For $j = $iSubItem To $iUBoundSub | 
|---|
| 1208 | If Not $iPartial Then | 
|---|
| 1209 | If Not $iCase Then | 
|---|
| 1210 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1211 | If $avArray[$i][$j] = $vValue Then Return $i | 
|---|
| 1212 | Next | 
|---|
| 1213 | Else | 
|---|
| 1214 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1215 | If $avArray[$i][$j] == $vValue Then Return $i | 
|---|
| 1216 | Next | 
|---|
| 1217 | EndIf | 
|---|
| 1218 | Else | 
|---|
| 1219 | For $i = $iStart To $iEnd Step $iStep | 
|---|
| 1220 | If StringInStr($avArray[$i][$j], $vValue, $iCase) > 0 Then Return $i | 
|---|
| 1221 | Next | 
|---|
| 1222 | EndIf | 
|---|
| 1223 | Next | 
|---|
| 1224 | Case Else | 
|---|
| 1225 | Return SetError(7, 0, -1) | 
|---|
| 1226 | EndSwitch | 
|---|
| 1227 | Return SetError(6, 0, -1) | 
|---|
| 1228 | EndFunc   ;==>_ArraySearch | 
|---|
| 1229 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1230 | ; Name...........: _ArraySort | 
|---|
| 1231 | ; Description ...: Sort a 1D or 2D array on a specific index using the quicksort/insertionsort algorithms. | 
|---|
| 1232 | ; Syntax.........: _ArraySort(ByRef $avArray[, $iDescending = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]]) | 
|---|
| 1233 | ; Parameters ....: $avArray     - Array to sort | 
|---|
| 1234 | ;                  $iDescending - [optional] If set to 1, sort descendingly | 
|---|
| 1235 | ;                  $iStart      - [optional] Index of array to start sorting at | 
|---|
| 1236 | ;                  $iEnd        - [optional] Index of array to stop sorting at | 
|---|
| 1237 | ;                  $iSubItem    - [optional] Sub-index to sort on in 2D arrays | 
|---|
| 1238 | ; Return values .: Success - 1 | 
|---|
| 1239 | ;                  Failure - 0, sets @error: | 
|---|
| 1240 | ;                  |1 - $avArray is not an array | 
|---|
| 1241 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 1242 | ;                  |3 - $iSubItem is greater than subitem count | 
|---|
| 1243 | ;                  |4 - $avArray has too many dimensions | 
|---|
| 1244 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com> | 
|---|
| 1245 | ; Modified.......: LazyCoder - added $iSubItem option, Tylo - implemented stable QuickSort algo, Jos van der Zande - changed logic to correctly Sort arrays with mixed Values and Strings, Ultima - major optimization, code cleanup, removed $i_Dim parameter | 
|---|
| 1246 | ; Remarks .......: | 
|---|
| 1247 | ; Related .......: | 
|---|
| 1248 | ; Link ..........: | 
|---|
| 1249 | ; Example .......: Yes | 
|---|
| 1250 | ; =============================================================================================================================== | 
|---|
| 1251 | Func _ArraySort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 1252 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 1253 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 1254 | ; Bounds checking | 
|---|
| 1255 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 1256 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 1257 | If $iStart > $iEnd Then Return SetError(2, 0, 0) | 
|---|
| 1258 | ; Sort | 
|---|
| 1259 | Switch UBound($avArray, 0) | 
|---|
| 1260 | Case 1 | 
|---|
| 1261 | __ArrayQuickSort1D($avArray, $iStart, $iEnd) | 
|---|
| 1262 | If $iDescending Then _ArrayReverse($avArray, $iStart, $iEnd) | 
|---|
| 1263 | Case 2 | 
|---|
| 1264 | Local $iSubMax = UBound($avArray, 2) - 1 | 
|---|
| 1265 | If $iSubItem > $iSubMax Then Return SetError(3, 0, 0) | 
|---|
| 1266 | If $iDescending Then | 
|---|
| 1267 | $iDescending = -1 | 
|---|
| 1268 | Else | 
|---|
| 1269 | $iDescending = 1 | 
|---|
| 1270 | EndIf | 
|---|
| 1271 | __ArrayQuickSort2D($avArray, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax) | 
|---|
| 1272 | Case Else | 
|---|
| 1273 | Return SetError(4, 0, 0) | 
|---|
| 1274 | EndSwitch | 
|---|
| 1275 | Return 1 | 
|---|
| 1276 | EndFunc   ;==>_ArraySort | 
|---|
| 1277 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1278 | ; Name...........: _ArraySwap | 
|---|
| 1279 | ; Description ...: Swaps two items. | 
|---|
| 1280 | ; Syntax.........: _ArraySwap(ByRef $vItem1, ByRef $vItem2) | 
|---|
| 1281 | ; Parameters ....: $vItem1 - First item to swap | 
|---|
| 1282 | ;                  $vItem2 - Second item to swap | 
|---|
| 1283 | ; Return values .: None. | 
|---|
| 1284 | ; Author ........: David Nuttall <danuttall at rocketmail dot com> | 
|---|
| 1285 | ; Modified.......: Ultima - minor optimization | 
|---|
| 1286 | ; Remarks .......: This function swaps the two items in place, since they're passed by reference. Regular, non-array variables can also be swapped by this function. | 
|---|
| 1287 | ; Related .......: _ArrayReverse | 
|---|
| 1288 | ; Link ..........: | 
|---|
| 1289 | ; Example .......: Yes | 
|---|
| 1290 | ; =============================================================================================================================== | 
|---|
| 1291 | Func _ArraySwap(ByRef $vItem1, ByRef $vItem2) | 
|---|
| 1292 | Local $vTmp = $vItem1 | 
|---|
| 1293 | $vItem1 = $vItem2 | 
|---|
| 1294 | $vItem2 = $vTmp | 
|---|
| 1295 | EndFunc   ;==>_ArraySwap | 
|---|
| 1296 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1297 | ; Name...........: _ArrayToClip | 
|---|
| 1298 | ; Description ...: Sends the contents of an array to the clipboard, each element delimited by a carriage return. | 
|---|
| 1299 | ; Syntax.........: _ArrayToClip(Const ByRef $avArray[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]) | 
|---|
| 1300 | ; Parameters ....: $avArray - Array to copy to clipboard | 
|---|
| 1301 | ;                  $iStart  - [optional] Index of array to start copying at | 
|---|
| 1302 | ;                  $iEnd    - [optional] Index of array to stop copying at | 
|---|
| 1303 | ;                  $iSubItem- [optional] Dimension of array to copy | 
|---|
| 1304 | ; Return values .: Success - 1 | 
|---|
| 1305 | ;                  Failure - 0, sets @error: | 
|---|
| 1306 | ;                  |-1 - ClipPut() failed | 
|---|
| 1307 | ;                  |Other - See _ArrayToString() description for error codes | 
|---|
| 1308 | ; Author ........: Cephas <cephas at clergy dot net> | 
|---|
| 1309 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - added $iStart parameter and logic, Ultima - added $iEnd parameter, make use of _ArrayToString() instead of duplicating efforts | 
|---|
| 1310 | ; Remarks .......: | 
|---|
| 1311 | ; Related .......: _ArrayToString | 
|---|
| 1312 | ; Link ..........: | 
|---|
| 1313 | ; Example .......: Yes | 
|---|
| 1314 | ; =============================================================================================================================== | 
|---|
| 1315 | Func _ArrayToClip(Const ByRef $avArray, $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 1316 | If UBound($avArray, 0) = 1 Then | 
|---|
| 1317 | Local $sResult = _ArrayToString($avArray, @CR, $iStart, $iEnd) | 
|---|
| 1318 | If @error Then Return SetError(@error, 0, 0) | 
|---|
| 1319 | Return ClipPut($sResult) | 
|---|
| 1320 | Else | 
|---|
| 1321 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 1322 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 1323 | Local $sResult = _ArrayToString($avArray, @CR, $iStart, $iEnd, $iSubItem) | 
|---|
| 1324 | If @error Then Return SetError(@error, 0, 0) | 
|---|
| 1325 | Return ClipPut($sResult) | 
|---|
| 1326 | EndIf | 
|---|
| 1327 | EndFunc   ;==>_ArrayToClip | 
|---|
| 1328 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1329 | ; Name...........: _ArrayToString | 
|---|
| 1330 | ; Description ...: Places the elements of an array into a single string, separated by the specified delimiter. | 
|---|
| 1331 | ; Syntax.........: _ArrayToString(Const ByRef $avArray[, $sDelim = "|"[, $iStart = 0[, $iEnd = 0]]]) | 
|---|
| 1332 | ; Parameters ....: $avArray - Array to combine | 
|---|
| 1333 | ;                  $sDelim  - [optional] Delimiter for combined string | 
|---|
| 1334 | ;                  $iStart  - [optional] Index of array to start combining at | 
|---|
| 1335 | ;                  $iEnd    - [optional] Index of array to stop combining at | 
|---|
| 1336 | ;                  $iSubItem- [optional] Subitem to copy | 
|---|
| 1337 | ; Return values .: Success - string which combined selected elements separated by the delimiter string. | 
|---|
| 1338 | ;                  Failure - "", sets @error: | 
|---|
| 1339 | ;                  |1 - $avArray is not an array | 
|---|
| 1340 | ;                  |2 - $iStart is greater than $iEnd | 
|---|
| 1341 | ;                  |3 - $avArray is not an 1 or 2 dimensional array | 
|---|
| 1342 | ; Author ........: Brian Keene <brian_keene at yahoo dot com>, Valik - rewritten | 
|---|
| 1343 | ; Modified.......: Ultima - code cleanup | 
|---|
| 1344 | ; Modified.......: BrewManNH - Added 2D array support | 
|---|
| 1345 | ; Remarks .......: | 
|---|
| 1346 | ; Related .......: StringSplit, _ArrayToClip | 
|---|
| 1347 | ; Link ..........: | 
|---|
| 1348 | ; Example .......: Yes | 
|---|
| 1349 | ; =============================================================================================================================== | 
|---|
| 1350 | Func _ArrayToString(Const ByRef $avArray, $sDelim = "|", $iStart = 0, $iEnd = 0, $iSubItem = 0) | 
|---|
| 1351 | If Not IsArray($avArray) Then Return SetError(1, 0, "") | 
|---|
| 1352 | If UBound($avArray, 0) > 2 Then Return SetError(3, 0, "") | 
|---|
| 1353 | Local $sResult, $iUBound = UBound($avArray) - 1 | 
|---|
| 1354 | ; Bounds checking | 
|---|
| 1355 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 1356 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 1357 | If $iStart > $iEnd Then Return SetError(2, 0, "") | 
|---|
| 1358 | If UBound($avArray, 0) = 1 Then | 
|---|
| 1359 | ; Combine | 
|---|
| 1360 | For $i = $iStart To $iEnd | 
|---|
| 1361 | $sResult &= $avArray[$i] & $sDelim | 
|---|
| 1362 | Next | 
|---|
| 1363 | Return StringTrimRight($sResult, StringLen($sDelim)) | 
|---|
| 1364 | Else | 
|---|
| 1365 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1 | 
|---|
| 1366 | If $iSubItem < 1 Then $iSubItem = 0 | 
|---|
| 1367 | ; Combine | 
|---|
| 1368 | For $i = $iStart To $iEnd | 
|---|
| 1369 | $sResult &= $avArray[$i][$iSubItem] & $sDelim | 
|---|
| 1370 | Next | 
|---|
| 1371 | Return StringTrimRight($sResult, StringLen($sDelim)) | 
|---|
| 1372 | EndIf | 
|---|
| 1373 | EndFunc   ;==>_ArrayToString | 
|---|
| 1374 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1375 | ; Name...........: _ArrayTrim | 
|---|
| 1376 | ; Description ...: Trims a certain number of characters from all elements in an array. | 
|---|
| 1377 | ; Syntax.........: _ArrayTrim(ByRef $avArray, $iTrimNum[, $iDirection = 0[, $iStart = 0[, $iEnd = 0]]]) | 
|---|
| 1378 | ; Parameters ....: $avArray    - Array to modify | 
|---|
| 1379 | ;                  $iTrimNum   - Number of characters to remove | 
|---|
| 1380 | ;                  $iDirection - [optional] Direction to trim: | 
|---|
| 1381 | ;                  |0 - trim left | 
|---|
| 1382 | ;                  |1 - trim right | 
|---|
| 1383 | ;                  $iStart     - [optional] Index of array to start trimming at | 
|---|
| 1384 | ;                  $iEnd       - [optional] Index of array to stop trimming at | 
|---|
| 1385 | ; Return values .: Success - 1 | 
|---|
| 1386 | ;                  Failure - 0, sets @error: | 
|---|
| 1387 | ;                  |1 - $avArray is not an array | 
|---|
| 1388 | ;                  |2 - $avArray is not an 1 or 2 dimensional array | 
|---|
| 1389 | ;                  |5 - $iStart is greater than $iEnd | 
|---|
| 1390 | ;                  |(3-4 - Deprecated error codes) | 
|---|
| 1391 | ; Author ........: Adam Moore (redndahead) | 
|---|
| 1392 | ; Modified.......: Ultima - code cleanup, optimization | 
|---|
| 1393 | ; Remarks .......: | 
|---|
| 1394 | ; Related .......: | 
|---|
| 1395 | ; Link ..........: | 
|---|
| 1396 | ; Example .......: Yes | 
|---|
| 1397 | ; =============================================================================================================================== | 
|---|
| 1398 | Func _ArrayTrim(ByRef $avArray, $iTrimNum, $iDirection = 0, $iStart = 0, $iEnd = 0) | 
|---|
| 1399 | If Not IsArray($avArray) Then Return SetError(1, 0, 0) | 
|---|
| 1400 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, 0) | 
|---|
| 1401 | Local $iUBound = UBound($avArray) - 1 | 
|---|
| 1402 | ; Bounds checking | 
|---|
| 1403 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound | 
|---|
| 1404 | If $iStart < 0 Then $iStart = 0 | 
|---|
| 1405 | If $iStart > $iEnd Then Return SetError(5, 0, 0) | 
|---|
| 1406 | If UBound($avArray, 0) = 1 Then | 
|---|
| 1407 | ; Trim | 
|---|
| 1408 | If $iDirection Then | 
|---|
| 1409 | For $i = $iStart To $iEnd | 
|---|
| 1410 | $avArray[$i] = StringTrimRight($avArray[$i], $iTrimNum) | 
|---|
| 1411 | Next | 
|---|
| 1412 | Else | 
|---|
| 1413 | For $i = $iStart To $iEnd | 
|---|
| 1414 | $avArray[$i] = StringTrimLeft($avArray[$i], $iTrimNum) | 
|---|
| 1415 | Next | 
|---|
| 1416 | EndIf | 
|---|
| 1417 | Return 1 | 
|---|
| 1418 | Else | 
|---|
| 1419 | ; Trim | 
|---|
| 1420 | If $iDirection Then | 
|---|
| 1421 | For $i = $iStart To $iEnd | 
|---|
| 1422 | For $j = 0 To UBound($avArray, 2) - 1 | 
|---|
| 1423 | $avArray[$i][$j] = StringTrimRight($avArray[$i][$j], $iTrimNum) | 
|---|
| 1424 | Next | 
|---|
| 1425 | Next | 
|---|
| 1426 | Else | 
|---|
| 1427 | For $i = $iStart To $iEnd | 
|---|
| 1428 | For $j = 0 To UBound($avArray, 2) - 1 | 
|---|
| 1429 | $avArray[$i][$j] = StringTrimLeft($avArray[$i][$j], $iTrimNum) | 
|---|
| 1430 | Next | 
|---|
| 1431 | Next | 
|---|
| 1432 | EndIf | 
|---|
| 1433 | Return 1 | 
|---|
| 1434 | EndIf | 
|---|
| 1435 | EndFunc   ;==>_ArrayTrim | 
|---|
| 1436 | ; #FUNCTION# ==================================================================================================================== | 
|---|
| 1437 | ; Name...........: _ArrayUnique | 
|---|
| 1438 | ; Description ...: Returns the Elements of a 1 or 2-dimensional array deleting all duplicate items | 
|---|
| 1439 | ; Syntax.........: _ArrayUnique($aArray[, $iDimension = 1[, $iBase = 0[, $iCase = 0[, $vDelim = "|"]]]]) | 
|---|
| 1440 | ; Parameters ....: $aArray - The Array to use | 
|---|
| 1441 | ;                  $iDimension  - [optional] The Dimension of the Array to use | 
|---|
| 1442 | ;                  $iBase  - [optional] Is the Array 0-base or 1-base index.  0-base by default | 
|---|
| 1443 | ;                  $iCase  - [optional] Flag to indicate if the operations should be case sensitive. | 
|---|
| 1444 | ;                  0 = not case sensitive, using the user's locale (default) | 
|---|
| 1445 | ;                  1 = case sensitive | 
|---|
| 1446 | ;                  2 = not case sensitive, using a basic/faster comparison | 
|---|
| 1447 | ;                  $vDelim  - [optional] One or more characters to use as delimiters.  However, cannot forsee its usefullness | 
|---|
| 1448 | ; Return values .: Success - Returns a 1-dimensional array containing only the unique elements of that Dimension | 
|---|
| 1449 | ;                  Failure - Returns 0 and Sets @Error: | 
|---|
| 1450 | ;                  0 - No error. | 
|---|
| 1451 | ;                  1 - Returns 0 if parameter is not an array. | 
|---|
| 1452 | ;                  2 - _ArrayUnique failed for some other reason | 
|---|
| 1453 | ;                  3 - Array dimension is invalid, should be an integer greater than 0 | 
|---|
| 1454 | ; Author ........: SmOke_N | 
|---|
| 1455 | ; Modified.......: litlmike | 
|---|
| 1456 | ; Remarks .......: Returns an array, the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.) contain the unique strings. | 
|---|
| 1457 | ; Related .......: _ArrayMax, _ArrayMin | 
|---|
| 1458 | ; Link ..........: | 
|---|
| 1459 | ; Example .......: Yes | 
|---|
| 1460 | ; =============================================================================================================================== | 
|---|
| 1461 | Func _ArrayUnique($aArray, $iDimension = 1, $iBase = 0, $iCase = 0, $vDelim = "|") | 
|---|
| 1462 | Local $iUboundDim | 
|---|
| 1463 | ;$aArray used to be ByRef, but litlmike altered it to allow for the choosing of 1 Array Dimension, without altering the original array | 
|---|
| 1464 | If $vDelim = "|" Then $vDelim = Chr(01) ; by SmOke_N, modified by litlmike | 
|---|
| 1465 | If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;Check to see if it is valid array | 
|---|
| 1466 | ;Checks that the given Dimension is Valid | 
|---|
| 1467 | If Not $iDimension > 0 Then | 
|---|
| 1468 | Return SetError(3, 0, 0) ;Check to see if it is valid array dimension, Should be greater than 0 | 
|---|
| 1469 | Else | 
|---|
| 1470 | ;If Dimension Exists, then get the number of "Rows" | 
|---|
| 1471 | $iUboundDim = UBound($aArray, 1) ;Get Number of "Rows" | 
|---|
| 1472 | If @error Then Return SetError(3, 0, 0) ;2 = Array dimension is invalid. | 
|---|
| 1473 | ;If $iDimension Exists, And the number of "Rows" is Valid: | 
|---|
| 1474 | If $iDimension > 1 Then ;Makes sure the Array dimension desired is more than 1-dimensional | 
|---|
| 1475 | Local $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user | 
|---|
| 1476 | For $i = 0 To $iUboundDim - 1 ;Loop through "Rows" | 
|---|
| 1477 | _ArrayAdd($aArrayTmp, $aArray[$i][$iDimension - 1]) ;$iDimension-1 to match Dimension | 
|---|
| 1478 | Next | 
|---|
| 1479 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank | 
|---|
| 1480 | Else ;Makes sure the Array dimension desired is 1-dimensional | 
|---|
| 1481 | ;If Dimension Exists, And the number of "Rows" is Valid, and the Dimension desired is not > 1, then: | 
|---|
| 1482 | ;For the Case that the array is 1-Dimensional | 
|---|
| 1483 | If UBound($aArray, 0) = 1 Then ;Makes sure the Array is only 1-Dimensional | 
|---|
| 1484 | Dim $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user | 
|---|
| 1485 | For $i = 0 To $iUboundDim - 1 | 
|---|
| 1486 | _ArrayAdd($aArrayTmp, $aArray[$i]) | 
|---|
| 1487 | Next | 
|---|
| 1488 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank | 
|---|
| 1489 | Else ;For the Case that the array is 2-Dimensional | 
|---|
| 1490 | Dim $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user | 
|---|
| 1491 | For $i = 0 To $iUboundDim - 1 | 
|---|
| 1492 | _ArrayAdd($aArrayTmp, $aArray[$i][$iDimension - 1]) ;$iDimension-1 to match Dimension | 
|---|
| 1493 | Next | 
|---|
| 1494 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank | 
|---|
| 1495 | EndIf | 
|---|
| 1496 | EndIf | 
|---|
| 1497 | EndIf | 
|---|
| 1498 | Local $sHold ;String that holds the Unique array info | 
|---|
| 1499 | For $iCC = $iBase To UBound($aArrayTmp) - 1 ;Loop Through array | 
|---|
| 1500 | ;If Not the case that the element is already in $sHold, then add it | 
|---|
| 1501 | If Not StringInStr($vDelim & $sHold, $vDelim & $aArrayTmp[$iCC] & $vDelim, $iCase) Then _ | 
|---|
| 1502 | $sHold &= $aArrayTmp[$iCC] & $vDelim | 
|---|
| 1503 | Next | 
|---|
| 1504 | If $sHold Then | 
|---|
| 1505 | $aArrayTmp = StringSplit(StringTrimRight($sHold, StringLen($vDelim)), $vDelim, 1) ;Split the string into an array | 
|---|
| 1506 | Return $aArrayTmp ;SmOke_N's version used to Return SetError(0, 0, 0) | 
|---|
| 1507 | EndIf | 
|---|
| 1508 | Return SetError(2, 0, 0) ;If the script gets this far, it has failed | 
|---|
| 1509 | EndFunc   ;==>_ArrayUnique | 
|---|
| 1510 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 1511 | ; Name...........: __Array_Combinations | 
|---|
| 1512 | ; Description ...: Creates Combination | 
|---|
| 1513 | ; Syntax.........: __Array_Combinations($iN, $iR) | 
|---|
| 1514 | ; Parameters ....: $iN - Value passed on from UBound($avArray) | 
|---|
| 1515 | ;                  $iR - Size of the combinations set | 
|---|
| 1516 | ; Return values .: Integer value of the number of combinations | 
|---|
| 1517 | ; Author ........: Erik Pilsits | 
|---|
| 1518 | ; Modified.......: 07/08/2008 | 
|---|
| 1519 | ; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen. | 
|---|
| 1520 | ;+ | 
|---|
| 1521 | ;                   http://www.bearcave.com/random_hacks/permute.html | 
|---|
| 1522 | ; Related .......: | 
|---|
| 1523 | ; Link ..........: | 
|---|
| 1524 | ; Example .......: | 
|---|
| 1525 | ; =============================================================================================================================== | 
|---|
| 1526 | Func __Array_Combinations($iN, $iR) | 
|---|
| 1527 | Local $i_Total = 1 | 
|---|
| 1528 | For $i = $iR To 1 Step -1 | 
|---|
| 1529 | $i_Total *= ($iN / $i) | 
|---|
| 1530 | $iN -= 1 | 
|---|
| 1531 | Next | 
|---|
| 1532 | Return Round($i_Total) | 
|---|
| 1533 | EndFunc   ;==>__Array_Combinations | 
|---|
| 1534 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 1535 | ; Name...........: __Array_ExeterInternal | 
|---|
| 1536 | ; Description ...: Permute Function based on an algorithm from Exeter University. | 
|---|
| 1537 | ; Syntax.........: __Array_ExeterInternal(ByRef $avArray, $iStart, $iSize, $sDelim, ByRef $aIdx, ByRef $aResult) | 
|---|
| 1538 | ; Parameters ....: $avArray - The Array to get Permutations | 
|---|
| 1539 | ;                  $iStart - Starting Point for Loop | 
|---|
| 1540 | ;                  $iSize - End Point for Loop | 
|---|
| 1541 | ;                  $sDelim - String result separator | 
|---|
| 1542 | ;                  $aIdx - Array Used in Rotations | 
|---|
| 1543 | ;                  $aResult - Resulting Array | 
|---|
| 1544 | ; Return values .: Success      - Computer name | 
|---|
| 1545 | ; Author ........: Erik Pilsits | 
|---|
| 1546 | ; Modified.......: 07/08/2008 | 
|---|
| 1547 | ; Remarks .......: This function is used internally. Permute Function based on an algorithm from Exeter University. | 
|---|
| 1548 | ;+ | 
|---|
| 1549 | ;                   http://www.bearcave.com/random_hacks/permute.html | 
|---|
| 1550 | ; Related .......: | 
|---|
| 1551 | ; Link ..........: | 
|---|
| 1552 | ; Example .......: | 
|---|
| 1553 | ; =============================================================================================================================== | 
|---|
| 1554 | Func __Array_ExeterInternal(ByRef $avArray, $iStart, $iSize, $sDelim, ByRef $aIdx, ByRef $aResult, ByRef $iCount) | 
|---|
| 1555 | If $iStart == $iSize - 1 Then | 
|---|
| 1556 | For $i = 0 To $iSize - 1 | 
|---|
| 1557 | $aResult[$iCount] &= $avArray[$aIdx[$i]] & $sDelim | 
|---|
| 1558 | Next | 
|---|
| 1559 | If $sDelim <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1) | 
|---|
| 1560 | $iCount += 1 | 
|---|
| 1561 | Else | 
|---|
| 1562 | Local $iTemp | 
|---|
| 1563 | For $i = $iStart To $iSize - 1 | 
|---|
| 1564 | $iTemp = $aIdx[$i] | 
|---|
| 1565 | $aIdx[$i] = $aIdx[$iStart] | 
|---|
| 1566 | $aIdx[$iStart] = $iTemp | 
|---|
| 1567 | __Array_ExeterInternal($avArray, $iStart + 1, $iSize, $sDelim, $aIdx, $aResult, $iCount) | 
|---|
| 1568 | $aIdx[$iStart] = $aIdx[$i] | 
|---|
| 1569 | $aIdx[$i] = $iTemp | 
|---|
| 1570 | Next | 
|---|
| 1571 | EndIf | 
|---|
| 1572 | EndFunc   ;==>__Array_ExeterInternal | 
|---|
| 1573 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 1574 | ; Name...........: __Array_GetNext | 
|---|
| 1575 | ; Description ...: Creates Combination | 
|---|
| 1576 | ; Syntax.........: __Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx) | 
|---|
| 1577 | ; Parameters ....: $iN - Value passed on from UBound($avArray) | 
|---|
| 1578 | ;                  $iR - Size of the combinations set | 
|---|
| 1579 | ;                  $iLeft - Remaining number of combinations | 
|---|
| 1580 | ;                  $iTotal - Total number of combinations | 
|---|
| 1581 | ;                  $aIdx - Array containing combinations | 
|---|
| 1582 | ; Return values .: Function only changes values ByRef | 
|---|
| 1583 | ; Author ........: Erik Pilsits | 
|---|
| 1584 | ; Modified.......: 07/08/2008 | 
|---|
| 1585 | ; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen. | 
|---|
| 1586 | ;+ | 
|---|
| 1587 | ;                   http://www.bearcave.com/random_hacks/permute.html | 
|---|
| 1588 | ; Related .......: | 
|---|
| 1589 | ; Link ..........: | 
|---|
| 1590 | ; Example .......: | 
|---|
| 1591 | ; =============================================================================================================================== | 
|---|
| 1592 | Func __Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx) | 
|---|
| 1593 | If $iLeft == $iTotal Then | 
|---|
| 1594 | $iLeft -= 1 | 
|---|
| 1595 | Return | 
|---|
| 1596 | EndIf | 
|---|
| 1597 | Local $i = $iR - 1 | 
|---|
| 1598 | While $aIdx[$i] == $iN - $iR + $i | 
|---|
| 1599 | $i -= 1 | 
|---|
| 1600 | WEnd | 
|---|
| 1601 | $aIdx[$i] += 1 | 
|---|
| 1602 | For $j = $i + 1 To $iR - 1 | 
|---|
| 1603 | $aIdx[$j] = $aIdx[$i] + $j - $i | 
|---|
| 1604 | Next | 
|---|
| 1605 | $iLeft -= 1 | 
|---|
| 1606 | EndFunc   ;==>__Array_GetNext | 
|---|
| 1607 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 1608 | ; Name...........: __ArrayQuickSort1D | 
|---|
| 1609 | ; Description ...: Helper function for sorting 1D arrays | 
|---|
| 1610 | ; Syntax.........: __ArrayQuickSort1D(ByRef $avArray, ByRef $iStart, ByRef $iEnd) | 
|---|
| 1611 | ; Parameters ....: $avArray - Array to sort | 
|---|
| 1612 | ;                  $iStart  - Index of array to start sorting at | 
|---|
| 1613 | ;                  $iEnd    - Index of array to stop sorting at | 
|---|
| 1614 | ; Return values .: None | 
|---|
| 1615 | ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima | 
|---|
| 1616 | ; Modified.......: | 
|---|
| 1617 | ; Remarks .......: For Internal Use Only | 
|---|
| 1618 | ; Related .......: | 
|---|
| 1619 | ; Link ..........: | 
|---|
| 1620 | ; Example .......: | 
|---|
| 1621 | ; =============================================================================================================================== | 
|---|
| 1622 | Func __ArrayQuickSort1D(ByRef $avArray, ByRef $iStart, ByRef $iEnd) | 
|---|
| 1623 | If $iEnd <= $iStart Then Return | 
|---|
| 1624 | Local $vTmp | 
|---|
| 1625 | ; InsertionSort (faster for smaller segments) | 
|---|
| 1626 | If ($iEnd - $iStart) < 15 Then | 
|---|
| 1627 | Local $vCur | 
|---|
| 1628 | For $i = $iStart + 1 To $iEnd | 
|---|
| 1629 | $vTmp = $avArray[$i] | 
|---|
| 1630 | If IsNumber($vTmp) Then | 
|---|
| 1631 | For $j = $i - 1 To $iStart Step -1 | 
|---|
| 1632 | $vCur = $avArray[$j] | 
|---|
| 1633 | ; If $vTmp >= $vCur Then ExitLoop | 
|---|
| 1634 | If ($vTmp >= $vCur And IsNumber($vCur)) Or (Not IsNumber($vCur) And StringCompare($vTmp, $vCur) >= 0) Then ExitLoop | 
|---|
| 1635 | $avArray[$j + 1] = $vCur | 
|---|
| 1636 | Next | 
|---|
| 1637 | Else | 
|---|
| 1638 | For $j = $i - 1 To $iStart Step -1 | 
|---|
| 1639 | If (StringCompare($vTmp, $avArray[$j]) >= 0) Then ExitLoop | 
|---|
| 1640 | $avArray[$j + 1] = $avArray[$j] | 
|---|
| 1641 | Next | 
|---|
| 1642 | EndIf | 
|---|
| 1643 | $avArray[$j + 1] = $vTmp | 
|---|
| 1644 | Next | 
|---|
| 1645 | Return | 
|---|
| 1646 | EndIf | 
|---|
| 1647 | ; QuickSort | 
|---|
| 1648 | Local $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)], $fNum = IsNumber($vPivot) | 
|---|
| 1649 | Do | 
|---|
| 1650 | If $fNum Then | 
|---|
| 1651 | ; While $avArray[$L] < $vPivot | 
|---|
| 1652 | While ($avArray[$L] < $vPivot And IsNumber($avArray[$L])) Or (Not IsNumber($avArray[$L]) And StringCompare($avArray[$L], $vPivot) < 0) | 
|---|
| 1653 | $L += 1 | 
|---|
| 1654 | WEnd | 
|---|
| 1655 | ; While $avArray[$R] > $vPivot | 
|---|
| 1656 | While ($avArray[$R] > $vPivot And IsNumber($avArray[$R])) Or (Not IsNumber($avArray[$R]) And StringCompare($avArray[$R], $vPivot) > 0) | 
|---|
| 1657 | $R -= 1 | 
|---|
| 1658 | WEnd | 
|---|
| 1659 | Else | 
|---|
| 1660 | While (StringCompare($avArray[$L], $vPivot) < 0) | 
|---|
| 1661 | $L += 1 | 
|---|
| 1662 | WEnd | 
|---|
| 1663 | While (StringCompare($avArray[$R], $vPivot) > 0) | 
|---|
| 1664 | $R -= 1 | 
|---|
| 1665 | WEnd | 
|---|
| 1666 | EndIf | 
|---|
| 1667 | ; Swap | 
|---|
| 1668 | If $L <= $R Then | 
|---|
| 1669 | $vTmp = $avArray[$L] | 
|---|
| 1670 | $avArray[$L] = $avArray[$R] | 
|---|
| 1671 | $avArray[$R] = $vTmp | 
|---|
| 1672 | $L += 1 | 
|---|
| 1673 | $R -= 1 | 
|---|
| 1674 | EndIf | 
|---|
| 1675 | Until $L > $R | 
|---|
| 1676 | __ArrayQuickSort1D($avArray, $iStart, $R) | 
|---|
| 1677 | __ArrayQuickSort1D($avArray, $L, $iEnd) | 
|---|
| 1678 | EndFunc   ;==>__ArrayQuickSort1D | 
|---|
| 1679 | ; #INTERNAL_USE_ONLY# =========================================================================================================== | 
|---|
| 1680 | ; Name...........: __ArrayQuickSort2D | 
|---|
| 1681 | ; Description ...: Helper function for sorting 2D arrays | 
|---|
| 1682 | ; Syntax.........: __ArrayQuickSort2D(ByRef $avArray, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax) | 
|---|
| 1683 | ; Parameters ....: $avArray  - Array to sort | 
|---|
| 1684 | ;                  $iStep    - Step size (should be 1 to sort ascending, -1 to sort descending!) | 
|---|
| 1685 | ;                  $iStart   - Index of array to start sorting at | 
|---|
| 1686 | ;                  $iEnd     - Index of array to stop sorting at | 
|---|
| 1687 | ;                  $iSubItem - Sub-index to sort on in 2D arrays | 
|---|
| 1688 | ;                  $iSubMax  - Maximum sub-index that array has | 
|---|
| 1689 | ; Return values .: None | 
|---|
| 1690 | ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima | 
|---|
| 1691 | ; Modified.......: | 
|---|
| 1692 | ; Remarks .......: For Internal Use Only | 
|---|
| 1693 | ; Related .......: | 
|---|
| 1694 | ; Link ..........: | 
|---|
| 1695 | ; Example .......: | 
|---|
| 1696 | ; =============================================================================================================================== | 
|---|
| 1697 | Func __ArrayQuickSort2D(ByRef $avArray, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax) | 
|---|
| 1698 | If $iEnd <= $iStart Then Return | 
|---|
| 1699 | ; QuickSort | 
|---|
| 1700 | Local $vTmp, $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)][$iSubItem], $fNum = IsNumber($vPivot) | 
|---|
| 1701 | Do | 
|---|
| 1702 | If $fNum Then | 
|---|
| 1703 | ; While $avArray[$L][$iSubItem] < $vPivot | 
|---|
| 1704 | While ($iStep * ($avArray[$L][$iSubItem] - $vPivot) < 0 And IsNumber($avArray[$L][$iSubItem])) Or (Not IsNumber($avArray[$L][$iSubItem]) And $iStep * StringCompare($avArray[$L][$iSubItem], $vPivot) < 0) | 
|---|
| 1705 | $L += 1 | 
|---|
| 1706 | WEnd | 
|---|
| 1707 | ; While $avArray[$R][$iSubItem] > $vPivot | 
|---|
| 1708 | While ($iStep * ($avArray[$R][$iSubItem] - $vPivot) > 0 And IsNumber($avArray[$R][$iSubItem])) Or (Not IsNumber($avArray[$R][$iSubItem]) And $iStep * StringCompare($avArray[$R][$iSubItem], $vPivot) > 0) | 
|---|
| 1709 | $R -= 1 | 
|---|
| 1710 | WEnd | 
|---|
| 1711 | Else | 
|---|
| 1712 | While ($iStep * StringCompare($avArray[$L][$iSubItem], $vPivot) < 0) | 
|---|
| 1713 | $L += 1 | 
|---|
| 1714 | WEnd | 
|---|
| 1715 | While ($iStep * StringCompare($avArray[$R][$iSubItem], $vPivot) > 0) | 
|---|
| 1716 | $R -= 1 | 
|---|
| 1717 | WEnd | 
|---|
| 1718 | EndIf | 
|---|
| 1719 | ; Swap | 
|---|
| 1720 | If $L <= $R Then | 
|---|
| 1721 | For $i = 0 To $iSubMax | 
|---|
| 1722 | $vTmp = $avArray[$L][$i] | 
|---|
| 1723 | $avArray[$L][$i] = $avArray[$R][$i] | 
|---|
| 1724 | $avArray[$R][$i] = $vTmp | 
|---|
| 1725 | Next | 
|---|
| 1726 | $L += 1 | 
|---|
| 1727 | $R -= 1 | 
|---|
| 1728 | EndIf | 
|---|
| 1729 | Until $L > $R | 
|---|
| 1730 | __ArrayQuickSort2D($avArray, $iStep, $iStart, $R, $iSubItem, $iSubMax) | 
|---|
| 1731 | __ArrayQuickSort2D($avArray, $iStep, $L, $iEnd, $iSubItem, $iSubMax) | 
|---|
| 1732 | EndFunc   ;==>__ArrayQuickSort2D | 
|---|