WaBis

walter.bislins.ch

CDynArray: Funktionen

Mit den CDynArray-Funktionen werden dynamische Arrays erzeugt und vergrössert und es kann damit auf die Daten im Array zugegriffen werden.
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

NewDynArray

set arr = NewDynArray( aSizeEstimate )
aSizeEstimate: int >= 0
Legt die erwartete Grösse des Arrays fest. Wenn diese Grösse nicht bekannt ist, kann einfach 0 übergeben werden.
return: CDynArray

Die Funktion NewDynArray erzeugt ein CDynArray-Objekt.

Hinweis

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.

Beispiel

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

SetSizeEstimate

dynArray.SetSizeEstimate aSize
dynArray: CDynArray
aSize: int >= 0
Legt die erwartete Grösse des Arrays fest. Wenn diese Grösse nicht bekannt ist, kann einfach 0 übergeben werden.

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.

Hinweis

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.

Beispiel

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.

Clear

dynArray.Clear
dynArray: CDynArray

Löscht alle Items des CDynArray-Objektes. Der CDynArray befindet sich damit wieder im jungfräulichen Zustand und kann erneut gefüllt werden.

AddItem, AddObject

dynArray.AddItem aItem
dynArray.AddObject aObject
dynArray: CDynArray
aItem: any, not object
aObject: object

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.

Hinweis

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.

GetItem, GetObject

x = dynArray.GetItem( aIndex )
set obj = dynArray.GetObject( aIndex )
dynArray: CDynArray
aIndex: int >= 0
Das erste Element im Array hat den Index 0, das letzte LastIx.
return (GetItem): any, not object
return (GetObject): object

Require: dynArray.ValidIndex( aIndex )

Mit GetItem bzw. GetObject kann auf die Elemente eines CDynArray-Objektes zugegriffen werden.

Beispiel

for i = 0 to dynArray.LastIx
  Output dynArray.GetItem(i)
next

ValidIndex

if dynArray.ValidIndex( aIndex ) then
dynArray: CDynArray
aIndex: int

Gibt true zurück, wenn aIndex ein im CDynArray-Objekt existierendes Element adressiert.

Beispiel

if dynArray.ValidIndex(i) then
  ele = dynArray.GetItem(i)
else
  Output "Error: ungültiger Index " & i
end if

GetArray

arr = dynArray.GetArray( bClear )
dynArray: CDynArray
bClear: bool
Wenn bClear = true ist, wird das interne Array des CDynArray-Objektes neu angelegt (gelöscht) und das mit GetArray zurückgegebene Array kann unabhängig weiter verwendet werden.
return: Array

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.

Hinweis

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.

Empfehlung

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!

Anwendungsbeispiel

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

JoinItems

str = dynArray.JoinItems( aSep, bClear )
dynArray: CDynArray
aSep: string
Optionale Trennzeichen (z.B. ", " falls die Elemente im zurückgegeben String durch Komma von einander getrennt sein sollen).
bClear: bool
Wenn bClear = true ist, wird das interne Array des CDynArray-Objektes neu angelegt (gelöscht) und das mit GetArray zurückgegebene Array kann unabhängig weiter verwendet werden.
return: string

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.

Anwendungsbeispiel

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.

Weitere Infos zur Seite
Erzeugt Mittwoch, 3. Dezember 2008
von wabis
Zum Seitenanfang
Geändert Mittwoch, 10. August 2016
von wabis