© TRAC Optische Computer Sensorik, Stuttgart 2002, em@il: trac@n.zgs.de
BASIC ist ein Akronym (Beginner’s All-purpose Symbolic Instruction Code = Allzweck-Symbolbefehlssprache für Anfänger) und bezeichnet eine Programmiersprache, die Mitte der 60-er von den US- Amerikanern John Kemeny und Thomas Kurtz entwickelt wurde. Sie diente ursprünglich für Schulungszwecke.
Ursprünglich war BASIC als Interpretersprache konzipiert. Ein geringer Umfang an Befehlen, die Insensitivität gegenüber der Groß/Kleinschreibung und die Interaktivität durch den Interpreter führten dazu, daß BASIC inbesondere unter Anfängern beliebt wurde.

Beispiel: EXCEL wird als Kalkulationssoftware eingesetzt. Bestimmte Kalkulationen sollen online auf einem Webserver veröffentlicht werden, indem Inhalte aus Tabellenzellen in Datenbanktabellen auf dem Webserver übertragen werden. Für den Anwender soll die Übertragung genauso einfach wie ein Speichern des Arbeitsblattes sein. Als Werkzeug bietet sich hier VB und VBA an.
Sich wiederholende, komplexe Arbeitsabläufe können in einem Script erfasst, und auf Knopfdruck gestartet werden. Beispiele: Backup von Datenbanken/Festplatten, Wiederherstellen von Arbeitsoberflächen (Anmeldescripte). Als Werkzeuge bieten sich hier Scriptsprachen wie PERL ound VBScript an.
Auf einer Plattform (PC oder Microcontroller) wird eine völlig neue Anwendung erstellt. Als Werkzeuge bieten sich hier Entwicklungsumgen wie Visual C++ oder Visual.NET an. Dies ist der kompliziteste Fall. Die Entwicklung von Individualsoftware kann sogar zur entwicklung völlig neuer Programmierwerkzeuge führen (UNIX-> C, DHTML-> JavaScript)

Die Welt besteht aus Objekten, die miteinander kommunizieren. Die Kommunikation erfolgt über Botschaften, die in den meisten objektoriantierten Sprachen als Methoden realisiert sind. Botschaften können Produkte von Ereignissen im System sein wie z.B. das Anklicken einer Schalftfläche durch einen Benutzer. Anderseits können Botschaften programmgesteuert an Objekte gesendet werden. Damit lassen sich Verarbeitungsformen wie Stapelverarbeitung (übergabe der Kontrolle an ein weiteres Objekt) und Client/Server (Ausfrufen eines Dienstes im Objekt) realisieren.


|
Menge |
Beispiel |
|---|---|
|
ganze Zahlen |
123 |
|
negative Zahlen |
-123 |
|
rationale Zahlen |
123.4 |
|
rationale Zahlen in Exponentialschreibweise |
1.23e4 |
|
Wahrheitswerte |
true oder false |
|
Datumsangaben (ami- Format MM/DD/YYYY) |
#02/13/2004# |
|
Operator |
Beschreibung |
|---|---|
|
( ) |
Klammern |
|
^ |
Potenzieren |
|
- |
negatives Vorzeichen |
|
* / |
Multiplikation und Division |
|
\ |
Integer Division |
|
Mod |
Modulo bzw. Rest aus Division, z.B. 7 Mod 3 = 1 denn 2*3 + Rest 1 = 7 |
|
+ - |
Addition und Subtraktion |
|
< > = |
kleiner als, größer als, gleich |
|
<> <= >= |
ungleich, kleiner gleich, größer gleich |
|
Not |
logisches NICHT (Negation) |
|
And Or |
logisches UND, logisches ODER |
|
Xor Equ |
logisches Exlisiv ODER, Äquivalenz |
Unsere Programme realisieren Algorithmen, mit denen wir Daten verarbeiten. Um Zugriffe auf die Daten im Computerspeicher zu formulieren, muß uns die Programmiersprache entsprechende Ausdrucksmittel zur Verfügung stellen.
Ein elementares Ausdrucksmittel für Speicherzugriffe sind Variabeln.
Unter Variabeln können wir uns benannte Speicherplätze vorstellen. Variabeln sind immer vor ihrer Verwendung im Programmtext mittels einer Deklaration zu vereinbaren. In der Deklaration wird der zu verwendende Name für den Speicherplatz und der Datentyp festgelegt.
Dim Variabelname As Datentyp
Der Datentyp steht für eine Klasse von Daten. Beispielsweise verbirgt sich hinter dem Datentyp Integer die Menge aller ganzen Zahlen im Intervall [-32768, 32767]. Der Datentyp bestimmt, wie die Informationen als Dualzahlen im Speicher zu verschlüsseln sind, und wieviel Speicherplatz für die Variabel benötigt wird. So werden Variabeln vom Typ Integer vom Dezimal- ins Dualsystem konvertiert, und für sie ein Speicherplatz von 16bit = 2Byte reserviert.

