ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 23.01.2003

Diese Seite wurde zuletzt aktualisiert am 23.01.2003
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

DATA und READ

Zurück...


Anzeige

(-hg) mailto:hg_dataread@aboutvb.de

Die "Oldtimer" unter Basic-Entwicklern und "Fremdgänger" in so manchem anderem Basic-Dialekt werden sie vielleicht (noch) kennen: Die Anweisungen DATA, READ und RESTORE. In Visual Basic sind sie zwar noch nie verfügbar gewesen, aber deren Nachbildung ist ein leichtes Unterfangen.

Für diejenigen, die diese Anweisungen nicht kennen, seien sie einmal kurz erläutert. Hinter DATA-Anweisungen werden nahezu beliebig viele parameterähnlich Konstanten angeführt (Zahlen oder Strings), die über Aufrufe der READ-Anweisung nach und nach in Variablen eingelesen werden. Mit der Anweisung RESTORE wird die Ausleseposition wieder zurückgesetzt.

DATA "Hallo", "Welt"
DATA 12345, 47.11
...
READ A
PRINT A  ' --> "Hallo" wird ausgegeben
READ A
PRINT A  ' --> "Welt" wird ausgegeben
READ B
PRINT B  ' --> 12345 wird ausgegeben
...
RESTORE
READ C
PRINT C  ' --> "Hallo" wird erneut ausgegeben
...

Bei zeilenorientierten Interpreter-Basic-Dialekten kann bei der RESTORE-Anweisung sogar die Zeilennummer der DATA-Anweisung angegeben werden, ab der die dort angegebenen Daten erneut zum Auslesen zur Verfügung gestellt werden.

Weil sich die ganze Angelegenheit global in einer Anwendung abspielt, bauen wir nun in Visual Basic zunächst auch eine globale Nachbildung - in einem Standard-Modul. Da wir in Visual Basic gewöhnlich keine Zeilennummern verwenden, verzichten wir auch hier darauf - und damit auch auf ein spezifiziertes RESTORE.

Das Standard-Modul enthält die private Collection mData und die ebenso private Variable mIndex, die die aktuelle Ausleseposition nachhält. Der (natürlich öffentlichen) Prozedur Data werden die Werte in einem ParamArray übergeben. Somit entspricht der Aufruf exakt dem "alten" Vorbild. Die Werte (falls überhaupt welche übergeben werden) werden der Collection mData angefügt, die gegebenenfalls erstmals instanziert wird.

Private mData As Collection
Private mIndex As Long

Public Sub Data(ParamArray Items() As Variant)
  Dim nItem As Variant
  
  If UBound(Items) >= 0 Then
    If mData Is Nothing Then
      Set mData = New Collection
    End If
    With mData
      For Each nItem In Items
        .Add nItem
      Next
    End With
  End If
End Sub

Die Syntax des Auslesens lässt sich auch ganz einfach nachbilden - mit der schlichten Prozedur Read, der die zu füllende Variable übergeben wird. Der Positionsmerker mIndex wird um 1 erhöht und der an diesem Index in der Collection mData enthaltene Wert der Parameter-Variablen Var zugewiesen. War der Index schon beim aktuellen Füllstand der Collection angekommen, oder ist die Collection gar noch leer, wird ein Laufzeitfehler ausgelöst. Dieser Laufzeitfehler kann beispielsweise beim Auslesen in einer Schleife ausgewertet werden, um die Schleife zu verlassen.

Public Const ErrRead = 30001

Public Sub Read(Var As Variant)
  If mData Is Nothing Then
    Err.Raise ErrRead
  Else
    With mData
      If mIndex = .Count Then
        Err.Raise ErrRead
      Else
        mIndex = mIndex + 1
        If IsObject(.Item(mIndex)) Then
          Set Var = .Item(mIndex)
        Else
          Var = .Item(mIndex)
        End If
      End If
    End With
  End If
End Sub

Sie sind über die IsObject-Prüfung gestolpert? Nun, um unserem Modell mindestens die Flexibilität des Vorbildes zu verleihen, Strings und Zahlen beliebig und gemischt zu verarbeiten, beruht es auf dem Variant-Datentyp (außerdem kann ein ParamArray ja auch nur als Variant deklariert werden). Darum spricht auch nichts dagegen, zuvor instanzierte Objekte zu verarbeiten - was eben in der Prozedur berücksichtigt werden muss. Falls Sie diese Möglichkeit nutzen wollen, müssen Sie natürlich auch auf der Aufrufseite der Read-Prozedur bei der weiteren Verwendung der Parameter-Variablen daran denken, dass sie eine Objekt-Referenz enthalten könnte.

Der Aufruf des ebenfalls nachgebildeten RESTORE setzt lediglich den Positionsmerker auf 0 zurück.

Public Sub Restore()
  mIndex = 0
End Sub

Dem Original unbekannt ist die Möglichkeit, den DATA-Bestand komplett leeren, oder ihn, hier in der Form der Collection, für andere Zwecke verwenden zu können. Die folgende Prozedur Clear stellt den Ursprungszustand wieder her, indem die Collection mData zerstört und mIndex wieder auf 0 gesetzt werden.

Public Sub Clear()
  Set mData = Nothing
  mIndex = 0
End Sub

Die Collection selbst erhalten Sie über die Eigenschaft AllData:

Public Property Get AllData() As Collection
  If mData Is Nothing Then
    Set AllData = New Collection
  Else
    Set AllData = mData
  End If
End Property

Praktisch angewendet, etwa im Code eines Form_Load-Ereignisses, sähe es etwa so aus:

Private Sub Form_Load()
  Dim a As Variant
  
  Data "Hallo", "Welt"
  Data 12345, 47.11
  ' ...
  On Error Resume Next
  Do
    Read a
    If Err.Number Then
      Me.Print "Alle Werte ausgelesen"
      Exit Do
    End If
    Me.Print a
  Loop
End Sub

Sie können den exakt gleichen Code auch in ein Klassen-Modul anstelle eines Standard-Moduls einbringen und so beliebig viele verschiedene Instanzen eines solchen DATA-Speichers erhalten.


Beispiel-Projekt, Klase und Modul (dataread.zip - ca. 3,7 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer