User Tools

Site Tools


vba:classes:iterator:index

This is an old revision of the document!


[VBA] Iterator

Download Iterator.cls

In VBA gibt es verschiedene Listen-Arten. Array, Collection und Dictionary. Wenn man noch mit RegExp arbeitet kommen MatchCollection und Match.Submatches dazu. Bei Recordset die Fields.

Jeder dieser Listen muss anderst behandelt werden. Mal beginnen die Indexe irgendwo (array), mal bei 1 (Collection), meistens bei 0 oder im Fall von Dictionaries muss man über den Key zugriffen werden.

Ich wollte ein einheitliches Konstrukt, durch dass ich bequem mittels Loop durchiterieren kann. Dabei kam die Iterator-Klasse heraus.

  • Definitionen
  • Anwendungsbeispiele
  • Code
Loading ...

Definitionen

Enumerator

itParams

'/**
' * Parameter zur Steuerung des Verhalten des Iterators
' * Die einzelnen Parameter sind mit + kombinierbar
' */
Public Enum itParams
    itNone = 0                          'Kein Parameter hat gültigkeit
    itNothingAsEmptyList = 2 ^ 0        'Leerer String, Nothing, Empty, Null wird als leere Liste akzeptiert und wirft kein Fehler
    itListNextNoParamsAsToNext = 2 ^ 1  'Wenn bei listNext keine Parameter angeben werden, einfach eins vorrücken.
    itErrorAtEmptyList = 2 ^ 2          'Fehler generieren, wenn die iListe leer ist
    itDaoValue = 2 ^ 3                  'Field-Value anstelle von Field ausgeben
    itIndexInsteadKey = 2 ^ 4                     'Gibt bei den toX() Funktionen den Index anstelle des Keys zurück
    itDefault = itNothingAsEmptyList + itListNextNoParamsAsToNext
    [_LAST] = 4
End Enum

Properties

Die Eigenschaften der Klasse.
r steht für Readable, w für writable

Properties zu den Daten

  • sourcerw Quellliste, über die Iteriert wird (Array, Collection etc.)
  • currentr Aktuelles Item
  • keyr Aktueller Key
  • indexr Aktueller Indes der Liste, beginnend mit dem listenspezifischen Anfang
  • absolutePositionr Absolute Position in der Liste, beginnend mit 0
  • BOFr Beginn of File. Wir sind vor dem ersten Eintrag
  • EOFr End of File. Wir sind nach dem letzten Eintrag
  • countr Anzahl Items in der Liste
  • isEmptyr Flag, ob überhaubt Einträge vorhanden sind: count=0

Propierties zur Iteratorsteuerung

Diese Properties sind die Einzeilzuordnungen zu itparams

  • Paramsrw Die Parameter als Enum-Set
  • paramNothingAsEmptyListrw Leerer String, Nothing, Empty, Null wird als leere Liste akzeptiert und wirft kein Fehler
  • paramListNextNoParamsAsToNextrw Wenn bei listNext keine Parameter angeben werden, einfach eins vorrücken.
  • paramErrorAtEmptyListrw Fehler generieren, wenn die iListe leer ist
  • paramDaoValuerw Field-Value anstelle von Field ausgeben
  • paramIndexInsteadKeyrw Gibt bei den toX() Funktionen den Index anstelle des Keys zurück

Methoden

Collection Class Methodes

Diese Funktionen dienesn dazu, dass die Klasse wie eine Collection genutzt werden kann.
http://msdn.microsoft.com/en-us/library/aa262338%28v=vs.60%29.aspx

NewEnum()

'/**
' * Der NewEnum wird für die For Each.. Next Schleife verwendet
' *
' * Diese Funktion hat das Attribut "'Attribute NewEnum.VB_UserMemId = -4"
' * !! Diese Iterierung hat keinen Einfluss auf die aktuelle Position !!
' *
' * @return Das nächste element
' */
Public Function NewEnum() As IUnknown

item()

'/**
' * Entspricht dem item()-Befehl der Listenobjekte
' * Alle 3 Propert-Funktionen aben das versteckte Attribut "Attribute item.VB_UserMemId = 0"
' * Dadurch kann mittels it(1), it("MyFeild"), it!MyField etc darauf zugegriffen werden.
' *
' * !! Das Verhalten dieser Funktion ist NICHT standartisiert. Sie entspricht dem entsprechenden Verhalten der Source !!
' *
' * @param  Variant Index/Key
' * @return Variant
' */
Public Property Get item(ByVal iIndex As Variant) As Variant

