;Anmerkung: @error=7 bedeutet, dass die Variable, ; die als Dictionary übergeben wurde, kein Array ist!!!! ;Danksagungen: Danke an BugFix für 2 seiner supertollen 2D Array funktionen. ; Danke an SEuBo für das "DescribeIt" Tool ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_Create() ; Description ...: Das Dictionary mit den Elementen wird erstellt ; Syntax ........: _Dict_Create($sExpression) ; Parameters ....: $sExpression - Der Ausdruck für ein Wertepaar. ; |Syntax: Key:Value;Key2:Value2 usw... ; Return values .: Success ; |Das Dictionary wird zurückgegeben ; Failure ; |@error = 1: Fehlerhafte Syntax ; Author ........: PrideRage ; ================================================================================================= Func _Dict_Create($sExpression) Local $exps = StringSplit($sExpression, ";", 2) Dim $dict[2][256] ; 256 kann nach belieben angepasst werden, wenn man mehr als 256 Wertepaare braucht Dim $tempSplitter For $i = 0 To UBound($exps) - 1 $tempSplitter = StringSplit($exps[$i], ":") If @error Then Return @error $dict[0][$i] = $tempSplitter[1] $dict[1][$i] = $tempSplitter[2] Next For $a = 256 To 0 Step -1 _Array2DEmptyDel($dict, 1) Next Return $dict EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_Add() ; Description ...: Fügt ein neues Wertepaar hinzu, Syntax: siehe _Dictionary() Funktion ; Syntax ........: _Dict_Add(ByRef $aDictionary, $sExpression) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; $sExpression - Der Ausdrück, der benutzt werden soll. ; |Selbe Syntax wie bei der _Dictionary Funktion ; Return values .: Success ; |Dictionary wird erfolgreich geändert ; Failure ; |@error = 7 ; |Oder siehe @error der _Dictionary() Funktion ; Author ........: PrideRage ; ================================================================================================= Func _Dict_Add(ByRef $aDictionary, $sExpression) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) Local $old_len = UBound($aDictionary,2) Local $new_dict = _Dict_Create($sExpression) If @error Then Return @error Local $new_len = _Dict_GetLen($new_dict) + _Dict_GetLen($aDictionary) ReDim $aDictionary[2][$new_len] Local $a = 0 For $i = $old_len To $new_len - 1 $aDictionary[0][$i] = $new_dict[0][$a] $aDictionary[1][$i] = $new_dict[1][$a] $a += 1 Next EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_Del() ; Description ...: Löscht ein Wertepaar ; Syntax ........: _Dict_Del(ByRef $aDictionary, $iElement) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; $iElement - Das Element, das gelöscht werden soll. ; Return values .: Success ; |Das Dictionary wird erfolgreich geändert ; Failure ; |@error = 7 ; Author ........: PrideRage ; ================================================================================================= Func _Dict_Del(ByRef $aDictionary, $iElement) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) $aDictionary[0][$iElement] = "" $aDictionary[1][$iElement] = "" _Array2DEmptyDel($aDictionary, 1) EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_GetKey() ; Description ...: Gibt den Namens eines Schlüssels anhand des Wertes zurück ; Syntax ........: _Dict_GetKey(ByRef $aDictionary, $sValue) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; $sValue - Der Wert mit dem gesucht wird. ; Return values .: Success ; |Der Name des Schlüssels ; Failure ; |@error = 7 ; |Oder siehe @error bei _Array2DSearch ; Author ........: PrideRage ; ================================================================================================= Func _Dict_GetKey(ByRef $aDictionary, $sValue) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) Local $result = _Array2DSearch($aDictionary, $sValue) If @error Then Return @error Local $index = StringSplit($result[1], "|") Return $aDictionary[0][$index[2]] EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_GetLen() ; Description ...: Gibt die Anzahl der Wertepaare zurück. ; Syntax ........: _Dict_GetLen(ByRef $aDictionary) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; Return values .: Success ; |Anzahl der Wertepaare ; Failure ; |@error = 7 ; Author ........: PrideRage ; ================================================================================================= Func _Dict_GetLen(ByRef $aDictionary) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) Return UBound($aDictionary, 2) EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_GetValue() ; Description ...: Gibt den Wert eines Schlüssels zurück ; Syntax ........: _Dict_GetValue(ByRef $aDictionary, $sKey) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; $sKey - Der Schlüssel, dessen Wert herausgefunden werden soll. ; Return values .: Success ; |Der Wert des Schlüssels ; Failure ; |@error = 7 ; Author ........: PrideRage ; ================================================================================================= Func _Dict_GetValue(ByRef $aDictionary, $sKey) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) Local $result = _Array2DSearch($aDictionary, $sKey) Local $index = StringSplit($result[1], "|") Return $aDictionary[1][$index[2]] EndFunc ; #FUNCTION# ====================================================================================== ; Name ..........: _Dict_GetPair() ; Description ...: Gibt das Wertepaar eines Elements zurück ; Syntax ........: _Dict_GetPair(ByRef $aDictionary, $iElement) ; Parameters ....: ByRef $aDictionary - Das Dictionary, in dem gesucht werden soll. ; $iElement - Das Element des Wertepaares ; Return values .: Success ; |Das Wertepaar im Format Key:Value ; Failure ; |@error = 7 ; Author ........: PrideRage ; ================================================================================================= Func _Dict_GetPair(ByRef $aDictionary, $iElement) If Not IsArray($aDictionary) Then Return SetError(7, 0, 7) Local $sRet_Str = $aDictionary[0][$iElement] & ":" & $aDictionary[1][$iElement] Return $sRet_Str EndFunc #Region Array2D Functions ;---------------------------------------------------------------------------------------------------------------------- ; Function _Array2DEmptyDel(ByRef $avArray [, $Col=0]) ; ; Description Delete empty Array elements ; Delete all emty Rows or all empty Columns ; Works also with 1D-Array (only Rows) ; ; Parameter $avArray Given Array ; optional $Col set 1 to delete empty Columns; default is 0 to delete empty Rows ; ; Return Succes -1 ByRef the given Array without empty Elements, resized ; Failure 0 and set @error = 1 ; ; Author BugFix (bugfix@autoit.de) ;---------------------------------------------------------------------------------------------------------------------- Func _Array2DEmptyDel(ByRef $avArray, $Col=0) If ( Not IsArray($avArray) ) Then SetError(1) Return 0 EndIf Local $UBound2nd = UBound($avArray,2) If @error = 2 Then Local $arTMP[1] For $i = 0 To UBound($avArray)-1 If StringLen($avArray[$i] > 0) Then If StringLen($arTMP[UBound($arTMP)-1]) = 0 Then $arTMP[UBound($arTMP)-1] = $avArray[$i] Else ReDim $arTMP[UBound($arTMP)+1] $arTMP[UBound($arTMP)-1] = $avArray[$i] EndIf EndIf Next Else If $Col = 0 Then Local $arTMP[1][$UBound2nd], $val, $len For $i = 0 To UBound($avArray)-1 $val = '' For $k = 0 To $UBound2nd-1 $val &= $avArray[$i][$k] Next If StringLen($val) > 0 Then $len = 0 For $k = 0 To UBound($arTMP,2)-1 $len &= StringLen($arTMP[UBound($arTMP)-1][$k]) Next If $len = 0 Then For $k = 0 To $UBound2nd-1 $arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k] Next Else ReDim $arTMP[UBound($arTMP)+1][$UBound2nd] For $k = 0 To $UBound2nd-1 $arTMP[UBound($arTMP)-1][$k] = $avArray[$i][$k] Next EndIf EndIf Next Else Local $arTMP[UBound($avArray)][1], $val, $len For $k = 0 To $UBound2nd-1 $val = '' $notEmpty = 0 For $i = 0 To UBound($avArray)-1 $val &= $avArray[$i][$k] If StringLen($val) > 0 Then $notEmpty = 1 ExitLoop EndIf Next If $notEmpty = 1 Then $len = 0 For $i = 0 To UBound($arTMP)-1 $len &= StringLen($arTMP[$i][UBound($arTMP,2)-1]) Next If $len = 0 Then For $i = 0 To UBound($avArray)-1 $arTMP[$i][0] = $avArray[$i][$k] Next Else ReDim $arTMP[UBound($avArray)][UBound($arTMP,2)+1] For $i = 0 To UBound($avArray)-1 $arTMP[$i][UBound($arTMP,2)-1] = $avArray[$i][$k] Next EndIf EndIf Next EndIf EndIf $avArray = $arTMP Return -1 EndFunc ;---------------------------------------------------------------------------------------------------------------------- ; ; Function _Array2DSearch($avArray, $vWhat2Find [, $iDim=-1 [, $iStart=0 [, $iEnd=0 [, $iCaseSense=0 [, $fPartialSearch=False [, $1stFound=False]]]]]]) ; ; Description Finds all Entry's like $vWhat2Find in an 1D/2D Array ; Works with all occurences in 2nd Dimension ; Search in all occurences or only in a given column ; To set numeric values for default, you can use -1 ; ; Parameter $avArray The array to search ; $vWhat2Find What to search $avArray for ; optional $iDim Index of Dimension to search; default -1 (all) ; optional $iStart Start array index for search; default 0 ; optional $iEnd End array index for search; default 0 ; optional $iCaseSense If set to 1 then search is case sensitive; default 0 ; optional $fPartialSearch If set to True then executes a partial search. default False ; optional $1stFound If set to True, only one match will be searched; default False ; ; Return Succes Array with Index of matches, Array[0] includes the count of matches ; In an 2D Array you got for every match [iRow|iCol] ; Array[0] = 0 if no element found ; If option 1stFound is set, Array[0] = FoundIndex; if no element found Array[0] = -1 ; Failure 0 and set @error ; @error = 1 given array is not array ; @error = 2 given dim is out of range ; @error = 4 $iStart is out of range ; @error = 8 $iEnd is out of range ; ; Author BugFix (bugfix@autoit.de) ;---------------------------------------------------------------------------------------------------------------------- Func _Array2DSearch($avArray, $vWhat2Find, $iDim=-1, $iStart=0, $iEnd=0, $iCaseSense=0, $fPartialSearch=False, $1stFound=False) Local $error = 0, $1D, $arFound[1]=[0] If $1stFound Then $arFound[0] = -1 If ( Not IsArray($avArray) ) Then SetError(1) Return 0 EndIf Local $UBound2nd = UBound($avArray,2) If @error = 2 Then $1D = True If ( $iEnd = 0 ) Or ( $iEnd = -1 ) Then $iEnd = UBound($avArray)-1 If $iStart = -1 Then $iStart = 0 If $iCaseSense = -1 Then $iCaseSense = 0 If $iCaseSense <> 0 Then $iCaseSense = 1 Select Case ( $iDim > $UBound2nd ) Or ( $iDim < -1 ) $error += 2 Case ( $iStart < 0 ) Or ( $iStart > UBound($avArray)-1 ) $error += 4 Case ( $iEnd < $iStart ) Or ( $iEnd > UBound($avArray)-1 ) $error += 8 EndSelect If $error <> 0 Then SetError($error) Return 0 EndIf If $fPartialSearch <> True Then $fPartialSearch = False If $1D Then For $i = $iStart To $iEnd Select Case $iCaseSense = 0 And (Not $fPartialSearch) If $avArray[$i] = $vWhat2Find Then If $1stFound Then $arFound[0] = $i Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 1 And (Not $fPartialSearch) If $avArray[$i] == $vWhat2Find Then If $1stFound Then $arFound[0] = $i Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 0 And $fPartialSearch If StringInStr($avArray[$i], $vWhat2Find) Then If $1stFound Then $arFound[0] = $i Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 1 And $fPartialSearch If StringInStr($avArray[$i], $vWhat2Find, 1) Then If $1stFound Then $arFound[0] = $i Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i $arFound[0] += 1 EndIf EndIf EndSelect Next Else For $i = $iStart To $iEnd If $iDim = -1 Then Select Case $iCaseSense = 0 And (Not $fPartialSearch) For $k = 0 To $UBound2nd-1 If $avArray[$i][$k] = $vWhat2Find Then If $1stFound Then $arFound[0] = $i & '|' & $k Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $k $arFound[0] += 1 EndIf EndIf Next Case $iCaseSense = 1 And (Not $fPartialSearch) For $k = 0 To $UBound2nd-1 If $avArray[$i][$k] == $vWhat2Find Then If $1stFound Then $arFound[0] = $i & '|' & $k Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $k $arFound[0] += 1 EndIf EndIf Next Case $iCaseSense = 0 And $fPartialSearch For $k = 0 To $UBound2nd-1 If StringInStr($avArray[$i][$k], $vWhat2Find) Then If $1stFound Then $arFound[0] = $i & '|' & $k Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $k $arFound[0] += 1 EndIf EndIf Next Case $iCaseSense = 1 And $fPartialSearch For $k = 0 To $UBound2nd-1 If StringInStr($avArray[$i][$k], $vWhat2Find, 1) Then If $1stFound Then $arFound[0] = $i & '|' & $k Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $k $arFound[0] += 1 EndIf EndIf Next EndSelect Else Select Case $iCaseSense = 0 And (Not $fPartialSearch) If $avArray[$i][$iDim] = $vWhat2Find Then If $1stFound Then $arFound[0] = $i & '|' & $iDim Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $iDim $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 1 And (Not $fPartialSearch) If $avArray[$i][$iDim] == $vWhat2Find Then If $1stFound Then $arFound[0] = $i & '|' & $iDim Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $iDim $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 0 And $fPartialSearch If StringInStr($avArray[$i][$iDim], $vWhat2Find) Then If $1stFound Then $arFound[0] = $i & '|' & $iDim Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $iDim $arFound[0] += 1 EndIf EndIf Case $iCaseSense = 1 And $fPartialSearch If StringInStr($avArray[$i][$iDim], $vWhat2Find, 1) Then If $1stFound Then $arFound[0] = $i & '|' & $iDim Return $arFound Else ReDim $arFound[UBound($arFound)+1] $arFound[UBound($arFound)-1] = $i & '|' & $iDim $arFound[0] += 1 EndIf EndIf EndSelect EndIf Next EndIf Return $arFound EndFunc #endregion