NewDynArray | Erzeugt ein Objekt der Klasse CDynArray |
SetSizeEstimate | Damit kann die zu erwartende Arraygrösse festgelegt werden, falls bekannt |
Clear | Löscht den Array und setzte seine Grösse auf 0 |
AddItem, AddObject | Fügt ein Element am Ende des Arrays an und vergrössert ihn entsprechend |
GetItem, GetObject | Abfrage eines bestimmten Array-Elementes |
ValidIndex | Test, ob ein Element-Index gültig ist |
GetArray | Gibt den gefüllten Array zurück |
JoinItems | Setzt alle Array-Elemente zu einem String zusammen |
set arr = NewDynArray( aSizeEstimate )
Die Funktion NewDynArray erzeugt ein CDynArray-Objekt.
In manchen Anwendungen ist ein Wert für die maximale Grösse des Arrays bekannt, zum Beispiel wenn Werte aus einem anderen Array gefiltert werden. In solchen Fällen ist es sinnvoll, das CDynArray-Objekt mit dieser Grösse zu initialisieren. Beim Aufruf der Funktion GetArray wird dann das CDynArray-Objekt auf die dem Füllstand entsprechende Grösse zurückgesetzt.
function FilterArray( aArray, aFilter ) dim filteredArray, i set filteredArray = NewDynArray( UBound(aArray)+1 ) for i = 0 to UBound(aArray) if InStr( aArray, aFilter ) then filteredArray.AddItem aArray(i) end if next FilterArray = filteredArray.GetArray(false) end function
dynArray.SetSizeEstimate aSize
Wenn man etwa weiss, wie viele Elemente in den Array maximal eingefügt werden sollen, so kann man dies dem CDynArray-Objekt mit SetSizeEstimate angeben. Der interne Array wird damit auf diese Grösse dimensioniert. Werden doch mehr Elemente eingefügt, so wird der interne Array jedoch weiter in grossen Schritten vergrössert.
SetSizeEstimate muss aufgerufen werden, bevor das erste Element in das CDynArray-Objekt eingefügt wird, da alle Items gelöscht würden.
Die erwartete Grösse eines Arrays kann auch direkt dem Konstruktor NewDynArray mitgegeben werden. SetSizeEstimate wird jedoch nützlich, wenn ein CDynArray-Objekt nach einem Clear wiederverwendet wird.
function FilterArray( aArray, aFilter ) dim filteredArray, i set filteredArray = NewDynArray(0) filteredArray.SetSizeEstimate UBound(aArray)+1 for i = 0 to UBound(aArray) if InStr( aArray, aFilter ) then filteredArray.AddItem aArray(i) end if next FilterArray = filteredArray.GetArray(false) end function
Die Funktion FilterArray gibt einen Array zurück, der alle Elemente aus aArray enthält, in denen der String aFilter vorkommt. Da die maximale Grösse des resultierenden Arrays gleich der Grösse von aArray ist, kann man mit SetSizeEstimate diese Grösse vorgeben. In der letzten Zeile der Funktion wird dann der filteredArray auf die effektive Füllgrösse redimensioniert.
dynArray.Clear
Löscht alle Items des CDynArray-Objektes. Der CDynArray befindet sich damit wieder im jungfräulichen Zustand und kann erneut gefüllt werden.
dynArray.AddItem aItem dynArray.AddObject aObject
Vergrössert das Array so, dass das neue Element am Ende eingefügt werden kann. Der Zugehörige Index, unter welchem das Element adressiert werden kann, ist über das Property LastIx abzufragen.
Intern wird das Array in grossen Schritten vergrössert und mit AddItem oder AddObject Schritt für Schritt aufgefüllt.
Es ist zwar möglich, CDynArray-Objekte mit gemischten Typen (any und object) zu erstellen. Dies ist aber nicht sinnvoll, da man beim Abfragen der Element unterscheiden muss, ob es ein Objekt oder ein generischer Datentyp ist.
x = dynArray.GetItem( aIndex ) set obj = dynArray.GetObject( aIndex )
Require: dynArray.ValidIndex( aIndex )
Mit GetItem bzw. GetObject kann auf die Elemente eines CDynArray-Objektes zugegriffen werden.
for i = 0 to dynArray.LastIx Output dynArray.GetItem(i) next
if dynArray.ValidIndex( aIndex ) then
Gibt true zurück, wenn aIndex ein im CDynArray-Objekt existierendes Element adressiert.
if dynArray.ValidIndex(i) then ele = dynArray.GetItem(i) else Output "Error: ungültiger Index " & i end if
arr = dynArray.GetArray( bClear )
Redimensioniert das interne Array eines CDynArray-Objektes auf den aktuellen Füllstand und gibt den Array zurück.
Wenn bClear = false ist, bleibt das interne Array des CDynArray-Objektes weiterhin bestehen und kann unabhängig vom zurückgegebenen Array weiter befüllt werden.
Aus Performancegründen wird mit GetArray keine Kopie des internen Arrays angelegt, sondern direkt das korrekt redimensionierte Arbeits-Array des CDynArray-Objektes zurückgegeben. Falls das CDynArray-Objekt danach weiter befüllt würde (bClear = false), wird jedoch intern ein redim preserve des Arbeits-Arrays nötig, womit eine vom zurückgegebenen Array unabhängige Arbeitskopie erstellt wird. Das von GetArray zurückgegeben Array ist also in jedem Fall vom CDynArray-Objekt unabhängig.
Setzen sie bClear = true, wenn sie das CDynArray-Objekt nach dem Aufruf von GetArray wiederverwenden wollen (von Grund auf neu befüllen).
Setzen sie bClear = false, wenn sie das CDynArray-Objekt nach dem Aufruf von GetArray nicht mehr benötigen oder später weitere Werte hinzufügen wollen. Beachten sie, dass dabei das mit GetArray zurückgegebene Array vom CDynArray-Objekt unabhängig ist!
function LoadDataListFromDb() dim recordSet, dataList set dataList = NewDynArray(0) set recordSet = LoadRecordsetFromDB() while not recordSet.EOF dataList.AddItem recordSet("Data") recordSet.MoveNext wend LoadDataListFromDB = dataList.GetArray(false) end function
str = dynArray.JoinItems( aSep, bClear )
Fügt alle Elemente des CDynArray-Objektes zu einem String zusammen, wobei die Elemente durch aSep voneinander separiert werden können. JoinItems funktioniert nur, wenn die Element des Arrays Strings sind oder in einen String konvertiert werden können.
Im Folgenden Beispiel werden aus einer Datenbank Name und Email gelesen und zu einem String zusammen gesetzt, der als To-Feld in einer Email-Komponente verwendet werden kann. Der Aufbau für das To-Feld muss wiefolgt sein:
"Name1" <email1@domain.com>, "Name2" <email2@domain.com>, ...
function GetEmailsFromDB() dim dynArr, recordSet set dynArr = NewDynArray(0) set recordSet = GetDataFromDB() while not recordSet.EOF dynArr.AddItem """" & recordSet("Name") & """ <" & recordSet("Email") & ">" recordSet.MoveNext wend GetEmailsFromDB = dynArr.JoinItems( ", ", false ) end function
Hinweis: Für solche Aufgaben ist die Klasse CStream auch bestens geeignet.