#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
 