(VB-Dok:Referenz/Zusätzliche Informationen/Datentypen)
Im der folgenden Tabelle werden alle elemntaren Datentypen der Programmiersprache VBA aufgelistet:
|
Datentyp |
Speicherbelegung |
Beschreibung |
|---|---|---|
|
Byte |
1 Byte |
Ganze Zahlen im Intervall [0, 255] |
|
Boolean |
2 Byte |
Wahrheitswerte der Menge {TRUE, FALSE} |
|
Integer |
2 Byte |
Ganze Zahlen im Intervall [-32768, 32768] |
|
Long |
4 Byte |
Ganze Zahlen im Intervall [-2147483648, 2147483647] |
|
Currency |
8 Byte |
Festkommazahlen mit 15 Stellen vor und 4 Stellen nach dem Komma |
|
Decimal |
12 Byte |
Unterdatentyp von Variant. Die Genauigkeit beträgt 28 Stellen. Die Anzahl der Nachkommastellen hängt von der Größe der Zahl ab- für eine 10- Stellige Zahl bleiben 18 Nachkommastellen. |
|
Single |
4 Byte |
Fließkommazahlen mit 8 Stellen Genauigkeit |
|
Double |
8 Byte |
Fließkommazahlen mit 16 Stellen Genauigkeit |
|
Date |
8 Byte |
Datum und Uhrzeit. |
|
String |
10 Byte + 2Byte pro Zeichen |
Zeichenketten. Die Maximal mögliche Länge ist nur durch den verfügbaren Speicherplatz beschränkt. |
|
Object |
4 Byte |
Verweist auf ein Objekt. Dazu später mehr. |
|
Variant |
16 Byte mindestens |
Defaultdatentyp, nimmt je nach Bedarf einen der obigen Variabeltypen an. Der Speicherplatz wird an die Erfordernisse angepasst. |
VB ermöglicht aus Gründen der Abwärtskompatibilität, auf die explizite Deklaration von Variablen zu verzichten. Die Deklaration erfolgt dann implizit durch Zuweisen eines Wertes an einen Variablenamen. Damit werden allerlei exotische Fehler, die sich oft erst zur Laufzeit outen, ermöglicht. Um diesen offensichtlichen Unsinn abzustellen, muß an den Beginn eines jeden Moduls die Compileranweisung
Option Explicit
gesetzt werden. In der VB- Entwicklungsumgebung kann unter Extras\Optionen\Editor eingestellt werden, daß jedes neu erzeugte Modul am Anfang ein solches Option Explicit gestempelt bekommt.
Der aktuelle Typ einer Variantvariabel kann mittels der Type- Name Funktion bestimmt werden:
x = 123 typ_x = TypeName(x) ' typ_x = "Integer"
Mit den Prädikaten IsNumeric und IsDate kann getestet werden, ob eine Zeichenkette in einen nummerischen- oder einen Datumswert gewandelt werden kann.
Dim eingabe As Variant, test As Boolean
eingabe = "einundzwanzig"
test = IsNumeric(eingabe)
eingabe = "21a"
test = IsNumeric(eingabe)
eingabe = "21,1"
test = IsNumeric(eingabe)
eingabe = "21#1"
test = IsNumeric(eingabe)
'----------------------------------------------------------------
eingabe = "2003-01-31" ' Datumsangabe im ODBC- Format
test = IsDate(eingabe)
eingabe = "2003-31-01" ' Datumsformat im SQL- Server Format
test = IsDate(eingabe)
eingabe = "2003-14-07 15:12:00"
test = IsDate(eingabe)
eingabe = #7/14/2003 3:12:00 PM#
test = IsDate(eingabe)Wurde einer Variantvariabel noch kein Wert zugewiesen, dann befindet sich das Typcodefeld in einem Startzustand EMPTY. Dieser Besondere Zustand kann mittels des Prädikates IsEmpty geprüft werden.

