Guten Tag AutoIt Community!
Wie vielleicht eine Hand voll von euch wissen sollte, hatte ich mal mit "Containern" experimentiert. Die Aufgabe war es, ein Container (dynamisches Array) zu erstellen ohne externe Ressourcen. Ich habe daraus inzwischen eine ganze Funktion gemacht die ich gerne hier zeigen möchte. Vielleicht hilft es den einen oder anderen mal weiter oder gibt anreiz das ganze zu erweitern!
Ich habe dazu noch ein Beispiel geschrieben um die Funktionsweise der Funktion zu verdeutlichen!
Hier ist die Container.au3
Spoiler anzeigen
;// Container Return bei Erfolg:
;// -> Container erstellen Container() ID des Containers
;// -> Element hinzufügen Container(ID, 0, Wert) True
;// -> Element verändern Container(ID, Index, Wert) True
;// -> Element lesen Container(ID, Index) Inhalt des Containers
;// -> Element entfernen Container(ID, Index, Default*) True
;// -> Anzahl Elemente Container(ID) Anzahl der Elemente
;// -> Container löschen Container(ID, Default*) True
;// -> Anzahl Container Container(Default*) Anzahl der Container
;// -> Alle Container löschen Container(Default*, Default*) True
;// * Hier ist das Schlüsselwort "Default" anzugeben!
Func Container($vID = 0, $vIndex = False, $vValue = 0)
;// Make-Grafik (http://www.autoit.de)
If Not IsDeclared('avContainer') Then Global $avContainer[1]
Local Static $iElement
Local $bDefault
If $vID = Default Then $bDefault = True
Local $avNewContainer[1]
Local $avTempArr
Local $iCount
If $vID = Default Then
$avTempArr = $avContainer[0]
Else
$avTempArr = $avContainer[$vID]
EndIf
;// Container erstellen
If Not $vID And Not IsKeyword($vID) Then
$avContainer[0] += 1
$iElement += 1
ReDim $avContainer[$iElement + 1]
$avContainer[$iElement] = $avNewContainer
Return $iElement
;// Element hinzufügen
ElseIf $vID And Not $vIndex And Not IsBool($vIndex) And Not IsKeyword($vIndex) Then
$avTempArr[0] += 1
ReDim $avTempArr[$avTempArr[0] + 1]
$avTempArr[$avTempArr[0]] = $vValue
$avContainer[$vID] = $avTempArr
Return True
;// Element verändern
ElseIf $vID And $vIndex And $vValue Then
$avTempArr[$vIndex] = $vValue
$avContainer[$vID] = $avTempArr
Return True
;// Element lesen
ElseIf $vID And $vIndex And Not IsKeyword($vValue) Then
Return $avTempArr[$vIndex]
;// Element entfernen
ElseIf $vID And $vIndex Then
$avTempArr[0] -= 1
For $iCount = $vIndex To $avTempArr[0]
$avTempArr[$iCount] = $avTempArr[$iCount + 1]
Next
ReDim $avTempArr[$avTempArr[0] + 1]
$avContainer[$vID] = $avTempArr
Return True
;// Anzahl Elemente
ElseIf $vID And IsBool($vIndex) Then
Return $avTempArr[0]
;// Container löschen
ElseIf $vID Then
Dim $avTempArr[1]
$avContainer[$vID] = $avTempArr
Return True
;// Anzahl Container
ElseIf IsKeyword($vID) And Not IsKeyword($vIndex) Then
Return $avContainer[0]
;// Alle Container löschen
Else
For $iCount = 1 To $avContainer[0]
Container($iCount, Default)
Next
Return True
EndIf
EndFunc ;==>Container
Und hier das Beispiel:
Spoiler anzeigen
; Was ist ein Container?
; Ein Container ist ein dynamisches Array! Die Funktion bietet folgende Möglichkeiten:
#include "Container.au3"
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Container erstellen:
; Ein Aufruf ohne Parameter erstellt einen Container und gibt die ID aus um darauf zugreifen zu
; können.
Global $idContainer = Container(), $iCounter
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Elemente hinzufügen:
; -> An den ersten Parameter wird die ID übergeben.
; -> Der zweite Parameter muss 0 sein (als Integer) um anzugeben dass ein neues Element erstellt
; werden soll. Dieser wird an den Container dran gehängt.
; -> Der dritte Parameter ist optional. Bleibt er leer, so wird in das Element der Integer 0
; geschrieben. Ansonsten kann man einen eigenen Wert festlegen. Strings, Integers, Floats und
; die Bool'schen Werte "True" und "False" sind erlaubt! Das Schlüsselwort "Default" ist für
; die innere verarbeitung in der Funktion reserviert!
Container($idContainer, 0) ; Beinhaltet nun den Integer 0
Container($idContainer, 0, "String")
Container($idContainer, 0, 123)
Container($idContainer, 0, 12.3)
Container($idContainer, 0, True)
; Elemente verändern:
; Auch können Elemente verändert / überschrieben werden. Die Syntax ist die gleiche wie bei dem
; hinzufügen von Elementen. Nur dass an den zweite Parameter der Index übergeben wird. Ein
; Container beginnt mit dem Index 1!
Container($idContainer, 1, 10)
Container($idContainer, 5, False)
; Elemente lesen:
; Natürlich können Elemente auch wieder ausgelesen werden. Dafür wird die Syntax wie bei
; "Elemente verändern" verwendet nur ohne den dritten Parameter.
ConsoleWrite(Container($idContainer, 2) & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Element entfernen:
; Elemente können auch entfernt werden. Die Syntax ist die gleiche wie bei "Element hinzufügen"
; nur dass an den dritten Parameter das Schlüsselwort "Default" übergeben werden muss.
Container($idContainer, 2, Default)
ConsoleWrite(Container($idContainer, 2) & @CRLF)
; Anzahl Elemente:
; Um die Anzahl an Elementen in einen Container auszugeben, ist nur der erste Parameter zu
; verwenden!
ConsoleWrite(@CRLF & Container($idContainer) & @CRLF)
For $iCounter = 1 To Container($idContainer)
ConsoleWrite(Container($idContainer, $iCounter) & @CRLF)
Next
; Container löschen:
; Um den ganzen Inhalt eines Containers zu löschen, muss einfach nur der erste Parameter
; angegeben und der zweite mit dem Schlüsselwort "Default" besetzt werden. Einen ganzen
; Container komplett zu löschen würde in der derzeitigen Funktion nur zu einen ID Chaos führen.
; Ich werde das noch beheben!
Container($idContainer, Default)
Container($idContainer, 0, 'Alles gelöscht!')
For $iCounter = 1 To Container($idContainer)
ConsoleWrite(@CRLF & Container($idContainer, $iCounter) & @CRLF)
Next
; Anzahl Container:
; Falls man irgendwann einmal wissen muss, wieviele Container angelegt wurden, dann kann muss
; nur an den erste Parameter das Schlüsselwort "Default" übergeben werden.
ConsoleWrite(@CRLF & 'Anzahl Container: ' & Container(Default) & @CRLF)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; Alle Container löschen:
; Und um den Inhalt aller Container zu löschen, muss einfach an den ersten sowie zweiten
; Parameter das Schlüsselwort "Default" übergeben werden.
Container(Default, Default)
Container($idContainer, 0, 'Alles erneut gelöscht!')
For $iCounter = 1 To Container($idContainer)
ConsoleWrite(@CRLF & Container($idContainer, $iCounter) & @CRLF)
Next
Ich wünsche viel Spaß damit!