© 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_zahl
Mittels 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 Arrays
Nach 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) +----- Arrayname
Die 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 IF
Trifft 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 IF
Gibt 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 IF
Ist 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 Loop
Bei 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 Bedingung
Sind 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 Next
Zum 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 Sub
Eine 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 Sub
Es 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 if
Zugriff 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 werden
Die 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 = rec
AdoDc 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