#cs ===============================================================================================
                                     FUNKTIONSÜBERSICHT
_StrucList_Create()
	Erzeugt eine Strukturliste mit max. 20 Strukturelementen
	Erstes Element ($s1) MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)!
	ElementSyntax: "typ;Bezeichnung", z.B. "c;Artikelbezeichnung" od. "i;Anzahl" od. "f;Preis"
	Typen: "c" - Zeichenkette; "i" - Integerwert; "f" - Fließkommawert

_StrucList_AddIndex()
	Fügt der Liste einen neuen Index (wahlweise mit Werten) hinzu

_StrucList_SetValue()
	Fügt Detailwerte für einen Indexwert hinzu
	Entweder Einzelwerte oder alle Details gemeinsam als Zeichenkette

_StrucList_GetValue()
	Rückgabe eines oder aller Detailwerte(s) für den angegebenen Indexwert
	Bei Rückgabe aller Werte wahlweise als Array od. Trennzeichen-String

_StrucList_GetIndices()
	Rückgabe aller Indexwerte der Strukturliste als Trennzeichen-String oder Array

_StrucList_Delete()
	Löschen eines oder aller Listenelemente

_StrucList_Count()
	Gibt die Anzahl der Listenelemente zurück

_StrucList_SearchIndex()
	Ermittelt, ob ein IndexWert in der Liste enthalten ist

_StrucList_WriteToFile
	Speichert Struktur und Werte in einer Datei

_StrucList_CreateFromFile
	Erstellt eine Strukturliste aus einer mit _StrucList_WriteToFile gespeicherten Liste

#ce ===============================================================================================

#include-once
#include <Array.au3>
#include <File.au3>




#include <StructureList.au3>

;	eine Structure-List erstellen
;	erstes Element MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)
;	erster Parameter setzt die max. Länge von Stringelementen, mit "-1" = 128
Local $strucList = _StrucList_Create(-1, 'c;Artikel', 'i;ArtNr', 'i;Menge', 'f;EKNetto', 'f;VKNetto')


;	der List ein Element zufügen
If _StrucList_AddIndex($strucList, 'Schlagschrauber') Then _
ConsoleWrite('Schlagschrauber zugefügt' & @CRLF & @CRLF)


;	die Werte für das Element einzeln hinzufügen
If _StrucList_SetValue($strucList, 'Schlagschrauber', 'ArtNr', 102030) Then _
ConsoleWrite('Schlagschrauber, Detail: ArtNr zugefügt' & @CRLF)

If _StrucList_SetValue($strucList, 'Schlagschrauber', 'Menge', 25) Then _
ConsoleWrite('Schlagschrauber, Detail: Menge zugefügt' & @CRLF)

If _StrucList_SetValue($strucList, 'Schlagschrauber', 'EKNetto', 35.05) Then _
ConsoleWrite('Schlagschrauber, Detail: EKNetto zugefügt' & @CRLF)

If _StrucList_SetValue($strucList, 'Schlagschrauber', 'VKNetto', 49.50) Then _
ConsoleWrite('Schlagschrauber, Detail: VKNetto zugefügt' & @CRLF & @CRLF)


;	ein weiteres Element zufügen
If _StrucList_AddIndex($strucList, 'Kettensäge') Then _
ConsoleWrite('Kettensäge zugefügt' & @CRLF & @CRLF)


;	ein neues Element inklusive Daten zufügen (z.B. aus Datei ausgelesen)
Local $ValuesToSet = "Turboflex|107090|41|75.05|95.40"
If _StrucList_AddIndex($strucList, -1, $ValuesToSet) Then _
ConsoleWrite('Turboflex hinzugefügt, inklusive aller Details' & @CRLF & @CRLF)


;	die Werte in einem String übergeben !! Reihenfolge identisch, wie in der Struktur, ohne Indexelement
$ValuesToSet = "104050|17|188.45|225.30"
If _StrucList_SetValue($strucList, 'Kettensäge', -1, $ValuesToSet, Default) Then _
ConsoleWrite('Kettensäge, alle Details hinzugefügt' & @CRLF & @CRLF)


;	Werte für ein Element abfragen
ConsoleWrite('Schlagschrauber, ArtNr: ' & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 'ArtNr') & @CRLF)

ConsoleWrite('Schlagschrauber, Menge: ' & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 'Menge') & @CRLF)

