Symbiose: Array + Structure = StrucList ; Zugriff kpl. assoziativ

    • Offizieller Beitrag

    Hi,
    ich hatte ja schon mal versucht ein "assoziatives Array" zu erstellen, um jenen die Arbeit zu erleichtern, die mit Indexzugriff so ihre Problemchen haben.
    Ich habe das Konzept jetzt kpl. überarbeitet und durch Symbiose von Array und Struktur einen Speichertyp erstellt, der die Vorteile beider Typen nutzt - die StrukturListe.
    Jedes Element wird über eine Struktur definiert und mit dem ersten Wert der Struktur, dem IndexWert, angesprochen.
    Wobei ich der Einfachheit halber eine Beschränkung auf die Datentypen i=Integerwert, f=Fließkommawert und c=Zeichenfolge vorgenommen habe. Um auch die Zeichenfolge in der Länge variabel zu halten wird beim Erstellen der Struktur die max. Länge festgelegt, oder mit "-1" der Standard ( 128 ) übernommen.
    Da Werte in Strukturen sowohl per 1-basiertem Index als auch per vergebenem Bezeichner angesprochen werden können, ergibt sich nun die Möglichkeit Werte direkt über den Namen zu setzen/zu lesen.

    Im beigefügten Bsp. habe ich alle bisher existierenden Funktionen eingesetzt und kommentiert.
    Eine ausführliche Funktionsbeschreibung findet ihr im jeweiligen Funktionsheader.
    (Um Includes zu vermeiden sind zwei umbenannte Arrayfunktionen mit enthalten.)

    Edit: Noch nen Kopierfehler gefixt.

    Edit 28.02.2010
    - 2 weitere Funktionen zum Schreiben der Liste in Datei und Lesen aus Datei
    - als Standardseparator wird nun mit "Default" das Zeichen von Opt("GUIDataSeparatorChar") verwendet

    Funktionsübersicht StrukturListe

    _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

    Beispielskript
    [autoit]

    #include <StructureList.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; 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')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; der List ein Element zufügen
    If _StrucList_AddIndex($strucList, 'Schlagschrauber') Then _
    ConsoleWrite('Schlagschrauber zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; die Werte für das Element einzeln hinzufügen
    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'ArtNr', 102030) Then _
    ConsoleWrite('Schlagschrauber, Detail: ArtNr zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'Menge', 25) Then _
    ConsoleWrite('Schlagschrauber, Detail: Menge zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'EKNetto', 35.05) Then _
    ConsoleWrite('Schlagschrauber, Detail: EKNetto zugefügt' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If _StrucList_SetValue($strucList, 'Schlagschrauber', 'VKNetto', 49.50) Then _
    ConsoleWrite('Schlagschrauber, Detail: VKNetto zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; ein weiteres Element zufügen
    If _StrucList_AddIndex($strucList, 'Kettensäge') Then _
    ConsoleWrite('Kettensäge zugefügt' & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Werte für ein Element abfragen
    ConsoleWrite('Schlagschrauber, ArtNr: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'ArtNr') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, Menge: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'Menge') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, EKNetto: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'EKNetto') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Schlagschrauber, VKNetto: ' & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 'VKNetto') & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; alle Werte eines Elements gemeinsam zurückgeben

    [/autoit] [autoit][/autoit] [autoit]

    ; - als trennzeichenbasierter String
    ConsoleWrite('Schlagschrauber, Details als String: ' & @CRLF & @TAB & _
    _StrucList_GetValue($strucList, 'Schlagschrauber', 0 , Default) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('Turboflex, Details als String: ' & @CRLF & @TAB & _
    _StrucList_GetValue($strucList, 'Turboflex', 0, Default) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; - 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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Anzahl Elemente ausgeben
    ConsoleWrite('Anzahl Elemente = ' & _
    _StrucList_Count($strucList) & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; alle Index-Elemente ausgeben

    [/autoit] [autoit][/autoit] [autoit]

    ; - als trennzeichenbasierter String
    ConsoleWrite('Alle Index-Elemente als String: ' & @CRLF & @TAB & _
    _StrucList_GetIndices($strucList, ';') & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; - 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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; auf Existenz eines Elements (IndexWert) prüfen
    ConsoleWrite('Element Kettensäge vorhanden?' & @TAB & _
    _StrucList_SearchIndex($strucList, 'Kettensäge') & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; === Liste in Datei speichern
    _StrucList_WriteToFile($strucList, @ScriptDir & '\StrucList.txt')

    [/autoit] [autoit][/autoit] [autoit]

    ; === aus Datei neu laden
    $strucList2 = _StrucList_CreateFromFile(@ScriptDir & '\StrucList.txt')
    ; === Indexwerte der gelesenen Liste
    ConsoleWrite('index values read from file: ' & _StrucList_GetIndices($strucList2, Default) & @CRLF & @CRLF)

    [/autoit]
    Code Funktionen
    [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfi@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _StrucList_Count(ByRef $strucList)
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    Return UBound($strucList) - 1
    EndFunc ;==>_StrucList_Count

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    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

    [/autoit]

    Probiert mal und gebt Feedback, falls ihr Veränderungen/Erweiterungen dazu wünscht.

    • Offizieller Beitrag

    Hei Bugfix. Wollte eigentlich mal dein Script testen , geht aber nicht. dieser Teilcode ist fehlerhaft(Unvollständig:

    Spoiler anzeigen
    [autoit]

    ;==================================================================================================
    ; 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 ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func
    If Not IsArray($strucList) Then Return SetError(1,0,0)
    _A_Search($strucList, $IndexValue, 1)
    If @error Then
    Return False
    Else
    Return True
    EndIf
    EndFunc ;==>_StrucList_SearchIndex

    [/autoit]

    Der Code ist im Spoiler wie auch im Download nicht Bug gefixt :;-)

    Edit: Fehler von Autoit

    Spoiler anzeigen

    C:\Users\MICHAEL\Desktop\StructureList.au3(262,5) : ERROR: syntax error
    Func
    ~~~~^
    C:\Users\MICHAEL\Desktop\StructureList.au3(89,38) : ERROR: _A_Search(): undefined function.
    _A_Search($strucList, $IndexValue, 1)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\MICHAEL\Desktop\StructureList.au3(236,30) : ERROR: _A_Delete(): undefined function.
    _A_Delete($strucList, $index)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    C:\Users\MICHAEL\Desktop\StructureList.au3 - 3 error(s), 0 warning(s)

    • Offizieller Beitrag

    Schau mal in Zeile 262, da fehlt der Funktionskopf . Fehermeldung siehe Edit aus meinem letzten Post .

    Fehler ist in Zeile 262 im Download und Zeile 228 im Spoiler.

    • Offizieller Beitrag

    Ich find die StrucList genial , hätte es schon geben müssen als ich noch nichts mit Array´s am Hut hatte.Da wäre mir so mancher Wutausbruch erspart geblieben. Werde jetzt mal ein bischen damit Rumbasteln . Super Script :thumbup::thumbup: