#cs
============================= OBJEKT 'Scripting.Dictionary' =======================================
*** Funktionssammlung ***

_ObjDictCreate(Modus)
        Erzeugt ein Dictionary Objekt im Binär- (default) oder Textmodus
        Gibt das Handle des Objektes zurück

_ObjDictAdd(Objekt, Schlüssel, Wert)
        Fügt einem Dictionary Objekt ein Schlüssel-Wert Paar hinzu

_ObjDictGetValue(Objekt, Schlüssel)
        Liest den Wert für einen Schlüssel aus

_ObjDictSetValue(Objekt, Schlüssel)
        Setzt einen neuen Wert für einen Schlüssel

_ObjDictCount(Objekt)
        Gibt die Anzahl der Schlüssel-Wert Paare zurück

_ObjDictSearch(Objekt, Schlüssel)
        Prüft ob der Schlüssel existiert, liefert 'TRUE' wenn gefunden

_ObjDictDeleteKey(Objekt, Schlüssel)
        Löscht den angegebenen Schlüssel (und dessen Wert)
        Wird statt eines Schlüsselnamens '' übergeben,
        werden alle Schlüssel gelöscht (Standard)

_ObjDictList(Objekt)
        Eine GUI mit einem ListView zeigt alle Schlüssel-Wert Paare

_IniReadSectionToObjDict(Objekt, INI-Pfad, Sektion)
        Liest die angegebene INI-Sektion in das Objekt
        Gibt die Anzahl der gelesenen Schlüssel-Wert Paare zurück

_IniWriteSectionFromObjDict(Objekt, INI-Pfad, Sektion)
        Schreibt die Schlüssel-Wert Paare des Objekts in die angegebene Sektion
        der INI-Datei
        Gibt die Anzahl der geschriebenen Schlüssel-Wert Paare zurück

_FileReadToObjDict(Objekt, TextDatei-Pfad, Seperator)
        Liest aus einer Textdatei alle Schlüssel-Wert Paare zeilenweise ein (1 Paar/Zeile)
        Standard-Seperator ist '|', kann hier angepaßt werden
        Gibt die Anzahl der gelesenen Schlüssel-Wert Paare zurück

_FileWriteFromObjDict(Objekt, TextDatei-Pfad, Seperator, Overwrite)
        Schreibt die Schlüssel-Wert Paare des Objekts in die angegebene Datei (1 Paar/Zeile).
        Mit Overwrite='TRUE' (Standard) wird die angegebene Datei, falls sie bereits existiert,
        überschrieben. Mit 'FALSE' wird an eine bestehende Datei angehängt.
        Standard-Seperator ist '|', kann hier angepaßt werden.
        Gibt die Anzahl der geschriebenen Schlüssel-Wert Paare zurück

Autor: BugFix    ( bugfix@autoit.de )

===================================================================================================
#ce
#include <GuiConstants.au3>
#include <GuiListView.au3>
;==================================================================================================
; Parameter: $MODE
;                  0 Binär (default)
;                  1 Text
; Return:    Objekt Handle
;==================================================================================================
Func _ObjDictCreate($MODE=0)
    $oDICT = ObjCreate('Scripting.Dictionary')
    If $MODE <> 0 Then $oDICT.CompareMode = 1
    Return $oDICT
EndFunc ;==>_ObjDictCreate

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $KEY   - Schlüssel
;            $VALUE - Wert
; Return:    Erfolg:   0
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
;                      2  Schlüssel ohne Inhalt übergeben
;                      3  Wert hat keinen Inhalt
;                      4  Schlüssel bereits vorhanden
;==================================================================================================
Func _ObjDictAdd(ByRef $oDICT, $KEY, $VALUE)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $KEY = '' Then
        SetError(2)
        Return -1
    ElseIf $VALUE = '' Then
        SetError(3)
        Return -1
    ElseIf $oDICT.Exists($KEY) Then
        SetError(4)
        Return -1
    EndIf
    $oDICT.Add($KEY, $VALUE)
    Return 0
EndFunc ;==>_ObjDictAdd

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $KEY   - Schlüssel
; Return:    Erfolg:  Wert des Schlüssels
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
;                      2  Schlüssel ohne Inhalt übergeben
;                      5  Schlüssel nicht vorhanden
;==================================================================================================
Func _ObjDictGetValue(ByRef $oDICT, $KEY)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $KEY = '' Then
        SetError(2)
        Return -1
    ElseIf Not $oDICT.Exists($KEY) Then
        SetError(5)
        Return -1
    EndIf
    Return $oDICT.Item($KEY)
EndFunc ;==>_ObjDictGetValue

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $KEY   - Schlüssel
;            $VALUE - Wert
; Return:    Erfolg:   0
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
;                      2  Schlüssel ohne Inhalt übergeben
;                      3  Wert hat keinen Inhalt
;                      5  Schlüssel nicht vorhanden
;==================================================================================================
Func _ObjDictSetValue(ByRef $oDICT, $KEY, $VALUE)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $KEY = '' Then
        SetError(2)
        Return -1
    ElseIf $VALUE = '' Then
        SetError(3)
        Return -1
    ElseIf Not $oDICT.Exists($KEY) Then
        SetError(5)
        Return -1
    EndIf
    $oDICT.Item($KEY) = $VALUE
    Return 0
EndFunc ;==>_ObjDictSetValue

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
; Return:    Erfolg:  Anzahl der Schlüssel-Wert Paare
;            Fehler:   -1
;        Fehlerwert:   1  Objekt existiert nicht
;==================================================================================================
Func _ObjDictCount(ByRef $oDICT)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    EndIf
    Return $oDICT.Count
EndFunc ;==>_ObjDictCount

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $KEY   - Schlüssel
; Return:    Erfolg:  TRUE    Schlüssel vorhanden
;                     FALSE   Schlüssel nicht vorhanden
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
;                      2  Schlüssel ohne Inhalt übergeben
;==================================================================================================
Func _ObjDictSearch(ByRef $oDICT, $KEY)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $KEY = '' Then
        SetError(2)
        Return -1
    ElseIf Not $oDICT.Exists($KEY) Then
        Return False
    Else
        Return True
    EndIf
EndFunc ;==>_ObjDictSearch

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $KEY   - Schlüssel (default='')
;                     mit $KEY = '' werden alle Schlüssel gelöscht
; Return:    Erfolg:   0
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
;==================================================================================================
Func _ObjDictDeleteKey(ByRef $oDICT, $KEY='')
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    EndIf
    If $KEY = '' Then
        $oDICT.RemoveAll
        Return 0
    ElseIf Not $oDICT.Exists($KEY) Then
        SetError(5)
        Return -1
    EndIf
    $oDICT.Remove($KEY)
    Return 0
EndFunc ;==>_ObjDictDeleteKey

;==================================================================================================
; Parameter: $oDICT - Handle des Dictionary-Objektes
;            $TITLE - Fenstertitel (optional)
; Return:    Erfolg:   GUI mit ListView
;            Fehler:  -1
;        Fehlerwert:   1  Objekt existiert nicht
; Requirements:       #include <GuiConstants.au3>
;                     #include <GuiListView.au3>
;==================================================================================================
Func _ObjDictList(ByRef $oDICT, $TITLE='Elemente: Objekt Dictionary')
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    EndIf
    Local $count = $oDICT.Count
    Local $SaveMode = Opt("GUIOnEventMode",0), $ListGUI, $oDictLV, $btnClose, $msg
    $ListGUI = GUICreate($TITLE, 600, 400, (@DesktopWidth - 600)/2, (@DesktopHeight - 400)/2)
    $btnClose = GUICtrlCreateButton('&Ende', 40, 360, 70, 22)
    GUICtrlSetResizing($btnClose, BitOR($GUI_DockRight, $GUI_DockBottom, $GUI_DockSize))
    GUICtrlDelete($oDictLV)
    $oDictLV = GUICtrlCreateListView('Schlüssel|Wert', 10, 10, 580, 340, BitOR($LVS_SHOWSELALWAYS, _
    $LVS_EDITLABELS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP, $LVS_EX_FULLROWSELECT, $LVS_EX_REGIONAL))
    If $count > 0 Then
        Local $strKey, $colKeys = $oDICT.Keys
        For $strKey In $colKeys
            GUICtrlCreateListViewItem($strKey & '|' & $oDICT.Item($strKey), $oDictLV)
        Next
    Else
        WinSetTitle($ListGUI, '', 'Das Objekt Dictionary enthält keine Elemente!')
    EndIf
    GUISetState(@SW_SHOW, $ListGUI)
    While 1
        $msg = GUIGetMsg(1)
        If $msg[1] = $ListGUI And _
          ($msg[0] = $GUI_EVENT_CLOSE Or $msg[0] = $btnClose) Then ExitLoop
    WEnd
    GUIDelete($ListGUI)
    Opt("GUIOnEventMode",$SaveMode)
EndFunc ;==>ObjDictList

;==================================================================================================
; Parameter: $oDICT   - Handle des Dictionary-Objektes
;            $PathINI - Pfad der INI-Datei
;            $SECTION - Sektion die gelesen werden soll
; Return:    Erfolg:    Anzahl der eingelesenen Schlüssel-Wert Paare
;            Fehler:   -1
;        Fehlerwert:    1  Objekt existiert nicht
;                       6  INI-Pfad nicht vorhanden
;                       7  kein Sektionsname
;                       8  INI-Sektion konnte nicht gelesen werden oder leer
;==================================================================================================
Func _IniReadSectionToObjDict(ByRef $oDICT, $PathINI, $SECTION)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf Not FileExists($PathINI) Then
        SetError(6)
        Return -1
    ElseIf $SECTION = '' Then
        SetError(7)
        Return -1
    EndIf
    Local $arSECTION = IniReadSection($PathINI, $SECTION)
    If Not IsArray($arSECTION) Then
        SetError(8)
        Return -1
    EndIf
    For $i = 1 To $arSECTION[0][0]
        $oDICT.Add($arSECTION[$i][0], $arSECTION[$i][1])
    Next
    Return $arSECTION[0][0]
EndFunc ;==>_IniReadSectionToObjDict

;==================================================================================================
; Parameter: $oDICT   - Handle des Dictionary-Objektes
;            $PathINI - Pfad der INI-Datei
;            $SECTION - Sektion die gelesen werden soll
; Return:    Erfolg:    Anzahl der geschriebenen Schlüssel-Wert Paare
;            Fehler:   -1
;        Fehlerwert:    1  Objekt existiert nicht
;                       7  kein Sektionsname
;                       9  INI-Sektion konnte nicht geschrieben werden
;==================================================================================================
Func _IniWriteSectionFromObjDict(ByRef $oDICT, $PathINI, $SECTION)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $SECTION = '' Then
        SetError(7)
        Return -1
    EndIf
    Local $arSECTION[$oDICT.Count][2], $i = 0
    Local $strKey, $colKeys = $oDICT.Keys
    For $strKey In $colKeys
        $arSECTION[$i][0] = $strKey
        $arSECTION[$i][1] = $oDICT.Item($strKey)
        $i += 1
    Next
    If IniWriteSection($PathINI, $SECTION, $arSECTION, 0) = 1 Then
        Return $oDICT.Count
    Else
        SetError(9)
        Return -1
    EndIf
EndFunc ;==>_IniWriteSectionFromObjDict

;==================================================================================================
; Parameter: $oDICT     - Handle des Dictionary-Objektes
;            $PathFile  - Pfad der Datei
;            $SEPERATOR - Trennzeichen zwischen Wert u. Schlüssel, Standard: '|'
; Return:    Erfolg:      Anzahl der eingelesenen Schlüssel-Wert Paare
;            Fehler:     -1
;        Fehlerwert:      1  Objekt existiert nicht
;                         6  Datei-Pfad nicht vorhanden
;                         7  Leerstring als Seperator übergeben
;                         8  Datei konnte nicht gelesen werden
;==================================================================================================
Func _FileReadToObjDict(ByRef $oDICT, $PathFile, $SEPERATOR='|')
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf Not FileExists($PathFile) Then
        SetError(6)
        Return -1
    ElseIf $SEPERATOR = '' Then
        SetError(7)
        Return -1
    EndIf
    Local $fh = FileOpen($PathFile, 0), $line
    Local $val
    If $fh = -1 Then
        SetError(8)
        Return -1
    EndIf
    While 1
        $line = FileReadLine($fh)
        If @error = -1 Then ExitLoop
        $val = StringSplit($line, $SEPERATOR)
        If $val[0] > 1 Then
            $oDICT.Add($val[1], $val[2])
        EndIf
    Wend
    FileClose($fh)
    Return $oDICT.Count
EndFunc ;==>_FileReadToObjDict

;==================================================================================================
; Parameter: $oDICT     - Handle des Dictionary-Objektes
;            $PathFile  - Pfad der Datei
;            $SEPERATOR - Trennzeichen zwischen Wert u. Schlüssel, Standard: '|'
;            $OVERWRITE - Falls Datei existiert, wird sie überschrieben (Standard).
;                         Mit 'FALSE' wird an bestehende Datei angehängt.
; Return:    Erfolg:      Anzahl der geschriebenen Schlüssel-Wert Paare
;            Fehler:     -1
;        Fehlerwert:      1  Objekt existiert nicht
;                         7  Leerstring als Seperator übergeben
;                         8  Datei konnte nicht geschrieben werden
;==================================================================================================
Func _FileWriteFromObjDict(ByRef $oDICT, $PathFile, $SEPERATOR='|', $OVERWRITE=True)
    If Not IsObj($oDICT) Then
        SetError(1)
        Return -1
    ElseIf $SEPERATOR = '' Then
        SetError(7)
        Return -1
    EndIf
    If $OVERWRITE Then
        Local $fh = FileOpen($PathFile, 34)
    Else
        Local $fh = FileOpen($PathFile, 33)
    EndIf
     Local $strKey, $colKeys = $oDICT.Keys
    For $strKey In $colKeys
        FileWriteLine($fh, $strKey & $SEPERATOR & $oDICT.Item($strKey))
        If @error Then
            SetError(8)
            Return -1
        EndIf
    Next
    FileClose($fh)
    Return $oDICT.Count
EndFunc ;==>_FileWriteFromObjDict