Bei der Datenbank-Programmierung trifft man sehr häufig auf Null-Felder, also Felder, die absolut leer sind. VB kennt für diesen Zustand die Konstante Null, welche nur selten für sinnvolle Operationen benutzt werden kann, im Gegensatz zu Empty, das sich wie ein neutrales Element (bzgl. Addition) verhält.
So ergibt z.B. Null + 5 einfach nur Null. Eine Zuweisung von Null an einen nicht-Variant erzeugt sogar einen Fehler. Mittels des Prädikates IsNull kann auf einen Null- Wert geprüft werden.
Input- Formularelemente speichern Werte immer als Zeichenketten.
|
Funktion |
Format |
|---|---|
|
Asc(zeichen) |
ASCII- Zeichenwert |
|
Cbool(d) |
Umwandlung in einen Boolean |
|
CByte(wert) |
Umwandlung in Byte |
|
CCur(wert) |
Umwandlung ins Währungstyp |
|
CDate(wert) |
Umwandlung in einen Datumstyp |
|
CDbl(wert) |
Umwandlung in doppelt genaue Fließkomma |
|
Chr(code) |
Zeichen aus Ascii- Code erzeugen |
|
CInt(wert) |
In einen Integer umwandeln |
|
CLng(wert) |
In einen Long umwandeln |
|
CSng(wert) |
Umwandlung in einfach genaue Fließkommazahl |
|
Fix(wert) |
Abschneiden der Nachkommastellen -8.4 wird zu -8 |
|
Int(wert) |
Umwandeln in Integer -8.4 wird zu -9 |
Implementieren Sie das Prädikat IsInteger(test as Variant) welches true zurückgibt, wenn test ein Integer- Literal ist, und sonst false.
Dim grosse_zahl As Variant 'Decimal kann nicht dierekt deklariert werden
' Durch Zuweisen des Ergebnisses der Typumwandlungsfunktion CDec an
' eine Variantvariable wird ein Decimalwert erzeugt
grosse_zahl = CDec("123456789012345678901234567")
grosse_zahl = 2 * grosse_zahlMittels der Format(Zahl, "Formatstring") Funktion kann ein Zahlenwert in eine Formatierte Zeichenkette umgewandelt werden.
dim ztxt as string ztxt = Format(1234,5678, "###.##") 'ztxt hat jetzt den Wert 1234,57
Zeichenketten können mit den Operatoren + und & zu einer neuen Verbunden werden.
|
Funktion |
Beschreibung |
|---|---|
|
Mid(zk, pos, länge) |
Schneidet aus Zeichenkette zk ab Position pos einen Substring der Länge länge aus. |
|
Len(zk) |
Bestimmt die Anzahl der Zeichen in Zeichenkette zk |
|
UCase(zk) |
Wandelt alle Zeichen in der Zeichenkette zk in Großbuchstaben um. |
|
LCase(zk) |
Wandelt alle Zeichen in der Zeichenkette zk in Kleinbuchstaben um. |
|
Ltrim(zk), Rtrim(zk), Trim(zk) |
Eliminiert alle Leerzeichen am Anfang, am Ende und am Anfang und Ende der Zeichenkette zk |
|
InStr(Start, zk1, zk2) |
liefert Position des ersten Vorkommens von zk2 innerhalb von zk1 ab Start |
Ü: Romzahl
Datumsangaben werden als Variant- Subtyp Date gespeichert.
Dim dat As Date
Etwas problematisch sind die Literale für Datumsangaben. Sie müssen stets im amerikanischen Format vorliegen (Monat/Tag/Uhrzeit) wobei sie in #-Symbolen geklammert werden
weihnachten = #12/24/2003#
Möchte man lieber das europäische Datumsformat verwenden, dann kann die Cdate- Funktion verwendet werden:
silvester = Cdate(31.12.2003 00:00)
Aus einzelnen Partikeln wie Jahr, Monat und Tag kann ein Datumswert mittels der Funktion DateSerial gewonnen werden:
silvester = DateSerial(2003, 12, 31)
Das aktuelle Datum wird mittels der eingebauten Funktion Now bestimmt
dat = Now ' Bestimmt aktuelles Datum und Uhrzeit
Au einem Datum sind Partikel wie Tag, Monat und Jahr herauslösbar
Dim tag As Integer, monat As Integer, jahr As Integer
tag = Day(dat)
monat = Month(dat)
jahr = Year(dat)Zur Bestimmung von Wochentagnummer und Name gibt es wiederum spezielle Funktionen
' Wochentagnummer und Wochentagname
Dim wtagnr As Integer, wtagname As String
wtagnr = Weekday(dat, vbMonday)
wtagname = WeekdayName(wtagnr, , vbMonday) Der Zeitraum zwischen zwei Zeitpunkten kann mittels der Funktion DateDiff berechnet werden:
' Seit wieviel Tagen gibt es Unix
Dim unixzeit_in_tagen As Integer
unixzeit_in_tagen = DateDiff("d", DateSerial(1970, 1, 1), Now)Zeitpunkte in der Zukunftund in der Vergangenheit können mittels DateAdd berechnet werden:
' Berechnen des Fälligkeitsdatums mittels DateAdd
Dim faelligkeit As Date
faelligkeit = DateAdd("m", 1, Now) Ü: Gbt-Wochentag, Wieviel Tage lebe ich
Zur Verarbeitung tabelarischer dienen in VB Arrays. Durch die Deklaration eines Arrays werden im RAM n Speicherplätze zur Aufnahme von Werten des Typs x reserviert.
Deklaration eines Arrays hat folgenden Aufbau:
dim a(3) as Integer
| | +----- Typ der Einträge
| +------------- größter Index eines Eintrages
+--------------- Name des ArraysNach einer Arraydeklaration ergibt sich folgendes Format im Arbeitspeicher:

Der
Zugriff auf die Elemente eines Arrays erfolgt über den Namen und
den Indize:
dim x as Integer
' x hat nach Ausführung dieser Anweisung den Wert 2
x = a(2)
| +--- Indize (Platznummer)
+----- ArraynameDie Indizes können dynamisch zur Laufzeit festgelegt werden. Damit ist eine komfortable Verarbeitung der Arraydaten in Schleifen möglich:
dim i as Integer, s as Long ' s enthält nach der Schleife die Summe aller Einträge for i = 0 to 3 s = s + a(i) next
Ü: Min/Max- Suche, Sortieren
Normalerweise beginnen die Indizes in Arrays bei 0. Mittels
Option Base 1
Kann der Compiler veranlasst werden, die Indizes im betreffenden Modul bei 1 beginnen.
Der Indexbereich eines Arrays kann auch völlig Flexibel mittels To Direktive definiert werden:
Dim Umsatzprognose(5, 10) as Currency
Die Anzahl der Plätze eines gewöhnlichen Arrays wird bei der Deklaration fest definiert. Wird ein Array mit Daten kontinuierlich gefüllt, dann läuft es irgend wann einmal voll. Sollen weitere Daten im Array abgelegt werden, dann muß es vergrößert werden.
Gewöhnliche Arrays sind nicht vergrößerbar. VB bietet einen zweiten Typ von Arrays, die sog. dynamischen Arrays. Sie werden mit einem unbestimmten max. Index wie folgt deklariert:
dim a() as Integer
Zur Laufzeit können die Dimensionen eines dynamischen Arrays mit der Prozedur ReDim <arrayName>( <neuerMaxIndex>) vergrößert und verkleinert werden wie folgt:
:
ReDim Preserve a(6) ' Das Array wird um 3 Elemente vergrößert, wobei der alte Inhalt erhalten bleibt
:
ReDim a(9) ' Das Array wird wiederum um 3 Elemente vergrößert. Diesmal wird der alte Inhalt jedoch nicht
' erhalten (Preserve fehlt)Ü: Prog. Messwerterfassung (akt. Wert, dyn. Mittelwert)
S.124
Dim telbuch as New Dictionary
telbuch.add "Schlüssel-1", wert1 : telbuch.add "Schlüssel-N", wertN
dim key as String for each key in telbuch MsgBox telbuch(key) next key
Eine spezielle Form von Variabeln sind Konstanten. Eine Konstante erhält bei der Deklarartion einen Wert zugewiesen. Im weiteren Programmablauf kann der Konstanten kein neuer Wert zugewiesen werden.
Const Name_der_Konstante = Wert
Beispiel
Const Pi = 3.142
Der Typ der Konstante wird automatisch bei der Zuweisung des Wertes aus diesem bestimmt.
|
|
|
|
|
|---|---|---|---|
|
|
Applikation |
|
|
|
|
|
|
|
|
|
|
Modul 1 |
|
|
|
|
|
Public eingabezeile as String |
|
|
|
|
Private akku as Double |
|
|
|
|
Private Sub addiere_click() |
|
|
|
|
Dim wert as Double |
|
|
|
|
wert = Val(eingabezeile) |
|
|
|
|
akku = akku + wert |
|
|
|
|
End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
|
Modul 2 |
|
|
|
|
|
Private arabzahl as Integer |
|
|
|
|
Private Sub M_Click() |
|
|
|
|
arabzahl = arabzahl + 1000 |
|
|
|
|
eingabezeile = Str$(arabzahl) |
|
|
|
|
End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In seiner Grundbetriebsart lädt der Computer eine Anweisung nach der anderen aus dem Arbeitsspeicher und führt sie aus. Viele Algorithmen erfordern jedoch, daß einige Abschitte aus den Anweisungslisten nur unter bestimmten Bedingungen auszuführen sind (z.B. „Wenn bis zum Tag X kein Zahlungseingang erfolgte, dann Mahnung abschicken“) oder wiederholt werden müssen. Um dies zu ermöglichen, verfügt der Computer über spezielle Anweisungen, die den Befehlszählerstand manipulieren. Sie bewirken, daß nach ihrer Ausführung das Programm an einer beliebigen neuen Adresse fortgesetzt wird. Aufgrund dieser Wirkung werden sie Sprunganweisungen genannt.
In VBA sind die Sprunganweisungen in Form von bedingt ausführbaren, oder bedingt wiederholbaren Programmabschnitten implementiert.
Bedingte Ausdrücke haben die Form
IIF(Bedingung, ExprA, ExprB)
Zuerst wird die Bedingung evaluiert. Ergibt sie den Wert true, dann wird ExprA evaliuiert und deren Wert ersetzt den kompletten bedingten Ausdruck. Sonst wird ExprB evaluiert, und deren Wert ersetzt den Ausdruck.
Der bedingt ausführbare Programmabschnitt entspricht einer Wenn ... dann Regel.
IF Bedingung Then
Anweisung 1
Anweisung 2
:
Anweisung n
End IFTrifft die Bedingung nicht zu, dann kann anschließend mit dem Schlüsselwort Else ein Programmabschnitt als Alternative formuliert werden:
IF Bedingung Then
Anweisung 1
:
Anweisung n
Else
Anweisung n+1
:
Anweisung n+m
End IFGibt es mehrere Alternativen, die von Zusatzbedingungen abhängig sind, dann können diese in ElseIf- Blöcken formuliert werden:
IF Bedingung Then
Anweisung 1
:
Anweisung n
ElseIF Bedingung2
Anweisung n+1
:
Anweisung n+m
End IFIst die Ausführung mehrerer Programmabschnitte vom Wert eines einzigen Ausdrucks abhängig, dann kann alternativ zu ElseIf eine vereinfachte Schreibweise mittels Select Case Block gewählt werden:
Select Case Ausdruck
Case Wert1
Anweisung 1
:
Anweisung n
Case Wert2
Anweisung n+1
:
Anweisung n+m
Case Wert3
:
Case Else
Anweisung
End Select Es handelt sich hierbei um Programmabschnitte, die sooft wiederholt werden, solange eine Bedingung zutrifft (wahr ist). Sie werden gewöhnlich als Schleifen bezeichnet. Zwei elementare Formen der Schleifen werden unterschieden: die abweisende, und die nichtabweisende Schleife.
Bei der abweisenden Schleife wird stets am Anfang des Programmabschnittes geprüft, ob die Bedingung für eine Ausführung des Abschnittes erfüllt ist. Wenn ja, dann wird der Programmabschnitt ausgeführt, und am Ende der Befehlszähler wieder auf die Startadresse des Programmabschnittes gesetzt. Gilt die Bedingung weiterhin, dann erfolgt eine wiederholte Ausführung des Programmabschnittes. Trifft die Bedingung nicht zu, dann wird der Programmabschnitt übersprungen.
DO Bedingung
Anweisung 1
Anweisung 2
:
Anweisung n
LoopBei der nichtabweisenden Schleife wird die Bedingung erst am Ende des Programmabschnittes überprüft. Trifft sie zu, dann wird der Befehlszähler auf den Abschnittanfang gesetzt, und dieser wiederholt. Sonst wird mit der nachfolgenden Anweisung fortgesetzt.
Da die Bedingung erst am Ende des Abschnittes überprüft wird, wird der Abschnitt immer mindestens einmal ausgeführt.
DO
Anweisung 1
Anweisung 2
:
Anweisung n
Loop BedingungSind Datenfelder fester Länge zu durchlaufen, oder Berechnung mit einer vorgegebenen Zahl wiederholt auszuführen, dann bietet sich die For...to ... next Schleife an:
FOR i = <Startwert> TO <Endwert> [STEP <Schrittweite>]
Anweisung 1
Anweisung 2
:
Anweisung n
NextZum Durchlaufen aller Felder eines Arrays kann die For Each - Schleife benutzt werden.
Fehler werden ignoriert:
On Error Resume Next
Nach Auftreten eines Fehlers wird zu einer Sprungmarke gesprungen, und das Programm dort fortgesetzt:
On Error Goto Sprungmarke
Informationen zum Fehler sind über das Fehlerobjekt Err abrufbar:
Err.Number ' Fehlernummer Err.Description ' Fehlerbeschreibung
Implementieren Sie einen Rechner, der Klammerausdrücke in Postfixschreibweise analysieren kann. Bsp.:
(5(3 4)+)*
Objekt |
Ein Objekt fasst Prozeduren und Daten zusammen, die Dinge und Prozesse beschreiben, welche in einem unmittelbaren Zusammenhang stehen. In der objektorientierten Sichtweise werden die Prozeduren eines Objektes als Methoden, und die Daten als Elemente bezeichnet. |
Durch die Einführung des Objektbegriffes in VB können Systeme mit komplexer innerer Struktur direkt beschrieben werden. Jedes Objekt wird mit einem Namen gekennzeichnet, jeder Prozess in einem Objekt durch eine sogenannte Methode ausgedrückt, und jeder Zustand durch eine Eigenschaft dokumentiert. Beziehungen und Prozesse, an denen mehrere Objekte beteiligt sind, können durch Methoden, die Objekte als Parameter erwarten, und Eigenschaften, die wiederum Objekte sind, ausgedrückt werden.