Initialisierungs-Methoden

initialize()

'/**
' * Initialisuert den Iterator
' * @param  Variant     Die Liste, über welche Iteriert werden soll
' * @param  itParams    Parameters
' * @return Boolean     true: iList ist eine Liste und hat Werte
' */
Public Static Function initialize( _
        ByRef iList As Variant, _
        Optional ByVal iParams As itParams = itDefault _
) As Boolean

initializeRs()

Die Parameters findest du hier. Sie sind mit + kombinierbar.

'/**
' * Analog zu initialze. Erstellt aber direkt ein Recordset aus einem SQL
' * @param  String      SLQ String
' * @param  itParams    Parameters
' * @return Boolean     true: iList ist eine Liste und hat Werte
' */
Public Static Function initializeRs( _
        ByVal iSql As String, _
        Optional ByVal iParams As itParams = itDefault _
) As Boolean

toNext()

'/**
' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value
' * @param  Variant     Key oder pos des Items
' * @param  Variant     Das Item himself
' * @return Boolean     EOF
Public Function toNext( _
        Optional ByRef oKey As Variant = Null, _
        Optional ByRef oItem As Variant = Null _
) As Boolean

toPrev()

'/**
' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value
' * @param  Variant     Key oder pos des Items
' * @param  Variant     Das Item himself
' * @return Boolean     EOF
Public Function toPrev( _
        Optional ByRef oKey As Variant = Null, _
        Optional ByRef oItem As Variant = Null _
) As Boolean

toFirst()

'/**
' * Geht zum ersten Datensatz.
' * Vorsicht, während reset() eins vor den ersten Datensatz geht, geht toFirst() bereits auf den ersten Datensatz
' * Somit ists das eigentlich reset()+toNext()
' * @param  Variant     Key oder pos des Items
' * @param  Variant     Das Item himself
' * @return Boolean     EOF
Public Function toFirst( _
        Optional ByRef oKey As Variant = Null, _
        Optional ByRef oItem As Variant = Null _
) As Boolean

toLast()

'/**
' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value
' * @param  Variant     Key oder pos des Items
' * @param  Variant     Das Item himself
' * @return Boolean     EOF
Public Function toLast( _
        Optional ByRef oKey As Variant = Null, _
        Optional ByRef oItem As Variant = Null _
) As Boolean

toPosition()

'/**
' * Geht zum nächsten Datensatz. Der Key und er Datensatz werden als Parameter zurückgegeben, EOF als Return-Value
' * @param  Long        Absolute Position. Zwischen 0 und Count-1
' * @param  Variant     Key oder index des Items
' * @param  Variant     Das Item himself
' * @return Boolean     EOF
Public Function toPosition( _
        ByVal iAbsolutPosition As Long, _
        Optional ByRef oKey As Variant = Null, _
        Optional ByRef oItem As Variant = Null _
) As Boolean

listNext()

Siehe auch [VBA] list()

'/**
' * Rückt den Zeiger um Eins vor und gibt die Elemente einer Unterliste aus.
' * @paramArray Variant    Auflistung der Variablen, die abgefüllt werden
' * @return     EOF
' */
Public Function listNext( _
        ParamArray oParams() As Variant _
) As Boolean

list()

Siehe auch [VBA] list()

'/**
' * Ggibt die Elemente der aktuellen Unterliste aus.
' * @paramArray Variant    Auflistung der Variablen, die abgefüllt werden
' * @return EOF & BOF
' */
Public Function list( _
        ParamArray oParams() As Variant _
) As Boolean

reset()

'/**
' * Setzt den pos auf den Start-1 zurück, so dass bei einem toNext() der erste Datensatz kommt
' */
Public Sub reset()

subIterator()

Wenn das Current-Objekt selber wieder iterierbar ist, kann mit dieser Methode direkt ein Iterator für das Objekt erstellt werden.

'/**
' * Gibt current als Iterator zurück
' * @return Iterator
' */
Public Property Get subIterator() As Iterator

Iterierbare Listen

Die folgenden Datentypen werden vom Iterator als Liste erkannt und können iteriert werden

  • Array
  • Dictionary
  • Collection
  • RegExp.MatchCollection
  • RegExp.Match
  • Dao.Recordset
  • Dao.Fields
  • Dao.Field
  • Properties

vba/classes/iterator/index.1393852590.txt.gz · Last modified: 03.03.2014 14:16:30 by yaslaw