- 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
Der übliche Weg in AutoIt wäre:
$var = INIReadSection($PathINI, 'start')
$GUI = GUICreate('Titel', $var[1][1], $var[2][1], $var[3][1], $var[4][1])
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'))
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
Ein Dictionary-Objekt funktioniert wie ein assoziativer Array. Das heißt,
es speichert Wert und Schlüssel in Paaren.
Vorteile gegenüber einem Array:
- Es muß nicht festgelegt werden, wie viele Objekte gespeichert werden sollen.
Bei einem Array muß das Array im Voraus erstellt werden (oder später vergrößert werden).
- Es ist keine Indexnummer zum Zugriff auf ein Element notwendig. Stattdessen kann über einen
Schlüssel(begriff) auf das Element zugegriffen werden.
Das Dictionary-Objekt hat nur eine konfigurierbare Eigenschaft:
CompareMode
Diese Eigenschaft beeinflusst, wie die Einträge im Dictionary-Objekt gefunden werden.
Standardmäßig arbeitet das Dictionary-Objekt im Binärmodus.
Das bedeutet, dass die einzelnen Schlüssel als ASCII-Werte gespeichert werden.
Bei ASCII-Werten wird zwischen Großbuchstaben und Kleinbuchstaben unterschieden.
Bei der Abfrage ist es also notwendig, die exakte Schreibweise des Schlüssels zu verwenden.
Im Textmodus, werden Groß- und Kleinbuchstaben gleich behandelt. In diesem Modus kann kein
Schlüssel mit dem Namen 'KEY' angelegt werden, wenn bereits ein Schlüssel mit dem Namen 'Key'
vorhanden ist. Auch das Suchen ist viel einfacher.
Die Suche nach 'key' würde die Einträge für 'KEY' und 'Key' zurückgeben.
Alles anzeigen
Spoiler anzeigen
Ein Dictionary-Objekt erstellen
Const $BinaerMode = 0
Const $TextMode = 1
$oDictionary = ObjCreate('Scripting.Dictionary') ; jetzt standardmäßig im Binärmode
$oDictionary.CompareMode = $TextMode ; den Textmode setzen
Einträge zu einem Dictionary-Objekt hinzufügen
Methode: Add
Parameter: Schlüssel, Wert
$oDictionary = ObjCreate('Scripting.Dictionary')
$oDictionary.Add("Drucker 1", "Druckt")
$oDictionary.Add("Drucker 2", "Offline")
$oDictionary.Add("Drucker 3", "Druckt")
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)
Elemente eines Dictionary-Objekts aufzählen
Methoden: Keys und Items
$oDictionary = ObjCreate('Scripting.Dictionary')
$oDictionary.Add("Drucker 1", "Druckt")
$oDictionary.Add("Drucker 2", "Offline")
$oDictionary.Add("Drucker 3", "Druckt")
$colKeys = $oDictionary.Keys
$str = ''
For $strKey in $colKeys
$str &= $strKey & @LF
Next
MsgBox(0, 'Schlüssel', $str)
$colItems = $oDictionary.Items
$str = ''
For $strItem in $colItems
$str &= $strItem & @LF
Next
MsgBox(0, 'Werte', $str)
Wert eines bestimmten Eintrags anzeigen
Methode: Item
Die folgende Zeile zeigt zum Beispiel den Wert des Eintrags mit dem Schlüssel 'Drucker 3' an:
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.
$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
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")
$colKeys = $oDictionary.Keys
$str = ''
For $strKey in $colKeys
$str &= $strKey & ' ' & $oDictionary.Item($strKey) & @LF
Next
MsgBox(0, 'Vor Änderung', $str)
$oDictionary.Item("atl-dc-01") = "Verfügbar"
$oDictionary.Item("atl-dc-02") = "Verfügbar"
$oDictionary.Item("atl-dc-03") = "Nicht verfügbar"
$str = ''
For $strKey in $colKeys
$str &= $strKey & ' ' & $oDictionary.Item($strKey) & @LF
Next
MsgBox(0, 'Nach Änderung', $str)
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