ConsoleWrite('Schlagschrauber, EKNetto: ' & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 'EKNetto') & @CRLF)

ConsoleWrite('Schlagschrauber, VKNetto: ' & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 'VKNetto') & @CRLF & @CRLF)


;	alle Werte eines Elements gemeinsam zurückgeben

;	- als trennzeichenbasierter String
ConsoleWrite('Schlagschrauber, Details als String: ' & @CRLF & @TAB & _
_StrucList_GetValue($strucList, 'Schlagschrauber', 0 , Default) & @CRLF & @CRLF)

ConsoleWrite('Turboflex, Details als String: ' & @CRLF & @TAB & _
_StrucList_GetValue($strucList, 'Turboflex', 0, Default) & @CRLF & @CRLF)

;	- als Array
Local $aRet = _StrucList_GetValue($strucList, 'Kettensäge', 0, 'A')
ConsoleWrite('Kettensäge, Details als Array:' & @CRLF)
For $i = 0 To UBound($aRet) - 1
	ConsoleWrite(@TAB & 'Array[' & $i & ']: ' & $aRet[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)


;	Anzahl Elemente ausgeben
ConsoleWrite('Anzahl Elemente = ' & _
_StrucList_Count($strucList) & @CRLF & @CRLF)


;	alle Index-Elemente ausgeben

;	- als trennzeichenbasierter String
ConsoleWrite('Alle Index-Elemente als String: ' & @CRLF & @TAB & _
_StrucList_GetIndices($strucList, ';') & @CRLF)

;	- als Array
Local $aRet = _StrucList_GetIndices($strucList, 'A')
ConsoleWrite('Alle Index-Elemente als Array:' & @CRLF)
For $i = 0 To UBound($aRet) - 1
	ConsoleWrite(@TAB & 'Array[' & $i & ']: ' & $aRet[$i] & @CRLF)
Next
ConsoleWrite(@CRLF)


;	ein Element löschen
ConsoleWrite('Anzahl Elemente vor Löschen: ' & _
_StrucList_Count($strucList) & @CRLF)
If _StrucList_Delete($strucList, 'Schlagschrauber') Then
	ConsoleWrite(@TAB & 'Element Schlagschrauber gelöscht' & @CRLF)
	ConsoleWrite('Anzahl Elemente nach Löschen: ' & _
	_StrucList_Count($strucList) & @CRLF & @CRLF)
Else
	ConsoleWrite(@TAB & 'Löschen fehlgeschlagen.' & @CRLF & @CRLF)
EndIf


;	auf Existenz eines Elements (IndexWert) prüfen
ConsoleWrite('Element Kettensäge vorhanden?' & @TAB & _
_StrucList_SearchIndex($strucList, 'Kettensäge') & @CRLF & @CRLF)




;==================================================================================================
; Function Name:   _StrucList_Create($charLen, $s1 [, ...$s20])
; Description::    Erzeugt eine Strukturliste mit max. 20 Strukturelementen
;                  Erstes Element ($s1) MUSS Indexelement sein (eineindeutig, in gesamter List einmalig)!
;                  ElementSyntax: "typ;Bezeichnung", z.B. "c;Artikelbezeichnung" od. "i;Anzahl" od. "f;Preis"
;                  Typen: "c" - Zeichenkette; "i" - Integerwert; "f" - Fließkommawert
; Parameter(s):    $charLen - die max. Länge für Elemente vom Typ "c - Zeichenkette", Standard= -1 (128 Zeichen)
;                  $s1      - erstes Strukturelement(Indexelement), MUSS einmalig und eineindeutig sein
;     optional:    $s2...20 - weitere Strukturelemente
; Return Value(s): Erfolg   - Rückgabe Strukturlist-Variable
;                  Fehler   - kein Strukturelement definiert
; Author(s):       BugFix (bugfi@autoit.de)
;==================================================================================================
Func _StrucList_Create($charLen = -1, $s1 = '', $s2 = '', $s3 = '', $s4 = '', $s5 = '', $s6 = '', $s7 = '', $s8 = '', $s9 = '', $s10 = '', _
		$s11 = '', $s12 = '', $s13 = '', $s14 = '', $s15 = '', $s16 = '', $s17 = '', $s18 = '', $s19 = '', $s20 = '')
	If $charLen < 1 Then $charLen = 128
	If $s1 = '' Then Return SetError(1,0,0)
	Local $val, $type, $struc = ''
	For $i = 1 To 20
		$val = Eval('s' & $i)
		If $val = '' Then
			ExitLoop
		Else
			$type = StringLeft($val, 1)
			$val = StringTrimLeft($val, 2)
		EndIf
		Switch $type
			Case 'i'
				$struc &= 'int64 ' & $val & ';'
			Case 'f'
				$struc &= 'double ' & $val & ';'
			Case Else
				$struc &= 'wchar ' & $val & '[' & $charLen & '];'
		EndSwitch
	Next
	Local $aStruc[1][2] = [[StringTrimRight($struc, 1)]]
	Return $aStruc
EndFunc   ;==>_StrucList_Create

;==================================================================================================
; Function Name:	_StrucList_AddIndex(ByRef $strucList, $IndexValue=-1, $sValues='', $Separator = Default)
; Description::		Fügt der Liste einen neuen Index (wahlweise mit Werten) hinzu
; Parameter(s):		$strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;                   $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
;                                 angesprochen werden
;                               - mit $IndexValue = -1 werden gleich alle Werte eingetragen
;     optional:     $sValues    - wenn $IndexValue = -1, Trennzeichenstring mit allen einzutragenden Werten
;     optional:     $Separator  - wenn $IndexValue = -1, Trennzeichen für Wert-String
; Return Value(s):	Erfolg  1
;                   Fehler  0 @error = 1 - $strucList ist keine Strukturvariable
;                             @error = 2 - $IndexValue ist bereits vorhanden
; Author(s):		BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_AddIndex(ByRef $strucList, $IndexValue = -1, $sValues = '', $Separator = Default)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	If $IndexValue <> -1 Then
		_ArraySearch($strucList, $IndexValue, 1)
		If Not @error Then Return SetError(2,0,0)
		ReDim $strucList[UBound($strucList) + 1][2]
		$strucList[UBound($strucList) - 1][0] = $IndexValue
		$strucList[UBound($strucList) - 1][1] = DllStructCreate($strucList[0][0])
		DllStructSetData($strucList[UBound($strucList) - 1][1], 1, $IndexValue)
	Else
		If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
		Local $aSet = StringSplit($sValues, $Separator)
		_ArraySearch($strucList, $aSet[1], 1)
		If Not @error Then Return SetError(2,0,0)
		ReDim $strucList[UBound($strucList) + 1][2]
		$strucList[UBound($strucList) - 1][0] = $aSet[1]
		$strucList[UBound($strucList) - 1][1] = DllStructCreate($strucList[0][0])
		For $i = 1 To UBound($aSet) -1
			DllStructSetData($strucList[UBound($strucList) - 1][1], $i, $aSet[$i])
		Next
	EndIf
	Return 1
EndFunc   ;==>_StrucList_AddIndex

;==================================================================================================
; Function Name:   _StrucList_SetValue(ByRef $strucList, $IndexValue, $Element, $Value, $Separator = Default)
; Description::    Fügt Detailwerte für einen Indexwert hinzu
;                  Entweder Einzelwerte durch Angabe $Element/$Wert oder
;                  alle Details gemeinsam als Zeichenkette durch: $Element=-1 / $Value=Wert-String / Stringseparator
;                  Bei Übergabe aller Detailwerte muß die Reihenfolge identisch zur Struktur sein!
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;                  $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
;                                 angesprochen werden
;                  $Element    - Bezeichnung des Elements, dessen Wert gesetzt werden soll (-1 = alle Werte in einem String)
;                              - das Element kann mit Namen oder 1-basiertem Index in der Struktur angesprochen werden
;                  $Value      - Wert für $Element (wenn $Element = -1, String mit allen Werten, außer Indexwert)
;     optional:    $Separator  - wenn $Element = -1, Trennzeichen für Wert-String
; Return Value(s): Erfolg  1
;                  Fehler  0  @error = 1 - $strucList ist keine Strukturvariable
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_SetValue(ByRef $strucList, $IndexValue, $Element, $Value, $Separator = Default)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	Local $index = _ArraySearch($strucList, $IndexValue, 1)
	If @error Then Return SetError(2,0,0) ; IndexWert nicht enthalten
	If $Element <> -1 Then
		DllStructSetData($strucList[$index][1], $Element, $Value)
	Else
		If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
		Local $aSet = StringSplit($Value, $Separator, 2), $iElement = 2
		For $j = 0 To UBound($aSet) - 1
			$tmp = DllStructSetData($strucList[$index][1], $iElement, $aSet[$j])
			$iElement += 1
		Next
	EndIf
	Return 1
EndFunc   ;==>_StrucList_SetValue


;==================================================================================================
; Function Name:   _StrucList_GetValue(ByRef $strucList, $IndexValue, $Element = 0, $Separator = 'A')
; Description::    Rückgabe eines/aller Detailwerte(s) für den angegebenen Indexwert.
;                  Bei Rückgabe aller Werte wahlweise als Array od. Trennzeichen-String.
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;                  $IndexValue - der Indexwert, über den alle Details in diesem Listenelement
;                                 angesprochen werden
;                  $Element    - Bezeichnung des Elements, dessen Wert gelesen werden soll (0 = alle Werte in einem String)
;                              - das Element kann mit Namen oder 1-basiertem Index in der Struktur angesprochen werden
;     optional:    $Separator  - wenn $Element = 0, Trennzeichen für Wert-String
;                              - mit $Separator = 'A' werden die Werte als Array zurückgegeben
; Return Value(s): Erfolg  Rückgabe Wert- String/Array
;                  Fehler  0 @error = 1 - $strucList ist keine Strukturvariable
;                            @error = 2 - $IndexValue ist nicht vorhanden
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_GetValue(ByRef $strucList, $IndexValue, $Element = 0, $Separator = 'A')
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	Local $index = _ArraySearch($strucList, $IndexValue, 1)
	If @error Then Return SetError(2, 0, 0)
	Local $Out = ''
	If IsString($Element) Or $Element > 0 Then
		$Out = DllStructGetData($strucList[$index][1], $Element)
	Else
		Local $n = 1, $sep = '|', $tmp
		If $Separator <> 'A' Then
			If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
			$sep = $Separator
		EndIf
		While True
			$tmp = DllStructGetData($strucList[$index][1], $n)
			If @error = 2 Then ExitLoop
			$Out &= $tmp & $sep
			$n += 1
		WEnd
		$Out = StringTrimRight($Out, StringLen($sep))
		If $Separator = 'A' Then $Out = StringSplit($Out, '|', 2)
	EndIf
	Return $Out
EndFunc   ;==>_StrucList_GetValue

;==================================================================================================
; Function Name:   _StrucList_GetIndices(ByRef $strucList, $Separator = 'A')
; Description::    Rückgabe aller Indexwerte der Strukturliste als Trennzeichen-String oder Array
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;     optional:    $Separator  - Trennzeichen für Ausgabestring
;                              - mit $Separator = 'A' werden die Werte als Array zurückgegeben
; Return Value(s): Erfolg    Rückgabe String/Array mit allen Indexwerten
;                  Fehler    @error = 1 - $strucList ist keine Strukturvariable
;                            @error = 2 - Strukturliste ist leer
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_GetIndices(ByRef $strucList, $Separator = 'A')
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	If UBound($strucList) = 1 Then Return SetError(2,0,0)
	Local $Out = '', $sep = '|'
	If $Separator <> 'A' Then
		If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
		$sep = $Separator
	EndIf
	For $i = 1 To UBound($strucList) - 1
		$Out &= $strucList[$i][0] & $sep
	Next
	$Out = StringTrimRight($Out, StringLen($sep))
	If $Separator = 'A' Then $Out = StringSplit($Out, '|', 2)
	Return $Out
EndFunc   ;==>_StrucList_GetIndices

;==================================================================================================
; Function Name:   _StrucList_Delete(ByRef $strucList, $IndexValue = -1)
; Description::    Löschen eines/aller Listenelemente
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;     optional:    $IndexValue - IndexWert, der gelöscht werden soll (-1 löscht alle Elemente)
; Return Value(s): Erfolg  1
;                  Fehler  0 @error = 1 - $strucList ist keine Strukturvariable
;                            @error = 2 - $IndexValue ist nicht vorhanden
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_Delete(ByRef $strucList, $IndexValue = -1)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	If $IndexValue < -1 Then $IndexValue = -1
	If $IndexValue = -1 Then
		Local $aTmp[1][2] = [[$strucList[0][0]]]
		$strucList = $aTmp
		Return 1
	EndIf
	Local $index = _ArraySearch($strucList, $IndexValue, 1)
	If @error Then Return SetError(2,0,0)
	_ArrayDelete($strucList, $index)
	Return 1
EndFunc   ;==>_StrucList_Delete

;==================================================================================================
; Function Name:   _StrucList_Count(ByRef $strucList)
; Description::    Gibt die Anzahl der Listenelemente zurück
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
; Return Value(s): Erfolg  Anzahl der Listenelemente
;                  Fehler  0 @error=1 - $strucList ist keine Strukturvariable
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_Count(ByRef $strucList)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	Return UBound($strucList) - 1
EndFunc   ;==>_StrucList_Count

;==================================================================================================
; Function Name:   _StrucList_SearchIndex(ByRef $strucList, $IndexValue)
; Description::    Ermittelt, ob ein IndexWert in der Liste enthalten ist
; Parameter(s):    $strucList  - eine zuvor mit _StrucList_Create() erzeugte Liste
;                  $IndexValue - IndexWert, der gesucht wird
; Return Value(s): Erfolg   TRUE = gefunden / FALSE = nicht gefunden
;                  Fehler   0 @error = 1 - $strucList ist keine Strukturvariable
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_SearchIndex(ByRef $strucList, $IndexValue)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	_ArraySearch($strucList, $IndexValue, 1)
	If @error Then
		Return False
	Else
		Return True
	EndIf
EndFunc  ;==>_StrucList_SearchIndex

;==================================================================================================
; Function Name:   _StrucList_WriteToFile(ByRef $strucList, $sFile, $Separator = Default)
; Description::    Speichert die Struktur mit Werten in eine Datei
; Parameter(s):    $strucList  - eine mit _StrucList_Create() / _StrucList_CreateFromFile erstellte Liste
;                  $sFile      - kpl. Dateipfad
;                  $Separator  - mit 'Default' wird das Zeichen von Opt("GUIDataSeparatorChar") verwendet
; Return Value(s): Erfolg   1
;                  Fehler   0 @error = 1 - $strucList ist keine Strukturvariable
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_WriteToFile(ByRef $strucList, $sFile, $Separator = Default)
	If Not IsArray($strucList) Then Return SetError(1,0,0)
	Local $fh, $sTmp, $j = 1, $sToWrite = $strucList[0][0] & @CRLF
	If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
	For $i = 1 To UBound($strucList) -1
		While True
			$sTmp = DllStructGetData($strucList[$i][1], $j)
			If @error Then ExitLoop
			$sToWrite &= $sTmp & $Separator
			$j += 1
		WEnd
		$j = 1
		$sToWrite = StringTrimRight($sToWrite, StringLen($Separator)) & @CRLF
	Next
	$fh = FileOpen($sFile, 10)
	FileWrite($fh, $sToWrite)
	FileClose($fh)
EndFunc  ;==>_StrucList_WriteToFile

;==================================================================================================
; Function Name:   _StrucList_CreateFromFile($sFile, $Separator = Default)
; Description::    Erzeugt eine Strukturliste aus einer Datei
; Parameter(s):    $sFile      - kpl. Dateipfad
;                  $Separator  - mit 'Default' wird das Zeichen von Opt("GUIDataSeparatorChar") verwendet
; Return Value(s): Erfolg   Strukturvariable
;                  Fehler   0 @error = 1 - $sFile existiert nicht
; Author(s):       BugFix (bugfix@autoit.de)
;==================================================================================================
Func _StrucList_CreateFromFile($sFile, $Separator = Default)
	If Not FileExists($sFile) Then Return SetError(1,0,0)
	If $Separator = Default Then $Separator = Opt("GUIDataSeparatorChar")
	Local $aFile, $aTmp
	_FileReadToArray($sFile, $aFile)
	Local $aStruct[$aFile[0]][2]
	$aStruct[0][0] = $aFile[1]
	If $aFile[0] = 1 Then Return $aStruct
	For $i = 2 To $aFile[0]
		$aTmp = StringSplit($aFile[$i], $Separator)
		$aStruct[$i-1][0] = $aTmp[1]
		$aStruct[$i-1][1] = DllStructCreate($aStruct[0][0])
		For $j = 1 To $aTmp[0]
			DllStructSetData($aStruct[$i-1][1], $j-1, $aTmp[$j])
		Next
	Next
	Return $aStruct
EndFunc  ;==>_StrucList_CreateFromFile