Das gesamte Sonnensystem wird als Superobjekt dargestellt
sonnensystem
Das Sonnensystem besteht aus Zentralstern, Planeten und Kometen. Diese drei Kategorieen können wiederum durch die die beiden Superobjekte planeten und kometen und dem Objekt zentralkoerper dargestellt werden, die Elemente des Superobjektes sonnensystem sind.
sonnensystem.zentralkoerper.name = „Sonne“ sonnensystem.planeten sonnensystem.kometen
Planeten beschreibt die Menge aller Himmelskörper. Diese werden jeweils durch Objekte dargestellt werden, die Datenelemente und Prozeduren enthalten, durch welche die astronomischen Daten dieser Himmelskörper dargestellt werden können:
sonnensystem.planeten(0).name = "merkur" sonnensystem.planeten(0).tagestemperatur = einheit_C(430) sonnensystem.planeten(1).name = "venus" sonnensystem.planeten(1).tagestemperatur = einheit_C(500) sonnensystem.planeten(1).name = "erde" sonnensystem.planeten(1).tagestemperatur = einheit_C(15)
Beschreiben Sie folgende Systeme durch Objektmengen
Bankkonto
Vektorrechnung
Klasse |
Eine Klasse ist eine Menge von Objekten, die einen gemeinsammen strukturellen Aufbau aus Daten und Prozeduren haben. Die Menge kann durch eine Klassendeklaration beschrieben werden. Eine Klassendeklaration listet Deklarationen von Datenelementen und Prozeduren auf, die die Objekte der Klasse enthalten. |
VB sieht für die Deklaration und Definition von Klassen sog. Klassenmodule vor. Eigenschaften werden durch private Modulvariabeln, die über Eigenschaftsprozeduren gelesen und gesetzt werden können, manipuliert.
Es wird ein Spiel entwickelt, welches eine Seeschalcht simuliert. Die Spielfiguren werden durch folgendes Objektmodell dargestellt:

Für
dieses Objektmodell könnte folgendes Klassenmodul mit dem Namen
Cschiff erzeugt werden:
Option Explicit
' Eigenschaften eines Kriegsschiffes
Dim p_anz_leben As Integer
' Positionsangabe des Schiffes in Pixel
Dim p_x As Integer, p_y As Integer
' Geschwindigkeit in x und y - Richtung
' Einheit ist 1 sm/h = 1 kn entspricht
' hier im Spiel 1 Pixel/Takt
Dim p_vx As Integer, p_vy As Integer
:
' Zugriffsfunktionen auf die Eigenschaften
Property Let vx(wert As Integer)
p_vx = wert
End Property
Property Get vx() As Integer
vx = p_vx
End Property
Property Let vy(wert As Integer)
p_vy = wert
End Property
Property Get vy() As Integer
vy = p_vy
End Property
Property Let x(wert As Integer)
p_x = wert
End Property
Property Get x() As Integer
x = p_x
End Property
Property Let y(wert As Integer)
p_y = wert
End Property
Property Get y() As Integer
y = p_y
End Property
Private Sub Class_Initialize()
' Konstruktor der Klasse CKSchiff
p_x = 500
p_y = 500
End Sub
Private Sub Class_Terminate()
' Destruktor
MsgBox "Hilfe, ich saufe ab"
End Sub
' Methode fahrt
Public Sub fahrt()
' Aus Gewschwindigkeit und aktueller Position wird eine
' neue Position errechnet
p_x = p_x + p_vx
p_y = p_y + p_vy
End Sub
Konstruktoren |
Spezielle Funktionen einer Klasse, die immer dann starten, wenn ein neues Objekt dieser Klasse erzeugt wird. Konstruktoren können wie normale Prozeduren Eingaben verarbeiten, jedoch können sie keine Ausgaben vornehmen ! |
Destruktoren |
Spezielle Funktionen einer Klasse, die immer unmitterlbar vor dem Löschen eines Objektes starten. |
|
Sub Class_Initalize() |
Wird beim Instanziieren eines Objektes aufgerufen |
|
Sub Class_Terminate() |
Wird beim Vernichten eines Objektes aufgerufen |

|
Steuerelement |
Ereignis |
Ereignisprozedur |
|---|---|---|
|
(Click) => |
Private Sub sf1_click() Dim meldung as String meldung = „Hallo Welt“ MessageBox meldung End Sub |
Alle Steuerelemente verfügen über einen gemeinsamen Satz an Methoden und Eigenschaften. Das folgende Objektdiagramm gibt eine Überblick über die wichtigsten:



Unter Weitere Steuerelemente kann aus dem großen Angebot von ActiveX- Controls ausgewählt werden. Bsp.: MSCAL- Kalender Steuerelement.

Jedes selbstdefinierte Formular in Excel folgt dem Bauplan der Klasse UserForm. Im Folgenden ein Ausschnitt aus dem Objektmodell der Klasse UserForm.


Durch die Methoden show und hide können Formulare angezeigt und wieder verdeckt vwerden:
Private Sub btnFormularVerdecken_Click()
UserForm1.Hide
End Sub
Private Sub btnStarteFormular_Click()
UserForm1.Show (False)
End SubEine Anwendung mit einem einzigen Formular wird mittels der Systemroutine Unload beendet:
Unload Me
Alternativ kann eine Anwendung auch mit der Anweisung End beendet werden:
End

Um eine MidiForm explizit zu beenden ist folgender Code notwendig:
Public Sub UnloadAll()
'------------------------------------------------------------
' Procedure: UnloadAll
' Purpose: To Unload all forms once the program finishes
' Input parameters: None
'
' Output parameters:None
'
' Return Value:None
' Author: PETER PILUK
' Date: 06/11/00
'------------------------------------------------------------
Dim f As Integer
f = Forms.Count
Do While f > 0
Unload Forms(f - 1)
If f = Forms.Count Then Exit Do
f = f - 1
Loop
End SubEs gibt zwei Varianten des Zugriffs auf Dateien: IO über die VB- eigenen Funktionen (prozedural) und über eine COM- Klassse des Betriebssystems (objektorientiert)
|
Zeit |
Operation |
Beispiel |
|---|---|---|
|
1 |
Öffnen |
Open "Daten.txt" For Input As #1 |
|
2 |
Lesen |
Dim w as String Input #1, w |
|
3 |
Schließen |
Close #1 |
|
Operation |
Textdateien |
Typisierte Dateien |
|---|---|---|
|
Trennzeichen zw. Datensätze |
ASCII 13 (Wagenrücklauf) und 10 (Zeilenvorschub) |
keine |
|
Öffnen |
'nur lesen Open <Dateiname> For Input As #<DatNr> 'nur schreiben Open <Dateiname> For Output As #<DatNr> 'Anhängen von Text Open <Dateiname> For Append As #<DatNr> |
'lesen und schreiben Open <Dateiname> For Random As #<DatNr> |
|
Lesen |
'Zeilenweise einlesen Dim s as String Line Input #1, s 'Anz Zeichen lesen (z.B. 3) s = Input(3, 1) |
' N-ten Datensatz lesen Get #1, N, <Datensatzvariabel> |
|
Schreiben |
Print #1, "Auszugebender Text" |
'N-ten Datensatz schreiben Put #1, N, <Datensatzvariabel> |
|
Dateilänge in Byte bestimmen |
Dim laenge as Integer laenge = LOF(1) |
|
|
Bestimmen, ob Datensatzende erreicht wurde |
Dim datenstzende as Boolean datensatzende = EOF(1) |
|
|
Anzahl der Datensätze Bestimmen |
Dim anz_datensaetze as Integer anz_datensaetze = LOF(1)/LEN(<datensatz>) |
|
|
Datensatzzeiger positionieren |
Seek #1, <neue_position> |
|
|
aktuelle Datensatzposition bestimmen |
Dim akt_pos as Integer akt_pos = Seek(#1) |
|

Beispiel:
' 14.10.2003
'
' Prog. zum Auflisten eines Ordnerinhaltes
' 1) Einlesen des Pfades von einer Dialogbox
Dim pfad_txt
pfad_txt = InputBox("Bitte geben Sie einen Pfad ein!", "Folder")
MsgBox pfad_txt
' Zugreifen auf den Ordner über die ActivX- Komponente Scripting.FileSystemObject
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.FolderExists(pfad_txt) then
MsgBox "Der Ordner " & pfad_txt & " existiert"
' 2) Ordnerinhalt ausgeben
' Anzeige aller Unterverzeichnisse vom Ordner
Dim uvz_liste_txt
uvz_liste_txt = "Uvz von Ordner:" & vbCrLf ' vbCrLf = Zeilenumbruchszeichen
for each el in fso.GetFolder(pfad_txt).subfolders
' el ist jetzt ein Folder (Unterverzeichnis-) Objekt
uvz_liste_txt = uvz_liste_txt & el.name & vbCrLf
next
MsgBox uvz_liste_txt
'---------------------------------------------------------------------------------
' Anzeige aller Dateien von LW C:
Dim dateien_liste_txt
dateien_liste_txt = "Datein von Ordner:" & vbCrLf
for each el in fso.GetFolder(pfad_txt).files
' el ist jetzt ein Folder (Unterverzeichnis-) Objekt
dateien_liste_txt = dateien_liste_txt & el.name & " " & el.size & vbCrLf
next
MsgBox dateien_liste_txt
else
MsgBox "Der Ordner " & pfad_txt & " existiert nicht"
end ifZugriff auf Datenbanken erfolgt über die ADO- Bibliothek.

|
Konstante für CommandType |
Wert |
Beschreibung |
|---|---|---|
|
adCmdText |
1 |
CommandText ist ein SQL- Befehl |
|
adCmdTable |
2 |
CommandText ist ein Tabellenname (wird in einen SQL- Befehl umgesetzt) |
|
adCmdStoredProc |
4 |
CommandText ist eine gespeicherte Prozedur |
|
adCmdFile |
256 |
CommandText ist der Dateiname eines persistenten Recordsets |
|
adCmdTableDirect |
512 |
CommandText ist ein Tabellenname (wird direkt vom Provider geliefert) |
Recordsets kapseln den Zugriff auf die Daten via Server- oder Clientseitiger Cursor. Standard ist ein Forward- Only- Cursor, bei dem die Datensätze nicht verändert werden können. Dies ist die effizienteste Form eines Cursors für den Datenbankserver. Soll das Recordset als DataSource für ein DataGrid dienen, so muß mindestens ein adOpenKeyset Cursor eingesetzt werden.
|
Cursor- Typ |
Wert |
Beschreibung |
|---|---|---|
|
adOpenStatic |
3 |
Statische Kopie aller Datensätze wird angelegt. Uneingeschränkte Navigation möglich. Änderungen an Daten ist nicht möglich |
|
adOpenForwardOnly |
0 |
Wie adOpenStatic mit der zusätzlichen Einschränkung, das Datensätze nur in vorwärtsrichtung durchlaufen werden können. Rücksprung zum Anfang führt zu erneuter Abfrage der Datensätze |
|
adOpenDynamic |
2 |
Datensätze können gelesen und geändert werden, beliebige Navigation ist möglich. Änderungen an Datensätze durch andere Benutzer ist sofort sichtbar. Erzeugt auf dem Datenbankserver den höchsten Verwaltungsaufwand. |
|
adOpenKeyset |
1 |
Wie adOpenDynamic, jedoch sind Änderungen an Datensätzen durch andere Benutzer nach dem öffnen nicht mehr sichtbar. Erzeugt etwas weniger Verwaltungsaufwand auf dem Datenbankserver als adOpenDynamic |
Locks sind Datensatzsperren, durch die der gleichzeitige Zugriff auf die Datensätze durch mehrere Benutzer gesteuert wird.
|
Lock- Typ |
Wert |
Beschreibung |
|---|---|---|
|
adLockReadOnly |
1 |
Daten können nur gelesen werden |
|
adLockPessimistic |
2 |
Schreib- und Lesezugriff. Eine Sperre wird gesetzt, sobald ein Feld beschrieben wird. |
|
adLockOptimistic |
3 |
Schreib- und Lesezugriff. Ein Sperre wird erst nach Anzeigen der Änderungen mittels Update auf den Datensatz gesetzt. |
' Verbindung zum server aufbauen
Dim con As Connection
Set con = New Connection
con.ConnectionString = "DSN=DBArtikel"
' Verbindung öffnen
con.Open
Dim cmd As Command
Set cmd = New Command
' Einstellen der Verbindung, über die Kommandos gesendet werden
Set cmd.ActiveConnection = con
' Das zu sendende SQLKommando definieren
cmd.CommandType = adCmdText
cmd.CommandText = "select pnr, name from dbo.produkte"
Dim rec As Recordset
Set rec = cmd.Execute
rec.MoveFirst
' Ausgabe des Tabellenkopfes
Dim kopfzeile As String
For i = 0 To rec.Fields.Count - 1
kopfzeile = kopfzeile & rec.Fields.Item(i).Name & vbTab
Next
lbxDaten.Clear
lbxDaten.AddItem kopfzeile
While Not rec.EOF
Dim zeile As String
zeile = ""
For i = 0 To rec.Fields.Count - 1
zeile = zeile & rec.Fields.Item(i).Value & vbTab
Next
lbxDaten.AddItem zeile
rec.MoveNext
Wend
con.Close Über ein Datagrid kann das Resultset auf einfache Weise tabellarisch dargestellt und editiert werden:

Wichtig
ist hierbei, daß die Verbindung mit dem Datenbankserver während
des gesamten Zeitraumes geöffnet ist. Beispielcode:
Dim cmd As Command
Set cmd = New Command
' Einstellen der Verbindung, über die Kommandos gesendet werden
Set cmd.ActiveConnection = con
' Das zu sendende SQLKommando definieren
cmd.CommandType = adCmdText
cmd.CommandText = "select pnr, name from dbo.produkte"
Dim rec As Recordset
'Set rec = cmd.Execute
Set rec = New Recordset
rec.Open cmd, , adOpenKeyset, adLockOptimistic
Set DataGrid1.DataSource = rec
' Achtung: con darf nicht geschlossen werdenDie Ergenismenge kann durch Filter nachträglich reduziert werden. Erlaubt sind alle SQL- Bedingungen.
Beispiel: Nach einer Abfrage auf die Artikel- Tabelle der Artikeldatenbank wird die Ergebnismenge auf alle Datensätze eingeschränkt, deren Vorrat kleiner 2 Stück ist:
rec.Filter = "Vorrat < 2"
In einer durch Recordset verwalteten Ergebnismenge kann mittels der Find- Methode nach einem bestimmten Datensatz gesucht werden. Der Cursor ist nach ausführen von Find auf den gesuchten Datensatz plaziert oder am Ende des Recordsets.
rec.Find = "lfnr = 2"
Hinzufügen eines Datensatzes
rec.AddNew ... rec.Update
Löschen eines Datensatzes
rec.Delete
Mittels Requery können Datensätze erneut abgefragt werden um die Konsistenz zwischen Recordset und Datenbank zu wahren.
rec.requery
Der Inhalt von Recordsets kann als XML- Datei auf der Festplatte gesichert werden wie folgt:
rec.Save "c:\daten\rec1.xml", adPersistXML
Später (z.B. nach erneuten Programmstart) können die Daten in das Recordset wieder zurückgeladen werden:
Dim rec As Recordset
Set rec = New Recordset
rec.Open "c:\daten\rec1.xml", "Provider=MSPersist"
Set DataGrid1.DataSource = recAdoDc ist ein AktiveX- Control, welches über Projekt\Komponenten\Microsoft ADO Data Control 6.0 eingebunden werden muß. Es kann als Datasource für DataGrid etc. genutzt werden.
Die wichtigsten Eigenschaften von AdoDc sind
ConnectionString: definiert die Verbindungszeichenfolge und damit ein Connection- Objekt zum Zugriff auf die Datenbank
CommandType: Definiert, ob RecordSource einen Tabellennamen, eines gespeicherte Prozedur oder eine SQL- Anweisung ist
RecordSource: In Abhängigkeit von CommandType ein Tabellenname, eine gespeicherte Prozedur oder eine SQL- Anweisung.
Form
PictureBox
|
Aufruf |
Beschreibung |
|---|---|
|
Objekt.Line (xs, ys) – (xe, ye)[, Farbe, [B][F]] |
Linie oder Rechteck zeichnen. Bei Linie kennzeichnen (xs, ys) und (xe, ye) der Start- und Endpunkt. Wird die Option B angegeben, dann zeichnet die Methode ein Rechteck. |
|
Objekt.Circle (xm, ym), radius, |
|
Über Add-Ins\AddInn- Manager den Verpackungs- und Weitergabeassistenten einbinden
Im Projektexplorer zum Projekt das Kontextmenü aufrufen, und hier den Paket- und Weitergabeassistenten aufrufen