Objekt: Scripting.Dictionary

    • Offizieller Beitrag

    Hier ein interessantes Objekt. AutoIt bietet dazu kein direktes Pendant.
    Und vielleicht interessant für all jene, die sich mit Arrays nicht so anfreunden können aber Schlüssel-Wert-Paare verwalten müssen.

    Hier mal eine kleine Erläuterung zur Funktionsweise (Edit):

    Spoiler anzeigen

    Wozu kann man es verwenden?

    Mit dem Objekt lassen sich Zugriffe auf Schlüssel-Wert Paare wesentlich einfacher verwalten als mit einem Array.
    Wer z.B. bei Arrays seine liebe Not mit dem verwendeten Index hat (Basis 0 oder 1, UBound falsch angesprochen etc.) wird diese Form der Datenspeicherung schätzen ;) .
    Überall dort, wo Daten paarweise (also in der Form Schlüssel=Wert) gespeichert werden, läßt sich das Objekt verwenden.

    Bsp.: In einer INI-Datei werden Startwerte für ein Programm gespeichert

    Code
    [start]
    breite=600
    hoehe=400
    x_pos=40
    y_pos=60


    Der übliche Weg in AutoIt wäre:

    [autoit]

    $var = INIReadSection($PathINI, 'start')
    $GUI = GUICreate('Titel', $var[1][1], $var[2][1], $var[3][1], $var[4][1])

    [/autoit]


    Das setzt voraus, dass die Einträge in exakt dieser Reihenfolge in der INI-Datei stehen.
    Für diese Parameter ist es noch übersichtlich, da aus dem Funktionsaufruf ersichtlich ist, welcher Parameter erwartet wird.
    Habe ich aber eine Vielzahl von Einträgen, ist $var[n][1] nicht sehr aussagekräftig. Der Code läßt sich schwerer lesen.

    Nun als Vergleich derselbe Vorgang mit meinen Funktionen für das Dictionary-Object:

    [autoit]

    $oINI = _objDictCreate(1)
    _IniReadSectionToObjDict($oINI, $PathINI, 'start')
    $GUI = GUICreate('Titel', _ObjDictGetValue($oINI, 'breite'), _ObjDictGetValue($oINI, 'hoehe'), _
    _ObjDictGetValue($oINI, 'x_pos'), _ObjDictGetValue($oINI, 'y_pos'))

    [/autoit]


    Es ist ersichtlich, dass zum Zugriff direkt der Schlüsselname verwendet wird. Dadurch steigt die Lesbarkeit des Codes.

    Ein weiterer Vorteil ist die Suchfunktion.
    Hierbei wird nicht wie in einem Array jedes Element per Index angesprochen und dann überprüft.
    Es wird direkt die Existenz des Schlüsselnamens geprüft. Dadurch ist der Vorgang schneller als eine Array-Suche.

    Objekt: Dictionary

    Spoiler anzeigen


    Ein Dictionary-Objekt erstellen

    [autoit]

    Const $BinaerMode = 0
    Const $TextMode = 1
    $oDictionary = ObjCreate('Scripting.Dictionary') ; jetzt standardmäßig im Binärmode
    $oDictionary.CompareMode = $TextMode ; den Textmode setzen

    [/autoit]


    Einträge zu einem Dictionary-Objekt hinzufügen
    Methode: Add
    Parameter: Schlüssel, Wert

    [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.Add("Drucker 1", "Druckt")
    $oDictionary.Add("Drucker 2", "Offline")
    $oDictionary.Add("Drucker 3", "Druckt")

    [/autoit]


    Die Schlüsselnamen müssen eindeutig sein und dürfen nicht mehrfach auftreten.

    Zugriff auf nicht existenten Schlüssel
    Wird versucht, den Wert eines Schlüssels auszugeben, der nicht existiert, so wird dieser mit dem Wert Null angelegt.
    Hierbei wird jedoch kein Fehler erzeugt!

    Zahl der Einträge in einem Dictionary-Objekt abfragen

    [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.Add("Drucker 1", "Druckt")
    $oDictionary.Add("Drucker 2", "Offline")
    $oDictionary.Add("Drucker 3", "Druckt")
    MsgBox(0, 'Anzahl Schlüssel-Wert Paare', $oDictionary.Count)

    [/autoit]

    Elemente eines Dictionary-Objekts aufzählen
    Methoden: Keys und Items

    [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.Add("Drucker 1", "Druckt")
    $oDictionary.Add("Drucker 2", "Offline")
    $oDictionary.Add("Drucker 3", "Druckt")

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

    $colKeys = $oDictionary.Keys
    $str = ''
    For $strKey in $colKeys
    $str &= $strKey & @LF
    Next
    MsgBox(0, 'Schlüssel', $str)

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

    $colItems = $oDictionary.Items
    $str = ''
    For $strItem in $colItems
    $str &= $strItem & @LF
    Next
    MsgBox(0, 'Werte', $str)

    [/autoit]

    Wert eines bestimmten Eintrags anzeigen
    Methode: Item
    Die folgende Zeile zeigt zum Beispiel den Wert des Eintrags mit dem Schlüssel 'Drucker 3' an:

    [autoit]

    MsgBox(0, 'Wert von Schlüssel: Drucker 3', $oDictionary.Item("Drucker 3"))

    [/autoit]

    Existenz eines Schlüssels prüfen
    Methode: Exists
    Großer Vorteil gegenüber Array: Es müssen nicht alle Daten durchsucht werden.
    Mit Exists wird die Existenz des Schlüssels abgefragt und 'True' oder 'False' zurückgegeben.

    [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.Add("Drucker 1", "Druckt")
    $oDictionary.Add("Drucker 2", "Offline")
    $oDictionary.Add("Drucker 3", "Druckt")
    If $oDictionary.Exists("Drucker 4") Then
    MsgBox(0, '', "Drucker 4 ist vorhanden.")
    Else
    MsgBox(0, '', "Drucker 4 ist nicht vorhanden.")
    EndIf

    [/autoit]

    Element in einem Dictionary-Objekt ändern

    [autoit]

    $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.Add("atl-dc-01", "Kein Status")
    $oDictionary.Add("atl-dc-02", "Kein Status")
    $oDictionary.Add("atl-dc-03", "Kein Status")

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

    $colKeys = $oDictionary.Keys
    $str = ''
    For $strKey in $colKeys
    $str &= $strKey & ' ' & $oDictionary.Item($strKey) & @LF
    Next
    MsgBox(0, 'Vor Änderung', $str)

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

    $oDictionary.Item("atl-dc-01") = "Verfügbar"
    $oDictionary.Item("atl-dc-02") = "Verfügbar"
    $oDictionary.Item("atl-dc-03") = "Nicht verfügbar"

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

    $str = ''
    For $strKey in $colKeys
    $str &= $strKey & ' ' & $oDictionary.Item($strKey) & @LF
    Next
    MsgBox(0, 'Nach Änderung', $str)

    [/autoit]

    Elemente aus einem Dictionary-Objekt entfernen
    Methoden: Remove, RemoveAll

    alle Schlüssel löschen

    [autoit]

    $oDictionary.RemoveAll

    [/autoit]

    einen bestimmten Schlüssel löschen

    [autoit]

    $oDictionary.Remove("Key")

    [/autoit]

    Edit:
    Eine Funktionssammlung zu diesem Objekt habe ich hier erstellt:
    UDF-Sammlung: Objekt Dictionary