Sie sind auf Seite 1von 94

VISUAL BASIC 3.

0 UND DBASE/ACCESS-
DATENBANKBEARBEITUNG IN BEISPIELEN

Diplomarbeit
im
Fachbereich Betriebswirtschaftslehre
der Fachhochschule Regensburg

Vorgelegt von
Georg Messerer

_________________________

Referent: Prof. Dr. Klausmann


Semester: Wintersemester 1994/95
INHALTSVERZEICHNIS

1. Einführung in die Arbeit mit Visual Basic _____________________________________ 4


1.1. Die Oberfläche von Visual Basic ___________________________________________________4
1.1.1. Das Menüfenster ____________________________________________________________________ 6
1.1.2. Das Entwurfsformular ________________________________________________________________ 6
1.1.3. Das Toolbox-Fenster _________________________________________________________________ 7
1.1.4. Das Properties-Fenster (Eigenschaftenfenster) _____________________________________________ 8
1.2. Programmerstellung mit Visual Basic _______________________________________________9
1.2.1. Das erste Programm _________________________________________________________________ 9
1.2.2. Zusammenfassung __________________________________________________________________ 12
1.2.3. Bearbeiten von Steuerelementen im Entwurfsformular _____________________________________ 12
2. Die wichtigsten Kontrollelemente im Hinblick auf die Datenbankprogrammierung ___ 14
2.1. Aktionsschalter ________________________________________________________________14
2.1.1. Funktion _________________________________________________________________________ 14
2.1.2. Die wichtigsten Eigenschaften ________________________________________________________ 14
2.1.3. Die wichtigsten Ereignisse ___________________________________________________________ 15
2.1.4. Die wichtigsten Methoden ___________________________________________________________ 15
2.1.5. Beispiel __________________________________________________________________________ 15
2.2. Textfeld _____________________________________________________________________16
2.2.1. Funktion _________________________________________________________________________ 16
2.2.2. Die wichtigsten Eigenschaften ________________________________________________________ 16
2.2.3. Die wichtigsten Ereignisse ___________________________________________________________ 17
2.2.4. Beispiel __________________________________________________________________________ 17
2.3. Bezeichnungsfeld _____________________________________________________________17
2.3.1. Funktion _________________________________________________________________________ 18
2.3.2. Die wichtigsten Eigenschaften ________________________________________________________ 18
2.3.3. Die wichtigsten Ereignisse ___________________________________________________________ 18
2.3.4. Beispiel__________________________________________________________________________ 18
2.4. Listenfeld ____________________________________________________________________21
2.4.1. Funktion _________________________________________________________________________ 21
2.4.2. Die wichtigsten Eigenschaften ________________________________________________________ 21
2.4.3. Die wichtigsten Methoden ___________________________________________________________ 23
2.4.4. Beispiel__________________________________________________________________________ 24
2.5. Schaltfelder___________________________________________________________________25
2.5.1. Funktion _________________________________________________________________________ 25
2.5.2. Die wichtigsten Eigenschaften ________________________________________________________ 25
2.5.3. Beispiel__________________________________________________________________________ 26
2.6. Beispiel zu den besprochenen Steuerelementen _______________________________________27
2.6.1. Programmüberblick _________________________________________________________________ 27
2.6.2. Quelltext _________________________________________________________________________ 29
2.6.3. Erweiterungsmöglichkeiten ___________________________________________________________ 32
2.7. Data Control __________________________________________________________________33
2.7.1. Die wichtigsten Eigenschaften ________________________________________________________ 33
2.7.2. Die wichtigsten Ereignisse ___________________________________________________________ 34
2.7.3. Die wichtigsten Methoden ___________________________________________________________ 34
2.7.4. Beispiel __________________________________________________________________________ 35

Seite 2 von 94
3. Datenbankprogrammierung ohne Data Control________________________________ 38
3.1. Arbeiten mit Datenbanken _______________________________________________________38
3.1.1. Allgemein ________________________________________________________________________ 38
3.1.2. Öffnen und Schließen einer Datenbank __________________________________________________ 38
3.1.3. Wichtige Methoden des "Database"-Objektes ____________________________________________ 40
3.2. Arbeiten mit Tabellen ___________________________________________________________40
3.2.1. Öffnen und Schließen von Tabellen ____________________________________________________ 40
3.2.2. Durchgehen einer Tabelle und Auflisten der Datensätze ____________________________________ 41
3.2.3. Verwendung von Indizes _____________________________________________________________ 43
3.2.4. Einfügen, Ändern und Löschen von Datensätzen __________________________________________ 45
3.2.5. Beispiel __________________________________________________________________________ 46
3.3. Arbeiten mit Abfragen __________________________________________________________52
3.3.1. Abfragen definieren ________________________________________________________________ 53
3.3.2. Abfragen anwenden ________________________________________________________________ 54
3.3.3. Beispiel __________________________________________________________________________ 54
3.4. Beispiele zu Standardproblemen der Datenbankbearbeitung _____________________________59
3.4.1. Berechnungen in Tabellen ____________________________________________________________ 60
3.4.2. Gruppenbearbeitung ________________________________________________________________ 61
3.4.3. Drucken mit Visual Basic ____________________________________________________________ 64
4. Beurteilung der Arbeit mit Access- und dBase-Dateien unter Visual Basic __________ 66
4.1. Visual Basic und Access-Datenbanken _____________________________________________66
4.2. Visual Basic und dBase-Datenbanken ______________________________________________67
4.3. Zusammenfassung _____________________________________________________________68
Anhang 1: Die Steuerelemente von Visual Basic __________________________________ 69
Anhang 2: Die wichtigsten Eigenschaften und Ereignisse von Visual Basic ____________ 78
Anhang 3: Glossar _________________________________________________________ 84
Anhang 4: Abbildungs- und Literaturverzeichnis __________________________________ 92

Seite 3 von 94
Einführung in die Arbeit mit Visual Basic

Mit der Version 3.0 von Visual Basic hat Microsoft ein Programmiersystem für
Windows vorgestellt, bei dem problemloses Arbeiten mit Datenbanken
verschiedener Formate ermöglicht werden soll. Meist sieht jedoch die Praxis
anders aus, als die vielversprechenden Ankündigungen der verschiedenen
Software-Häuser.
Ein Ziel dieser Arbeit wird es daher sein, diesen hohen Anspruch im Hinblick auf
den Zugriff auf Dateien im Access-, dBase III- und dBase IV-Format an
praktischen Problemen zu überprüfen. Hauptanliegen ist es aber, dem Visual
Basic-Anfänger die Möglichkeit zu geben, nach der eingehenden Beschäftigung
mit dieser Arbeit auch anspruchsvollere Datenbank-Anwendungen mit Visual
Basic entwickeln zu können. Vor allem durch Verdeutlichung aller theoretischen
Erklärungen mit kleinen, überschaubaren Beispielen soll dieses Ziel erreicht
werden.
Zu Anfang ist es unerläßlich, sich kurz mit der auf den ersten Blick vielleicht
etwas verwirrenden Oberfläche von Visual Basic zu beschäftigen. Danach soll
aber - vor allem um die einfache Programmerstellung mit Visual Basic zu
verdeutlichen - sofort in einer Schritt für Schritt-Anweisung ein erstes kleines
Programm erstellt werden.
Hierauf muß auf die wichtigsten Kontrollelemente für die
Datenbankprogrammierung eingegangen werden, da ohne Kenntnisse über diese
keine vernünftige Programmierarbeit mit Visual Basic möglich ist. Danach ist das
Thema aber nur noch Datenbankbearbeitung. Zuerst soll die Arbeit mit dem Data
Control vorgestellt werden, dann schwerpunktmäßig vor allem auch die Arbeit
ohne Data Control. Dabei muß immer der Blick sowohl der Arbeit mit Access-
als auch mit dBase-Datenbanken zugewandt sein.
Um die Beispiele zur Datenbankbearbeitung aber nachvollziehbar zu halten,
greifen diese ausnahmslos auf die mit Visual Basic mitgelieferte Access-
Datenbank "biblio.mdb" zu.

Die Oberfläche von Visual Basic

Nach dem Starten von Visual Basic präsentiert sich das Programm mit fünf
Fenstern, die alle von Bedeutung für die Programmentwicklung sind und auf die
im weiteren kurz eingegangen werden soll. Bei geschickter Anordnung der
verschiedenen Fenster erscheint die Programmieroberfläche ähnlich wie in
Abbildung 1 dargestellt.

Seite 4 von 94
Abb. 1. Die Programmoberfläche von Visual Basic

Diese Fenster bilden die integrierte Entwicklungumgebung (Erklärungen zu den


meisten Fachausdrücken finden Sie im Glossar in Anhang 3) von Visual Basic,
mit der Sie eigene Programme erstellen können. Mit Hilfe des Menüpunktes
‘Window’ können die Fenster übrigens beliebig aus- und eingeblendet werden.

Oben am Bildschirm sehen Sie das wohl wichtigste Fenster, das Menüfenster, mit
dem Sie Zugriff auf sämtliche Programmfunktionen von Visual Basic haben. In
dieses Fenster gelangen Sie von jedem der anderen Visual Basic-Fenster aus
entweder durch Drücken der "F10"-Taste oder gleichzeitiges Drücken der "Alt"-
Taste und einem der unterstrichenen Buchstaben in der Menüzeile oder durch
einen Mausklick in das Fenster.

Seite 5 von 94
Das Menüfenster

Abb. 2. Das Menüfenster


Das Menüfenster beinhaltet das Hauptmenü und eine Toolbar mit Tasten für oft
benötigte wichtige Programmfunktionen, es wird normalerweise oben am Bild-
schirm ausgegeben, kann aber beliebig plaziert werden.
Unter anderem können Sie hier Projekte laden und speichern, von Ihnen erstellte
Programme starten, oder verschiedene Einstellungen vornehmen. Die verschiede-
nen Menüpunkte sollen aber hier nicht im Einzelnen besprochen werden, sondern
fallweise, immer wenn sie benötigt werden.
Das Schließen des Menüfensters beendet auch Visual Basic.

Das wichtigste Fenster beim Programmieren mit Visual Basic ist das Entwurfsfor-
mular, mit dem die verschiedenen Formulare oder Forms, welche die Oberfläche
ihres Visual Basic-Programms bilden sollen, gestaltet werden können.

Das Entwurfsformular

Abb. 3. Das Entwurfsformular

Das Entwurfsformular dient der Erstellung von Fenstern für eigene Programme.
Unter Visual Basic ist der Oberflächen-Entwurf immer der Beginn eines neuen
Programmprojekts. Dazu können sämtliche Standard-Oberflächenelemente (auch
Steuerelemente oder Controls) von Windows verwendet werden und frei im
Entwurfsformular angeordnet und in ihrer Größe verändert werden.

Seite 6 von 94
Abb. 4. Beispiele für typische Windows-Steuerelemente

Die verschiedenen Controls werden beim Gestalten eines Formulars aus einer so
genannten Toolbox, schlechter ausgedrückt aus einem Werkzeugkasten,
entnommen.

Das Toolbox-Fenster

Abb. 5. Das Toolbox-Fenster

Dieses Fenster ermöglicht also den Zugriff auf die verschiedenen Steuerelemente,
die Visual Basic zur Verfügung stellt. Mit jeder der in Abbildung 5 zu sehenden
Tasten kann ein anderes Control im Entwurfsformular erstellt werden. (Einen
Überblick über sämtliche Steuerelemente, welche Visual Basic zur Verfügung
stellt, finden Sie in Anhang 1)

Nun kann ein gleiches Steuerelement im Fenster immer wieder verschieden ausse-
hen, wie es in Abbildung 6 anhand von verschiedenen Aktionsschaltern
dargestellt ist.

Seite 7 von 94
Abb. 6. Aktionsschalter mit unterschiedlichen Eigenschaften

Dazu sind nun jedem Steuerelement, aber auch jedem Formular, bestimmte
Eigenschaften zugeordnet, welche sein Aussehen und sein Verhalten bestimmen.
So gibt es Eigenschaften für die Länge, Breite und Position eines Controls, seine
Farbe, das Aussehen des Rahmens oder seine Beschriftung.
Alle Eigenschaften eines Steuerelements oder Formulars werden im Eigenschafts-
fenster angezeigt und können dort während des Formularentwurfs auch geändert
werden, ebenso kann man während der Laufzeit eines Visual Basic-Programms
die verschiedenen Eigenschaften modifizieren.

Das Properties-Fenster (Eigenschaftenfenster)

Abb. 7. Das Properties- oder Eigenschaftsfenster

Im Properties-Fenster werden also immer die gesamten Eigenschaften des ak-


tuellen (angeklickten) Steuerelements oder Formulars angezeigt.
Seite 8 von 94
Im Textfeld des Fensters kann jeweils eine Eingabe für
die aktuell ausgewählte (angeklickte) Eigenschaft
gemacht werden.
Bei vielen Eigenschaften kann auch durch Doppelklicken auf die jeweilige Zeile
durch die verschiedenen Einstellungsmöglichkeiten geschaltet werden.
Die einfachste Möglichkeit zu einer namentlich bekannten Eigenschaft im Fenster
zu springen ist es, die Tasten Ctrl (bzw. Strg) und Shift (also ) gleichzeitig mit
dem Anfangsbuchstaben der Eigenschaft zu drücken.

Um die vorausgegangenen Ausführungen zu verdeutlichen, soll nun Schritt für


Schritt ein erstes einfaches Visual Basic-Programm erstellt werden.

Programmerstellung mit Visual Basic


Das erste Programm

Zu Beginn soll folgender Aktionsschalter erstellt werden:

1. Drücken Sie dazu in der Toolbox auf den Knopf für Aktionsschalter.

2. Bewegen Sie dann den Mauscursor auf das Entwurfsformular, worauf der
Mauspfeil zu einem Fadenkreuz wird. Führen Sie dieses in die Nähe der linken
unteren Ecke des Fensters. Danach halten Sie bitte die linke Maustaste gedrückt
und ziehen Sie mit der Maus ein Viereck auf. Die hellgraue Linie zeigt dabei die
Umrisse an, welche der Aktionsschalter hernach haben wird. Lassen Sie als
letztes, wenn das hellgraue Viereck der gewünschten Form des Schalters ent-
spricht, die linke Maustaste wieder los. Sofort erscheint nun eine Schaltfläche in
der angegebenen Form, mit der Beschriftung 'Command1'.
Zur Bearbeitung (Größenveränderungen etc.) von schon im Entwurfsformular
plazierten Controls finden Sie näheres nach diesem Beispiel unter Punkt .
Bearbeiten von Steuerelementen im Entwurfsformular.

3. Wie Sie sehen ist der Schalter standardmäßig mit 'Command1' beschriftet. Zum
Ändern der Beschriftung klicken Sie bitte im Properties-Fenster auf die
Eigenschaft Caption. Nun können Sie im Textfeld des Fensters als neue Be-
schriftung 'Ende' eingeben.

Seite 9 von 94
Abb. 8. Verändern der "Caption"-Eigenschaft im Properties-Fenster

4. Doppelklicken Sie als nächstes auf den neuen Schalter. Es erscheint nun ein
Editorfenster zum Eingeben von Basic-Programmcode. Geben Sie zwischen 'Sub
Command1_Click ()' und 'End Sub' einfach 'End' ein.

Abb. 9. Editorfenster zum Eingeben von Basic-Quellcode

'End' ist ein Basic-Befehl und beendet das laufende Basic-Programm.


Das Basic-Unterprogramm 'Sub Command1_Click ()' wird immer ausgeführt, wenn
der zugehöriger Aktionsschalter gedrückt wird. Immer dann wird also das Pro-
gramm beendet.
Schließen Sie nun das Editor-Fenster wieder durch einen Doppelklick in der
linken oberen Ecke des Fensters.

5. Nun können Sie die Anwendung schon durch Drücken der "Start"-Taste im
Menüfenster von Visual Basic testen.

Es erscheint ein leeres Fenster mit dem Aktionsschalter ' Ende', den Sie bitte mit
der Maus anklicken, um das Programm wieder zu beenden.
Seite 10 von 94
Um das Ganze etwas interessanter zu machen wollen wir die kleine Applikation
noch etwas erweitern.

6. Drücken Sie im Toolbox-Fenster auf die Taste für Textfelder.

7. Ziehen Sie nun wie unter Punkt zwei beschrieben wieder irgendwo im Formular
ein Viereck auf. Nach Loslassen der linken Maustaste erscheint das Textfenster.

8. Erstellen Sie dann nach Drücken der Taste für Aktionstasten eine weitere
Aktionstaste und ändern Sie die Beschriftung 'Command2' in 'OK'.

Das Entwurfsformular müßte daraufhin ungefähr so aussehen:

Abb. 10. Das Entwurfsformular für das Beispiel

9. Doppelklicken Sie dann auf den neuen Aktionsschalter ('OK') und schreiben Sie
zwischen 'Sub Command2_Click ()' und 'End Sub' die Zeile:

MsgBox ("Eingegeben: " + Text1.Text)

Diese Zeile wird immer dann ausgeführt, wenn während der Programmlaufzeit
der Schalter 'OK' gedrückt wird.

'MsgBox' ist ein Befehl zur Ausgabe einer Meldung am Bildschirm in einem Fen-
ster. Dabei steht die Meldung hinter dem Befehl in Klammern eingeschlossen.

' "Eingegeben: " ' ist erkärender Text im Meldungsfenster.

Seite 11 von 94
'Text1.Text' ist immer der Text, der gerade in unserem Textfeld steht. 'Text1' ist der
Name des Textfeldes und '.Text' bezeichnet die Eigenschaft 'Text' des Textfeldes.
Testen Sie nun das Programm, um klarer zu sehen.

10. Schließen Sie dazu das Editorfenster durch einen Doppelklick in die linke
obere Ecke und drücken Sie dann im Menüfenster von Visual Basic wieder die
"Start"-Taste.

Wenn Sie nun einen beliebigen Text in das Textfeld eingeben und den Schalter
'OK' drücken, wird der eingegebene Text in einem Meldungsfenster am
Bildschirm angezeigt, und mit Drücken des Schalters 'Ende' läßt sich das
Programm wieder beenden.

Zusammenfassung
 Bei jedem Mausklick auf einen Aktionsschalter tritt das Click-Ereignis dieses
Steuerelements auf und das entsprechende Unterprogramm wird automatisch auf-
gerufen.
Der ganze Ablauf von Visual Basic-Programmen wird durch solche Ereignisse
(events) gesteuert, die immer in Verbindung mit Oberflächenobjekten ausgelöst
werden, wie etwa in unserem Programmbeispiel ein Mausklick auf einen Schalter.
Weitere Ereignisse werden fallweise besprochen, eine Liste mit den wichtigsten
Ereignissen von Visual Basic finden Sie in Anhang 2.

 Zugriff auf die Eigenschaften der Steuerelemente eines Formulars hat man aus
dem Quellcode über den jeweiligen Namen des Controls - in unserem Beispiel
'Text1' - dann einen '.' und nachfolgend der Name der gewünschten Eigenschaft,
die ermittelt oder geändert werden soll.
Der Name eines Kontrollelements kann übrigens in der Entwurfsphase mit der
Eigenschaft "Name" abgeändert werden.

Bearbeiten von Steuerelementen im Entwurfsformular


Wollen Sie an einem bestimmten Steuerelement im Entwurfsformular Änderun-
gen vornehmen, wählen Sie als erstes das gewünschte Element mit einem
Mausklick aus. Dieses Auswählen wird meist als Markieren bezeichnet. Sofort
wird das Control mit sechs schwarzen Punkten wie in Abbildung 11 dargestellt.

Abb. 11. Ein markiertes Steuerelement

Seite 12 von 94
Führt man nun den Mauscursor auf einen der schwarzen Punkte, ändert sich das
Aussehen des Cursors und durch Ziehen der Maus bei gedrückter linker
Maustaste, läßt sich die Größe des Steuerelements verändern.
Um die Position eines Control zu modifizieren, führen Sie den Cursor bitte auf
das entsprechende Steuerelement und ziehen dann die Maus bei gedrückter linker
Maustaste.
Entfernen können Sie ein Kontrollelement, indem Sie es markieren und dann die
Taste "Entf" bzw. "Del" drücken.
Im Eigenschaftsfenster werden übrigens immer die Eigenschaften des gerade
markierten Steuerelements angezeigt und können nach Belieben bearbeitet
werden.

Seite 13 von 94
Die wichtigsten Kontrollelemente im Hinblick auf die Datenbankpro-
grammierung
Da nicht alle Steuerelemente, die Visual Basic zur Verfügung stellt für die Daten-
bankprogrammierung von Bedeutung sind, soll hier nur auf einige ausgewählte
Controls näher eingegangen werden.

Aktionsschalter

Abb. 12. Ein Aktionsschalter und die zugehörige Taste aus dem Toolbox-Fenster

Funktion
Ein Aktionsschalter ist, wie schon aus obigem Beispiel bekannt, eine bildlich dar-
gestellte Funktionstaste, die in der Regel durch die Maus angesteuert wird. Durch
einen Aktionsschalter kann eine vom Programmierer definierte Aktion ausgeführt
werden.
Jede Taste kann mit einem beliebigen Text beschriftet werden, wobei die wichtig-
sten und häufigsten Texte "OK", "Abbrechen", "Hilfe", "Ja", "Nein" und "Weiter"
sind.
Mit dem Zeichen "&" kann eine Direktzugriffstaste für einen Aktionsschalter
definiert werden. Soll zum Beispiel der Schalter "Hilfe" mit den Tasten "Alt" und
"H" aufgerufen werden, so ist die Beschriftung auf "&Hilfe" zu setzen.1

Die wichtigsten Eigenschaften


 Cancel2
Wird diese Eigenschaft für einen Schalter auf True (also wahr) gesetzt, kann
dieser auch durch Drücken der "Esc"-Taste aktiviert werden. Das ist also vor
allem für Schalter mit der Beschriftung "Abbrechen" geeignet.
 Caption
Mit dieser Eigenschaft kann man die Beschriftung des Schalters festlegen.
 Default

1
Dr. Pia Maslo, Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für Windows, 1. Auflage 1993, DATA
BECKER GmbH, Düsseldorf, S. 170 f.
2
Die Namen und Erklärungen der Eigenschaften, Ereignisse und Methoden von Objekten sind jeweils der
Hilfedatei "VB.HLP" zu Microsoft Visual Basic 3.0 entnommen.
Seite 14 von 94
Ist diese Eigenschaft True gesetzt, wird der entsprechende Schalter auch durch
Drücken der "Return"-Taste aktiviert. Das bietet sich also meist für Tasten mit
der Beschriftung "OK" an.
 Name
Diese Eigenschaft dient der Benennung des Aktionsschalters, und zwar wird
hiermit der Name festgelegt, mit dem der Aktionsschalter im Basic-Quellcode
angesprochen werden soll.

Die wichtigsten Ereignisse


 Click
Die hauptsächlich benötigte Ereignisprozedur bei Aktionsschaltern ist die "Na-
me_Click ()"-Prozedur, die immer bei Eintreten des Mausklick-Ereignisses
aufgerufen wird, also jedesmal, wenn mit der Maus auf den Schalter geklickt
wird. Die Methode wird ebenfalls aufgerufen, wenn "Return" (bei einem
Schalter mit der Eigenschaft Default gleich True) oder "Esc" (bei einem
Schalter mit der Eigenschaft Cancel gleich True) gedrückt wird.
 GotFocus
Dieses Ereignis tritt ein, wenn der Aktionsschalter den Fokus erhält.
 LostFocus
Dieses Ereignis tritt ein, wenn der Aktionsschalter den Fokus verliert.

Die wichtigsten Methoden


Am wichtigsten ist wohl die Methode "SetFocus", mit der Sie den Fokus einer
Schaltfläche erteilen können.

Beispiel:
Command1.SetFocus  erteilt der Schaltfläche mit Namen "command1"
den Fokus

In gleicher Weise kann man bei den meisten anderen Kontrollelementen den Fo-
kus zuweisen, also z.B. 'Text1.SetFocus' oder 'List1.SetFocus'.

Beispiel
Ein Beispiel zu Aktionsschalter finden Sie unter 1.2.1. Das erste Programm.

Seite 15 von 94
Textfeld

Abb. 13. Ein Textfeld und die zugehörige Taste aus dem Toolbox-Fenster

Funktion
Textfelder dienen der Abfrage von Benutzereingaben. Eingesetzt werden
Textfelder vor allem, um Dialogfelder oder Eingabemasken zu definieren, oder
auch um einen Texteditor zu programmieren, da ein Textfeld auch mehrzeilig
sein kann.
Außerdem ist es auch möglich ein Textfeld als Verknüpfung zu einem
Datenbankfeld zu benützen. Näheres dazu unter dem Punkt 2.6. Data Control.

Die wichtigsten Eigenschaften


 DataField und DataSource
Dies sind Eigenschaften, welche zur Verknüpfung mit einer Datenbank nötig
sind, näheres dazu unter Punkt 2.6. Data Control.
 MaxLength
Damit können Sie die maximale Länge des Eingabetextes festlegen. Ist der zu-
geordnete Wert gleich Null, so ist die Länge nicht beschränkt, d.h. es können
bis zu 2.048 Zeichen in ein einzeiliges Feld und 32.000 Zeichen in ein
mehrzeiliges eingegeben werden.
 MultiLine
Ist diese Eigenschaft True gesetzt, so ist das Textfeld mehrzeilig, andernfalls
einzeilig.
 ScrollBars
Hier können für mehrzeilige Textfelder horizontale und/oder vertikale
Bildlaufleisten gesetzt werden. Durch Doppelklicken auf die Eigenschaft im
Properties-Fenster schalten Sie durch die verschiedenen
Einstellungsmöglichkeiten.
 Text
Hier haben Sie die Möglichkeit Text festzulegen, der als Vorgabetext im Text-
feld zur Programmlaufzeit ausgegeben wird.

In Abbildung 12 sehen sie ein Textfeld, bei dem MultiLine "True", ScrollBars "3
- Both" und Text gleich "Vorgabe" gesetzt ist.

Seite 16 von 94
Abb. 14. Mehrzeiliges Textfeld mit horizontaler und vertikaler Bildlaufleiste

Die wichtigsten Ereignisse


 Change
Dieses Ereignis tritt immer ein, wenn sich der eingegebene Text des Textfeldes
ändert, also wenn sich die Eigenschaft "Text" ändert. Das Ereignis tritt nicht
erst ein, wenn das Textfeld den Focus verliert, also die Eingabe abgeschlossen
ist, sondern sofort wenn sich auch nur ein Buchstabe geändert hat.
 GotFocus
Diese Ereignisprozedur wird aufgerufen, immer wenn das Textfeld den Focus
erhält.
 LostFocus
Das Ereignis tritt ein, wenn das Textfeld den Focus verliert.

Beispiel
Für ein Beispiel zur Anwendung eines Textfeldes gehen Sie bitte zu Punkt 1.2.2.
Das erste Programm.

Bezeichnungsfeld

Abb. 15. Ein markiertes Bezeichnungsfeld und die zugehörige Taste aus dem Toolbox-Fenster

Seite 17 von 94
Funktion
Ein Bezeichnungsfeld dient der Anzeige von ein- oder mehrzeiligem Text. Es
kann z.B. vor Textfeldern verwendet werden zur Erklärung, was eingegeben
werden soll. Bezeichnungsfelder können während der Laufzeit des Programms
nicht den Fokus erhalten, daher also nicht bearbeitet werden.

Die wichtigsten Eigenschaften


 Caption
Dies ist die wohl wichtigste Eigenschaft, da Sie hier den Text eingeben, der
angezeigt werden soll.
 DataField und DataSource
Dies sind Eigenschaften, welche zur Verknüpfung mit einer Datenbank nötig
sind, näheres dazu unter Punkt 2.6. Data Control.
 FontName, FontSize, Font...
Mit diesen Eigenschaften können Sie das Aussehen des Textes bestimmen.

Die wichtigsten Ereignisse


Falls man das Bezeichnungsfeld nur zur Textanzeige benutzt, benötigt man
eigentlich keine der Ereignisprozeduren, ansonsten sind es ähnliche, wie beim
Textfeld.
 Change
Dieses Ereignis tritt immer ein, wenn sich der Text des Labels ändert, also
wenn sich die Eigenschaft "Caption" ändert.
 Click
Diese Prozedur wird aufgerufen, wenn auf das Bezeichnungsfeld mit der
Maus geklickt wird.

Beispiel
Als Beispiel für die Anwendung von Bezeichnungsfeldern soll ein kleines
Programm erstellt werden, das vor allem auch den Zugriff auf
Objekteigenschaften während der Programmlaufzeit zeigt.

Legen Sie dazu ein neues Projekt an, indem Sie im Menüfenster unter dem Punkt
'File' den Unterpunkt 'New Project' mit der Maus anwählen (Abbildung 16).

Seite 18 von 94
Abb. 16. Mit diesem Menüpunkt wird ein neues Projekt angelegt

Dann legen Sie bitte wie unter 1.2.1. Das erste Programm demonstriert eine
Schaltfläche "Ende" zum Beenden des Programms an. (Vergessen Sie nicht die
End-Anweisung im Click-Ereignis des Ende-Schalters!)
Danach platzieren Sie bitte noch eine Schaltfläche mit der Beschriftung "Ändern"
und ein Bezeichnungsfeld in das Formular.
Das Entwurfsformular sollte dann ungefähr wie in Abbildung 17 aussehen:

Abb. 17. Das Entwurfsformular für das Beispiel zum Bezeichnungsfeld

Nun öffnen Sie bitte ein Editorfenster für die Click-Ereignisprozedur des
Schalters "Ändern", indem Sie auf diesen doppelklicken.
Geben Sie dann den in Abbildung 18 dargestellten Quelltext ein.

Seite 19 von 94
Abb. 18. Der Quelltext für die Taste Ändern

Die Einrückungen sind nicht zwingend vorgeschrieben, sie dienen aber der besse-
ren Übersichtlichkeit des Quelltextes, weshalb Sie sich diese von Anfang an zur
Gewohnheit machen sollten.
Mit der Eigenschaft FontItalic können Sie Kursivschrift (Einstellung True) oder
Normalschrift (Einstellung False) festlegen. Wird nun die Taste Ändern gedrückt,
und die Schrift in Label1 ist kursiv (Label1.FontItalic = True), wird die
Normalschrift eingestellt (der Then-Teil tritt ein) und umgekehrt (der Else-Teil
tritt ein).

Beginnen Sie das Programm wieder durch Drücken der Starttaste, und
beenden Sie es nach dem Test mit der "Ende"-Taste.

Nun wollen wir unser Projekt noch abspeichern!


Wählen Sie dazu im Menüfenster unter dem Punkt 'File' den Unterpunkt 'Save
Project'. Darauf öffnet sich das Save-as-Dialogfenster zum Speichern des
entworfenen Formulars. Geben Sie im Textfeld 'File Name' 'bsp1.frm' ein und
drücken Sie die Taste "OK". Nun wird das neu angelegte Formular gespeichert.

Seite 20 von 94
Abb. 19. Das Speichern-unter-Dialogfeld von Visual Basic
Sofort darauf öffnet sich das Fenster wieder, diesesmal aber mit der Überschrift
'Save Project as'. Geben Sie den Dateinamen "bsp1.mak" ein und speichern Sie
das Projekt mit Anklicken des "OK"-Schalters. In dieser "*.MAK"-Datei sind nun
die Namen aller Dateien gespeichert, welche zu dem "Bsp1"-Beispiel gehören, so
daß sie beim Projekt-Öffnen ins Projektfenster geladen werden können.

Zum Öffnen von Projekten wählen Sie bitte im Menüfenster bei dem Punkt ' File'
den Unterpunkt 'Open Project'. Es erscheint wieder ein ähnliches Fenster, wie beim
Speichern. In der Listbox mit den Dateinamen können Sie hier ein Projekt
anklicken, das anschließend geladen wird.

Listenfeld

Abb. 20. Ein Listenfeld und die zugehörige Taste aus dem Toolboxfenster

Funktion
In einem Listenfeld werden verschiedene Einträge zur Auswahl angeboten.
Während der Laufzeit des Programms können dann mehrere oder ein Eintrag aus
der Liste durch den Anwender ausgewählt und im Programm weiterverarbeitet
werden.

Die wichtigsten Eigenschaften


 Columns
Mit dieser Eigenschaft ist es möglich mehrspaltige Listenfelder zu definieren.
Ist die Einstellung "0", handelt es sich um ein einspaltiges Listenfeld, bei dem
alle Einträge untereinander stehen. Falls nötig, wird es automatisch mit einem
vertikalen Rollbalken versehen.
Setzt man für die Eigenschaft einen anderen Wert als 0, werden die Einträge
nebeneinander geschrieben, wobei in der am Bildschirm sichtbaren Liste
immer soviele Spalten angezeigt werden, wie für "Columns" gesetzt ist.

Seite 21 von 94
Abb. 21. Listenfeld mit columns = 2 und columns = 3

 List
Diese Eigenschaft kann während der Entwurfsphase nicht bearbeitet werden
und stellt einen String-Array dar, in dem die Einträge der Liste stehen. Über
diesen Array kann auf die einzelnen Einträge zugegriffen werden.

Beispiel:
s$ = List1.List(0)  Zuweisung des ersten Eintrages in der Li
ste auf die Variable s$
s$ = List1.List(ListCount-1)  Zuweisung des letzten Eintrages in der
Liste auf die Variable s$

 ListCount
Diese Eigenschaft kann während der Entwurfsphase nicht bearbeitet und wäh-
rend der Programmlaufzeit nur gelesen werden. Sie gibt die Anzahl der Ein-
träge einer Liste an.
 ListIndex
Diese Eigenschaft gibt an, welcher Eintrag einer Liste gerade ausgewählt ist.
-1  in der Liste ist kein Eintrag ausgewählt
0  der erste Eintrag einer Liste ist der aktuell ausgewählte
1  der zweite Eintrag einer Liste ist der aktuell ausgewählte
...

 MultiSelect
Damit können Sie einstellen, ob und welche Mehrfachauswahl bei einem Li-
stenfeld möglich ist.

Einstellungsmöglichkeiten:
0 - None  Keine Mehrfachauswahl möglich
1 - Simple  Einfache Mehrfachauswahl, d.h. mit jedem Mausklick
auf einen Eintrag ist dieser ausgewählt.
2 - Extended  Erweiterte Mehrfachauswahl, d.h. "Shift" und Klick
oder "Shift" und eine Pfeiltaste erweitern die Auswahl
vom eben ausgewählten zum neu ausgewählten Eintrag

Seite 22 von 94
und mit "Strg" und Klick wählt man einzelne Einträge
aus.
 Selected
Diese Eigenschaft kann während der Entwurfsphase nicht bearbeitet und wäh-
rend der Programmlaufzeit nur gelesen werden.
Hiermit ist es möglich bei einer Liste mit Mehrfachauswahl die gewählten Ein-
träge zu ermitteln. Es handelt sich um einen Boolean-Array mit sovielen
Elementen, wie Einträge in der Liste sind. Für ausgewählte Einträge ist das
entsprechende Element von "Selected" True, für nicht ausgewählte False. Um
also zu ermitteln, ob der erste Eintrag der Liste (an Stelle 0 im List-Array)
ausgewählt ist, muß abgefragt werden: if List1.Selected(0) = True then
...
 Sorted
Hier läßt sich festlegen, daß die Liste automatisch alphabetisch sortiert wird
(sorted = True) oder daß die Einträge in der Reihenfolge erscheinen, in welcher
sie in die Liste aufgenommen wurden (sorted = False).

Die wichtigsten Methoden


 AddItem
Dies ist die wohl wichtigste Methode, da Sie hiermit neue Einträge in ein
Listenfeld aufnehmen. Die Syntax lautet folgendermaßen:

control.AddItem item, [index] 3

Bedeutung:
control  der Name des Listenfeldes
item  ein String-Ausdruck, der in das Listenfeld eingetragen werden
soll
index  die Stelle, an welcher der String eingetragen werden soll, der
erste Eintrag hat die Nummer 0!

Beispiele:
List1.AddItem "Eintrag 1"  Trägt "Eintrag 1" unten in der Liste ein
List1.AddItem "Eintrag", 2  Schreibt "Eintrag" in die dritte Zeile der
Liste

 Clear
Diese Methode entfernt alle Einträge aus einer Liste.
Beispiel:
List1.Clear  Alle Einträge aus der Liste mit Namen "List1" werden ent
fernt.
 RemoveItem

3
Darstellung der und Erklärungen zur Syntax von Visual Basic-Befehlen und -Funktionen sind jeweils der
Hilfedatei "VB.HLP" zu Visual Basic entnommen.
Seite 23 von 94
Mit dieser Methode entfernen Sie einzelne Einträge wieder aus einem
Listenfeld.

Beispiel:
List1.RemoveItem 0  Der erste Eintrag aus der Liste wird entfernt.

Beispiel
Als Beispiel für das Listenfeld soll ein kleines Programm erstellt werden, bei dem
man in ein Textfeld Wörter eingibt, die dann in ein Listenfeld aufgenommen wer-
den. Außerdem soll in einem Bezeichnungsfeld immer der Eintrag aus der Liste
angezeigt werden, der gerade ausgewählt ist.

Legen Sie dazu wieder wie unter 2.3.4. Beispiel beschrieben ein neues Projekt an.
Danach plazieren Sie in das Entwurfsformular eine "Ende"- und eine "OK"-Taste,
dazu ein Listenfeld, ein Textfeld und ein Bezeichnungsfeld. Das Formular sollte
dann ungefähr wie in Abbildung 22 aussehen:

Abb. 22. Das Entwurfsformular des Beispiels zum Listenfeld

Danach ändern Sie bitte jeweils über die Eigenschaft "Name" die Namen der fol-
genden Kontrollelemente:
Text1  Eingabe
Label1  Wahl
List1  Liste
Command1  CommandOK
Command2  CommandEnd

Folgende Quelltexte müssen zum Funktionieren des Programms eingegeben sein:


❑ "Ende"-Taste:
Sub CommandEnd_Click ()
End
End Sub
❑ "OK"-Taste:
Sub CommandOK_Click ()
Liste.AddItem Eingabe.Text
End Sub
Seite 24 von 94
Es wird also der Inhalt des Textfeldes "Eingabe" (also ' Eingabe.Text') in das
Listenfeld "Liste" eingefügt (durch den Befehl 'Liste.AddItem').

❑ Listenfeld
Sub Liste_Click ()
Wahl = Liste.List(Liste.ListIndex)
End Sub

Hier wird dem Bezeichnungsfeld "Wahl" aus dem Array des Listenfeldes "Liste"
('Liste.List') der aktuell ausgewählte Listeneintrag zugewiesen, welcher an der
Stelle 'Liste.ListIndex' steht.
Diese Zuweisung wird jedesmal durchgeführt, wenn auf irgendeinen Eintrag der
Liste geklickt wird, da die Zuweisung ja im Klick-Ereignis der Liste
('Liste_Click()') steht.
Nun können Sie das Beispiel wieder durch Drücken der "Start"-Taste im Menü-
Fenster von Visual Basic testen.

Schaltfelder
Funktion
Schaltfelder oder Optionsfelder können gekennzeichnet durch einen schwarzen
Punkt die Zustände Ja und Nein annehmen. Meist sind sie mit einem Rahmen
gruppiert, und es kann immer nur eines der Schaltfelder in der Gruppe den Wert
"Ja" haben.

Die wichtigsten Eigenschaften


 Alignement
Mit dieser Eigenschaft können Sie bestimmen, ob das Schaltfeld links vom
zugehörigen Text oder rechts davon angeordnet werden soll.

Einstellungen: 0 (Left Justify)

1 (Right Justify)

 Caption
Hier wird der jeweilige Text zum Schaltfeld eingetragen.
 Value
Mit dieser Eigenschaft schließlich ist es möglich einzustellen, bzw. auszulesen,
ob ein Schaltfeld ausgewählt, bzw. "Ja" gesetzt ist ('Option1 = True', Markierung
durch einen schwarzen Punkt!) oder nicht ('Option1 = False').
Seite 25 von 94
Beispiel
Im Beispiel sollen drei Schaltfelder vorhanden sein, wobei in einem
Bezeichnungsfeld immer der Text des gerade ausgewählten Feldes angezeigt
werden soll.
Bei der Verwendung von Schaltfeldern sind immer mehrere mit einem Rahmen
zu einer Gruppe zusammengefasst und innerhalb jeder Gruppe kann nur eines
ausgewählt sein.
In Visual Basic muß dazu im Entwurfsformular zuerst ein Rahmen gezeichnet
werden, in den dann die Schaltfelder plaziert werden.
Legen Sie also ein neues Projekt an, drücken Sie im Toolbox-Fenster dann auf
den Knopf für Rahmen und ziehen Sie im Formular einen Rahmen auf.
Ändern Sie als nächstes bei der "Caption"-Eigenschaft die Überschrift für den
Rahmen in "Farben".
Nun plazieren Sie nacheinander nach Klick auf die Taste für Schaltfelder drei
Schaltfelder in den Rahmen und ändern Sie die "Caption"-Eigenschaft der
Felder in "Rot", "Grün" und "Blau".
Erstellen Sie dann noch die weiteren Steuerelemente, so daß das Enwurfsformular
schließlich so aussieht wie in Abbildung 23.

Abb. 23. Das Entwurfsformular des Beispiels zu Schaltfelder

Der Quelltext zum Beispiel sieh aus wie folgt:

❑ Aktionsschalter "Ende":
Sub Command1_Click ()
End
End Sub
Seite 26 von 94
❑ Schaltfelder 1 - 3:
Sub Option1_Click ()
Label1 = Option1.Caption
End Sub

Sub Option2_Click ()
Label1 = Option2.Caption
End Sub

Sub Option3_Click ()
Label1 = Option3.Caption
End Sub

Bei jedem Klick auf eines der Schaltfelder wird der Text bei diesem Schaltfeld
(aus der "Caption"-Eigenschaft) dem umrahmten Label oben im Formular
zugewiesen. Das Label ist umrahmt, weil seine Eigenschaft "BorderStyle" gleich
"1" gesetzt ist.

Nun können Sie das Beispiel wieder durch Drücken der "Start"-Taste im Menü-
Fenster von Visual Basic testen.

Beispiel zu den besprochenen Steuerelementen


Programmüberblick
Es soll ein Programm erstellt werden, das die Blutalkoholkonzentration eines
Menschen ausrechnet, der in einem bestimmten Zeitraum eine bestimmte Menge
an Alkohol zu sich nahm. Dazu ist vom Anwender einzugeben das Geschlecht des
Trinkers, die getrunkene Menge an Alkohol, das Körpergewicht des Trinkers und
die Trinkdauer.

Die nötigen Formeln zur Berechnung sind folgende:

mit:
AlkMenge  aufgenommene Menge an reinem Alkohol in Gramm
Menge  aufgenommene Menge des alkoholischen Getränks in Liter
Seite 27 von 94
Prozent  Volumenprozent Alkohol des Getränks
Promille  die Blutalkoholkonzentration
Gewicht  das Körpergewicht des Trinkers
Zeit  Trinkdauer
Geschlecht  der Geschlecht-Faktor:
 für einen Mann: 0.64
 für eine Frau: 0.55

Als erstes muß wieder ein Formular erstellt werden, in das alle nötigen Eingaben
gemacht werden können und in dem auch das Ergebnis der Berechnung ausge-
geben werden kann. Es müssen also ein Textfeld für das Körpergewicht, eines für
die Trinkmenge und eines für die Trinkdauer erstellt werden, dazu zwei
Schaltfelder für die Eingabe des Geschlechts, eine Liste mit verschiedenen
alkoholischen Getränken und ein Bezeichnungsfeld für die Ausgabe des
Ergebnisses der Berechnung. Außerdem sind noch drei Aktionstasten nötig mit
den Beschriftungen "Berechnen", "Neu" und "Ende".

In untenstehender Abbildung ist das fertige Entwurfsformular dargestellt. Dazu


sind auch die Namen der Kontrollelemente, die im Quelltext angesprochen
werden, angegeben. Sie müssen jeweils die Eigenschaft "Name" dieser Controls
entsprechend ändern, damit der weiter unten aufgelistete Quelltext auch lauffähig
ist.

Abb. 24. Das Entwurfsformular zum Alkomat mit Namen der Controls

Seite 28 von 94
Quelltext
Öffnen Sie als erstes ein Editorfenster und wechseln Sie wie in Abbildung 25
dargestellt in den "General"-Bereich des Quelltextes zum Formular. Hier können
globale Variablen vereinbart werden, die für den gesamten Code des Formulars
gültig sind.

Abb. 25. Wechseln in den "General"-Bereich des Quelltextes

Geben Sie dann dort folgenden Quelltext ein:

Dim Prozente(3) As Single ' die Volumenprozent Alkohol der


' Einträge in AlkList in selber Reihenfolge
Dim Geschlecht As Single ' Geschlecht des Trinkers
Dim Menge As Single ' getrunkene Getränk-Menge
Dim AlkMenge As Single ' getrunkene Alkoholmenge
Dim Gewicht As Integer ' Körpergewicht des Trinkers
Dim Dauer As Single ' Trinkdauer

Die Kommentare in Kursivschrift müssen nicht eingegeben werden, sie dienen


nur der Dokumentation des Quelltextes. Sie sollten es sich aber für eigene
Projekte zur Gewohnheit machen, ausreichend Kommentare in den Quellcode
einzufügen, um diesen transparent zu halten.

Bei der "Ende"-Taste ist wie üblich einzugeben:


Sub EndeTaste_Click ()
End
End Sub

Beim Unterprogramm zur "Berechnen"-Taste ist am meisten Quellcode erforder-


lich, da hier die eingegebenen Werte eingelesen werden und die eigentliche Be-
rechnung stattfindet:
1 Sub BerechnenTaste_Click ()
2 'Berechnung der Blutalkoholkonzentration!
Seite 29 von 94
3
4 '====== Ermitteln Geschlecht ======
5 If OptionMann = True Then Geschlecht = .64 'Faktor für Männer
6 If OptionFrau = True Then Geschlecht = .55 'Faktor für Frauen
7
8 '====== Ermitteln Trinkmenge ======
9 Menge = Val(TrinkmengeText)
10 If Menge <= 0 Then
11 'es wurde nichts, 0, Buchstaben oder eine negative Menge eingegeben
12 MsgBox "Bitte geben Sie eine Trinkmenge an!", 0, "Achtung"
13 Exit Sub
14 End If
15
16 '====== Ermitteln Getränkart und Alkoholmenge ======
17 If AlkListe.ListIndex = -1 Then
18 'es wurde keine Getränkeart ausgewählt
19 MsgBox "Bitte wählen Sie ein Getränk aus!", 0, "Achtung"
20 Exit Sub
21 End If
22 '====== Berechnung der getrunkenen Alkoholmenge nach Formel ======
23 AlkMenge = Menge * Prozente(AlkListe.ListIndex) / 100 * .79 * 1000
24
25 '====== Ermitteln Gewicht ======
26 Gewicht = Val(GewichtText)
27 If Gewicht <= 0 Then
28 'es wurde nichts, 0, ein Buchstabe oder eine negatives Gewicht eingegeben
29 MsgBox "Bitte geben Sie ein Gewicht an!", 0, "Achtung"
30 Exit Sub
31 End If
32
33 '====== Ermitteln Trinkdauer ======
34 Dauer = Val(TrinkdauerText)
35 If Dauer <= 0 Then
36 'es wurde nichts, 0, ein Buchstabe oder eine negative Dauer eingegeben
37 MsgBox "Bitte geben Sie eine Trinkdauer an!", 0, "Achtung"
38 Exit Sub
39 End If
40
41 '====== Berechnung der Blutalkoholkonzentration nach Formel ======
42 Promille = (AlkMenge - .1 * Gewicht * Dauer) / (Gewicht * Geschlecht)
43 '====== Ausgabe des Ergebnisses ======
44 ErgebnisLabel.Caption = Format$(Promille, "0.00")
45
46 End Sub

Die Zeilennummern dienen nur den untenstehenden Erklärungen und sind nicht
miteinzugeben.
Der Quelltext dürfte durch die Kommentare größtenteils verständlich sein. Nur
einige Hinweise!

Seite 30 von 94
Beachten Sie, daß jeder aus dem Formular eingelesene Wert auf Gültigkeit
überprüft wird (Zeilen 10,17,27,35). Das muß bei Benutzereingaben immer
erfolgen, um unsinnige Rechenergebnisse oder gar Programmabstürze (etwa bei
einer Division durch eine eingegebene Null) zu vermeiden.

Mit dem Befehl 'Exit Sub' wird ein Unterprogramm sofort verlassen und nicht
weiterausgeführt, es erfolgt also im Beispiel keine Berechnung, wenn
Fehleingaben gemacht wurden (13, 20, 30, 38).

Der Befehl 'Format$' (44) ermöglicht eine formatierte Ausgabe von Zahlen. Hier
im Beispiel wird der Wert von "Promille" mit zwei Nachkommastellen
ausgegeben. Nähere Einzelheiten zu dem Befehl können Sie der Visual Basic-
Hilfe entnehmen.

Durch Druck der "Neu"-Taste sollen alle Textfelder und das Bezeichnungsfeld
mit dem Rechenergebnis wieder leer am Bildschirm erscheinen. Außerdem soll
in der Alkoholika-Liste wieder kein Getränk ausgewählt sein. Dazu ist folgender
Quelltext nötig:

Sub NeuTaste_Click ()
'Neu-Taste: Zurücksetzen aller Eingabefelder
GewichtText.Text = ""
TrinkmengeText.Text = ""
TrinkdauerText.Text = ""
ErgebnisLabel.Caption = ""
AlkListe.ListIndex = -1
End Sub

Beim Start des Programms sind einige Initialisierungen nötig, die also am besten
beim Laden des Formulars vorgenommen werden. Geben Sie also bei der
"Load"-Ereignisprozedur des Formulars folgende Zeilen ein:
Sub Form_Load ()
' Initialisierungen
' Vorbelegen der Alkoholika-Liste
AlkListe.AddItem "Bier"
AlkListe.AddItem "Wein"
AlkListe.AddItem "Schnaps"
AlkListe.AddItem "Likör"
'Vorbelegen des Prozente-Feldes mit den entsprechenden Volumenprozenten
Prozente(0) = 5
Prozente(1) = 7
Prozente(2) = 42
Prozente(3) = 30
End Sub
Seite 31 von 94
Erweiterungsmöglichkeiten
Als einfachste Erweiterung bietet es sich an mehr und detaillierter Getränke in die
Liste aufzunehmen. Dazu muß nur im Unterprogramm 'Sub Form_Load ()' das
neue Getränk ebenfalls mit 'AlkListe.AddItem' in die Liste eingefügt werden und
der Prozentwert des Getränks mit 'Prozente(x) = y' zugewiesen werden.
Beachten Sie aber, daß Sie im "General"-Bereich des Quelltextes auch die
Vereinbarung des Prozente-Feldes ändern müssen.
Für sechs Getränke z.B. 'Dim Prozente(5) As Single'.

Eine Schwäche des Programms ist, daß man nicht mehrere verschiedene Getränke
nacheinander für eine Trinkdauer eingeben kann. Dafür müßte das Formular
etwas anders gestaltet werden und etwa eine Liste aufgenommen werden, in der
alle vom Anwender angegebenen Getränke mit der jeweiligen Trinkmenge
angezeigt werden. Das Formular könnte dann - verziert mit dem Bild eines
ländlichen Wirtshauses - wie in Abbildung 26 dargestellt aussehen:

Abb. 26. Erweitertes Formular für das Alkomat-Beispiel

Seite 32 von 94
Data Control

Abb. 27. Bildschirmanzeige des Data Controls und die zugehörige Taste aus dem Toolbox-Fenster

Visual Basic ermöglicht das Arbeiten mit Datenbanken in verschiedenen Forma-


ten, wie MS Access, BTrieve, dBase III, dBase IV, FoxPro, Oracle, Paradox und
SQL-Server. Es benutzt dabei dieselbe Datenbank-Engine wie Ms Access. Damit
kann eben auf die verschiedene Standard-Datenbankformate zugegriffen werden,
ader auch über ODBC-Treiber auf externe Datenbasen, wie MS-SQL-Server und
Oracle-Datenbanksysteme.4

Die einfachste Möglichkeit mit Visual Basic Datenbankprogrammierung zu be-


treiben ist die Verwendung des "Data Control"-Steuerelements.
Mit den Pfeiltasten des Data Controls (Abbildung 27) bewegen Sie sich durch die
Datensätze der Tabelle einer Datenbank, wobei zur Darstellung der einzelnen
Felder der Tabelle Text- oder Bezeichnungsfelder verwenden werden müssen.

Die wichtigsten Eigenschaften


Für die Text- oder Bezeichnungsfelder, welche die Felder einer Datenbanktabelle
darstellen sollen, sind folgende zwei Eigenschaften von Bedeutung:
 DataField
Hier müssen Sie den Namen des Feldes aus der Tabelle eintragen, das angezeigt
werden soll.
 DataSource
Bei dieser Eigenschaft ist der Name des Data Controls anzugeben, von dem
Tabellenfelder dargestellt werden sollen.

Die wichtigsten Eigenschaften vom Data Control selbst sind folgende:


 Connect
Hier müssen Sie angeben, auf welches Datenbank-Format zugegriffen werden
soll, damit Visual Basic den passenden ODBC-Treiber verwenden kann. Bei
Access-Datenbanken darf nichts eingetragen werden, beim Zugriff auf dBase-
Datenbanken muß bei dieser Eigenschaft "dBase III;" bzw. "dBase IV;" stehen.
Beachten Sie bitte den Strichpunkt am Ende des Ausdrucks, ohne diesen er-
kennt Visual Basic den Begriff nicht.

4
a.o.O. Dr. Pia Maslo, Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für Windows, S. 729
Seite 33 von 94
 DatabaseName
Mit dieser Eigenschaft legen Sie fest, auf welche Datenbank zugegriffen wer-
den soll.
Bei Access-Dateien muß der Pfad und der entsprechende Dateiname angegeben
werden, womit auf alle Tabellen und Indizes der Datenbank zugegriffen
werden kann.
In dBase sind die einzelnen Tabellen und Indizes ja in eigenen Dateien
("*.DBF" und "*.NDX" bzw. "*.MDX") abgelegt. Daher muß beim Zugriff auf
eine dBase-Datenbank das Verzeichnis angegeben werden, in dem sich alle zur
Datenbank gehörigen Dateien befinden, also z.B. "c:\dbase\bsp1\". Achten Sie
bitte auf den Rückwärtsschrägstrich am Ende des Ausdrucks, ohne diesen
erkennt Visual Basic das Verzeichnis nicht.
 ReadOnly
Mit dieser Eigenschaft können Sie einstellen, daß eine Datenbank nur zum
Lesen (also Ansehen) geöffnet wird ('ReadOnly = True'), oder daß Sie auch ge-
ändert werden kann ('ReadOnly = False').
 RecordSource
Da ja in einer Datenbank mehrere Tabellen vorhanden sein können, müssen Sie
hier den Namen der Tabelle angeben, auf die Sie zugreifen wollen.
Bei einer Access-Datenbank wird einfach der Tabellenname angegeben, wie er
in der Datenbank definiert ist.
Bei einer dBase-Tabelle dagegen muß der Dateiname ohne (!) Extension
angegeben werden, also z.B. bei einer Tabelle "ADRESS.DBF" muß
angegeben werden "ADRESS" !

Die wichtigsten Ereignisse


 Error
Dieses Ereignis tritt ein, wenn im Zusammenhang mit Datenbankoperationen
mit dem Data Control Fehler auftreten, also wenn ein Fehler auftritt, ohne daß
in Visual Basic geschriebener Code abgearbeitet wurde.
 Validate
Dieses Ereignis tritt ein, wenn der aktuelle Datensatz wechselt, also wenn ein
neuer Datensatz zum aktuellen wird.

Die wichtigsten Methoden


 UpdateControls
Nach Aufruf dieser Methode werden in alle Text- und Bezeichnungsfelder, in
denen Tabellenfelder über das Data Control dargestellt wurden, wieder die ak-
tuellen Werte aus der Datenbank-Tabelle eingetragen. Dies ist von Bedeutung,
etwa wenn in Textfeldern Änderungen an den Tabellendaten vorgenommen
wurden, und wieder die alten Werte gesetzt werden sollen.

Seite 34 von 94
 UpdateRecords
Mit dieser Methode werden in mit einer Datenbanktabelle verknüpften
Textfeldern vorgenommene Änderungen in die Tabelle übernommen und in der
Datenbank abgespeichert.

Beispiel
Im Beispiel soll auf eine mit Visual Basic mitgelieferte Beispieldatenbank im Ac-
cess-Format zugegriffen werden, wobei auch Änderungen an Feldinhalten vorge-
nommen werden können.

Legen Sie dazu wieder ein neues Projekt an.


Drücken Sie dann als erstes im Toolbox-Fenster auf die Taste für Data Controls
und plazieren Sie in gewohnter Weise das Control im Entwurfsformular.
Doppelklicken Sie dann auf die Eigenschaft "DatabaseName" des Data Controls.
Es erscheint ein Dateiauswahl Dialogfenster. Wählen Sie im Visual Basic-Ver-
zeichnis (i. d. R. "vb") die Datenbank "biblio.mdb" aus. Damit ist festgelegt, daß
auf diese Datenbank zugegriffen werden soll.
Da es sich um eine Access-Datenbank handelt, muß für die "Connect"-
Eigenschaft nichts angegeben werden.
Jetzt muß noch festgelegt werden, auf welche Tabelle der Datenbank zugegriffen
werden soll. Klicken Sie dazu auf die "RecordSource"-Eigenschaft des Data
Controls und öffnen Sie dann die Liste des Kombinationslistenfeldes, in der die
verfügbaren Tabellen der Datenbank angezeigt werden (Abbildung 28). Wählen
Sie daraus dann die Tabelle "Publisher Comments".

Abb. 28. Das Kombinationslistenfeld der "RecordSource"-Eigenschaft

Nun fehlen noch die Textfelder, in denen die Feldinhalte angezeigt und geändert
werden sollen.
Plazieren Sie dazu drei Textfelder untereinander in das Entwurfsformular. Zum
Verbinden der Textfelder mit der Datenbank-Tabelle klicken Sie bitte jeweils
Seite 35 von 94
doppelt auf die "DataSource"-Eigenschaft des Textfeldes, worauf in diese "Data1"
also der Name des Data Controls eingetragen wird.
Nun muß noch jeweils ein Tabellenfeld angegeben werden, wozu Sie einfach auf
die "DataField"-Eigenschaft Doppelklicken, wonach Sie aus dem
Kombinationslistenfeld zur Eigenschaft nacheinander die drei Felder der Tabelle
den drei Textfeldern im Formular zuweisen können.
Als letztes benötigen wir noch drei Aktionsschalter, die Sie bitte mit "Speichern",
"Rückgängig" und "Ende" beschriften. Das Entwurfsformular des Beispiels sollte
dann ungefähr folgendermaßen aussehen:

Abb. 29. Das Entwurfsformular für das Beispiel zum Data Control

An Quelltext ist folgendes einzugeben:

❑ Aktionsschalter "Speichern":
Sub Command1_Click ()
Data1.UpdateRecord
MsgBox ("Änderungen in der Tabelle gespeichert!")
End Sub

Es werden hier also die Inhalte der Textfelder in die entsprechenden


Tabellenfelder der Datenbank gespeichert und dann eine entsprechende
Meldung ausgegeben.

❑ Aktionsschalter "Ende":
Sub Command3_Click ()
End
End Sub

Seite 36 von 94
❑ Aktionsschalter "Rückgängig":
Sub Command2_Click ()
If MsgBox("Änderungen verwerfen?", 36, "Frage") = 6 Then
Data1.UpdateControls
End If
End Sub

Nach einer Abfrage, ob die Änderungen (in den Textfeldern) wirklich


verworfen werden sollen, werden wieder die Inhalte der Tabellenfelder in die
entsprechenden Textfelder geschrieben.

Hier ist die "MsgBox"-Funktion auf etwas andere Weise verwendet als zuvor,
wobei die Syntax allgemein lautet:

ergebnis=MsgBox (msg, [typ], [titel])

Dabei sind die in eckige Klammern gesetzten Parameter optional, das heißt sie
können, müssen aber nicht angegeben werden.

ergebnis  der Rückgabewert nach Aufruf der Funktion


msg  die Meldung, die ausgegeben werden soll in Anführungszei-
chen
typ  der Typ der Box, d.h. das Aussehen. Die verschiedenen Typen
können der Fachliteratur oder der empfehlenswerten Hilfe zu
Visual Basic entnommen werden. Der Typ 36 - wie im Bei-
spiel - stellt im Fenster ein Fragezeichen-Symbol und eine
"Ja"- und eine "Nein"-Taste dar.
titel  der Titel der oben in der Titelleiste des Meldungsfensters
angezeigt werden soll

Ein so verwendeter Aufruf der "MsgBox"-Funktion liefert immer auch einen


Wert zurück, der abgefragt werden kann. Sämtliche Rückgabewerte können
ebenfalls der Visual Basic-Hilfe entnommen werden. Der Wert "6", wie hier
im Beispiel, bedeutet, daß die "Ja"-Taste gedrückt wurde.

Nun können Sie das Programm wieder nach Drücken der "Start"-Taste im
Menüfenster testen.

Seite 37 von 94
Datenbankprogrammierung ohne Data Control
Arbeiten mit Datenbanken
Allgemein
Datenbanken zu programmieren ist zwar wie unter Punkt 2.7. Data Control be-
schrieben recht einfach zu bewerkstelligen, allerdings ist die dortige Vorge-
hensweise ziemlich starr. Daher ist mit Visual Basic auch ein besserer und
flexiblerer, aber auch aufwendigerer Datenbankumgang möglich.
Ähnlich wie beim Umgang mit dem Data Control, muß auch hier dem System
mitgeteilt werden, auf welches Datenbankformat zugegriffen werden soll. Dies
geschieht beim immer nötigen ersten Schritt, dem Öffnen der gewünschten Daten-
bank. Dazu kommt, daß auch alle Tabellen, mit denen gearbeitet werden soll,
geöffnet werden müssen. Es können dann verschiedene Indizes zugewiesen
werden, verschiedene Abfragen können angewandt und es kann in indizierten
Tabellen schnell nach bestimmten Einträgen gesucht werden. Auch das Einfügen,
Ändern und Löschen von Datensätzen ist natürlich möglich, aber all das muß
Schritt für Schritt programmiert werden. Diese Art der Datenbankpro-
grammierung ist also sicherlich komplexer und aufwendiger als die mit dem Data
Control.

Öffnen und Schließen einer Datenbank


Um mit einer Datenbank arbeiten zu können muß diese zuerst geöffnet werden.
Sie können unter Visual Basic gleichzeitig bis zu 256 Datenbanken öffnen. Eine
vorhandene Datenbank kann aber nur geöffnet werden, wenn sie nicht schon von
einem anderen Benutzer im Exklusiv-Modus bearbeitet wird.5
Sie öffnen unter Visual Basic eine Datenbank mit dem "OpenDatabase"-Befehl.
Dieser hat folgende Syntax:

OpenDatabase ( dbname, [exclusive, [readonly, [connect]]])

Die Parameter in eckigen Klammern können wieder weggelassen werden,


allerdings nur so wie es die Klammerung andeutet, also entweder die hinteren
drei, zwei oder nur der hinterste Parameter. Falls also "Connect" gesetzt werden
soll, müssen die beiden Paramter davor auch angegeben werden.

Bedeutung:
dbname  Hier muß der Dateiname einer vorhandenen Datenbank
eingetragen werden. Der Parameter entspricht der
"DatabaseName"-Eigenschaft des Data Controls, bei dBase-
Datenbanken muß also ebenfalls nur ein Verzeichnis
angegeben werden.

5
a.o.O. Dr. Pia Maslo, Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für Windows, S. 732
Seite 38 von 94
exclusiv  Falls dieser Wert True ist, kann die Datenbank nur von einem
Benutzer geöffnet werden, falls False, von mehreren. Default:
False.
readonly  Wird dieser Parameter True gesetzt, kann die Datenbank vom
Benutzer nur gelesen werden, es können also keine
Änderungen vorgenommen werden. Default: False.
connect  Dieser Parameter entspricht der "Connect"-Eigenschaft des
Data Control, hier muß für Access-Datenbanken nichts und
für dBase "dBase IV;" eingetragen werden.

Beim Öffnen muß nun die gewünschte Datenbank über den "OpenDatabase"-
Befehl einer "Database"-Variablen zugewiesen werden, die zuvor vereinbart
wurde.

Beispiel:
Öffnen einer Access-Datenbank:

Dim datenbank As Database


Set datenbank = OpenDatabase ("c:\access\mydb\adress.mdb")

Mit der "Dim"-Anweisung wird zuerst die Variable "datenbank" vereinbart,


hernach wird die Datenbank geöffnet, wozu nur der Parameter "dbname" nötig
ist, da es sich um eine Access-Datenbank handelt.

Beispiel:
Öffnen einer dBase-Datenbank:

Dim datenbank As DataBase


Set datenbank = OpenDatabase ("c:\dbase\adr\", False, False "dBase IV;")

Wieder wird zuerst die Variable vereinbart und dann die Datenbank geöffnet,
wobei hier für "dbname" das Verzeichnis mit den entsprechenden dBase-Dateien
angegeben wird. Der "Connect"-Parameter ist hier zwingend erforderlich, damit
das System den richtigen ODBC-Treiber verwenden kann.

Nach dem Arbeiten mit einer Datenbank muß diese wieder geschlossen werden,
um etwaige Datenverluste zu vermeiden. Dies geschieht mit der "Close"-Methode
des "Database"-Objekts.

Der Aufruf ist jeweils:

datenbank.Close

Dabei ist "datenbank" wieder eine zuvor vereinbarte "Database"-Variable.


Seite 39 von 94
Wichtige Methoden des "Database"-Objektes
Für jedes "Database"-Objekt, sind ebenso wie für Controls bestimmte Methoden
definiert. Die wichtigsten Methoden sind untenstehend aufgeführt. Genaueres zu
den einzelnen Unterprogrammen finden Sie in den noch folgenden Beispielen
zum Arbeiten mit Tabellen und Abfragen.

 Close
Wie oben schon kurz beschrieben, ist die "Close"-Methode zum Schließen
einer Datenbank nötig.
 CreateDynaset
Diese Methode dient der Erstellung eines Dynaset aus einer oder mehreren
Tabellen einer Datenbank. Da dies meistens mit der Verwendung einer Abfrage
verbunden ist, genaueres dazu unter dem Punkt 3.3. Arbeiten mit Abfragen.
 CreateQueryDef
Mit dieser Methode lassen sich neue "QueryDef"-Objekte definieren, die dann
in einer Datenbank abgespeichert werden können. Näheres dazu auch unter
dem Punkt 3.3. Arbeiten mit Abfragen.
 ListTables
Damit läßt sich ein Snapshot erstellen, in dem als Datensätze alle Tabellen und
Abfragen einer Datenbank aufgeführt sind. Näheres dazu unter dem Punkt 3.2.
Arbeiten mit Tabellen.
 OpenTable
Diese Methode dient dem Öffnen von Tabellen in Datenbanken. Genaueres
unter dem Punkt 3.2. Arbeiten mit Tabellen.

Arbeiten mit Tabellen


Öffnen und Schließen von Tabellen
Zum Öffnen von Tabellen dient die "OpenTable"-Methode des Datenbankobjekts.
Der Aufruf erfolgt in folgender Syntax:

Set TableObject = DbObject.OpenTable (TableName)

Bedeutung:
TableObject  eine Objektvariable vom Typ Table
DbObject  eine Instanz des "Database"-Objekts, die eine offene
Datenbank repräsentiert
TableName  der Name einer vorhandenen Tabelle in der Datenbank

Beispiel:
Dim db As Database
Dim tb As Table

Set db = OpenDatabase("c:\access\vers.mdb")
Set tb = db.OpenTable ("Anschriften")
Seite 40 von 94
Es müssen also zuerst Variablen sowohl für das "Table"- als auch für das
"DataBase"-Objekt vereinbart werden, und die Datenbank muß geöffnet sein.
Nach dem "OpenTable"-Aufruf kann nun mit der Tabelle gearbeitet werden, falls
in der Datenbank "vers.mdb" eine Tabelle mit dem Namen "Anschriften" vor-
handen ist.

Ebenso wie das "Database"-Objekt verfügt das "Table"-Objekt über eine "Close"-
Methode. Das Schließen einer Tabelle sieht also folgendermaßen aus:

tb.Close

Dabei muß "tb" wieder eine vorher deklarierte Objektvariable vom "Table"-Typ
sein, und die angesprochene Tabelle muß geöffnet sein.

Es empfiehlt sich vor dem Schließen einer Datenbank alle offenen Recordsets
(also auch Tabellen) zu schließen, um mögliche Datenverluste zu vermeiden.

Durchgehen einer Tabelle und Auflisten der Datensätze


Beim Öffnen einer Tabelle befindet sich der Datensatzzeiger automatisch auf
dem ersten Datensatz. Der Zeiger kann dann mit den folgenden Methoden des
"Table"-Objekts bewegt werden:
 MoveNext
Bewegt den Datensatzzeiger auf den nächsten Datensatz. Falls der aktuelle
Datensatz der letzte der Tabelle ist, wird die "EOF"-Eigenschaft (EOF = end of
file) des "Table"-Objekts True.
 MovePrevious
Bewegt den Datensatzzeiger auf den vorherigen Datensatz. Falls der aktuelle
Datensatz der erste der Tabelle ist, wird die "BOF"-Eigenschaft (BOF =
bottom of file) des "Table"-Objekts True.
 MoveFirst
Bewegt den Datensatzzeiger auf den ersten Datensatz.
 MoveLast
Bewegt den Datensatzzeiger auf den letzten Datensatz.

Um zu demonstrieren, wie man die Datensätze einer offene Tabelle der Reihe
nach durchgeht, sollen die Datensätze aus der Tabelle "Publisher Comments" der
Visual Basic Beispieldatenbank "biblio.mdb" in einer Liste ausgegeben werden.
Legen Sie ein Formular mit einer Liste und einem "Ende"-Schalter an. Danach
schreiben Sie in die "Load"-Ereignisprozedur des Formulars bitte folgenden
Quelltext:
Seite 41 von 94
1 Sub Form_Load ()
2 Dim db As Database
3 Dim tb As Table
4 Dim zeile As String
5
6 Set db = OpenDatabase("c:\vb\biblio.mdb")
7 Set tb = db.OpenTable("Publisher Comments")
8
9 tb.MoveFirst
10 Do While Not tb.EOF
11 zeile = tb("PubID") + ", " + tb("Publisher")
12 List1.AddItem zeile
13 tb.MoveNext
14 Loop
15
16 tb.Close
17 db.Close
18 End Sub

Oben werden die "Database"- (2) und die "Table"-Variable (3) zuerst vereinbart,
dazu die String-Variable "zeile" (4), die jeweils eine Zeile in der Liste darstellen
soll.
Nach dem Öffnen der Datenbank (6) und der Tabelle (7) wird der Datensatzzeiger
auf den ersten Datensatz bewegt (9), nur zur Demonstration, da das ja in diesem
Fall unnötig ist, weil nach dem Öffnen der Tabelle ohnehin der erste Datensatz
der aktuelle ist. Hernach wird eine Schleife (10-14) solange durchlaufen, bis der
Datensatzzeiger auf den letzten Datensatz gerichtet ist (also 'tb.EOF = True').
In der Schleife wird jeweils "zeile" mit den beiden Feldern "PubId" und
"Publisher" der Tabelle belegt (11) und in die Liste eingefügt (12).
Als nächstes folgt die wichtige Anweisung 'tb.MoveNext' (13), welche den Daten-
satzzeiger auf den nächsten Datensatz bewegt. Vergißt man diesen Befehl, verläßt
das Programm die Schleife nicht mehr, da 'tb.EOF' niemals True wird!
Zum Schluß muß dann nur noch die Tabelle (16) und die Datenbank (17) ge-
schlossen werden.

Das Formular des kleinen Programms sieht zur Laufzeit dann ungefähr wie in
Abbildung 30 dargestellt aus:

Seite 42 von 94
Abb. 30. Das Formular zum Beispiel "Durchgehen einer Tabelle"

Verwendung von Indizes


Nun liegen die Datensätze einer Tabelle meist nicht in sortierter Reihenfolge vor.
Um eine Sortierung zu erreichen, öffnet man am besten (bzw. legt man an) einen
entsprechenden Index für die Tabelle.

Um etwa einen neuen Index über das Feld "Publisher" für die Tabelle "Publisher
Comments" der Datenbank "biblio.mdb" anzulegen, sind folgende drei Schritte
nötig:

❑ Als erstes muß eine neue Instanz des "Index"-Objekts angelegt werden. Dies
geschieht beim Deklarieren der Variablen:

Dim ind As New index

❑ Als nächstes müssen die Eigenschaften der neuen "Index"-Instanz vorbelegt


werden. Die beiden wichtigsten sind die "Name"- und die "Fields"-Eigen--
schaft.

ind.Name = "PublisherIndex"
ind.Fields = "Publisher"

Dazu gibt es noch die "Unique"- und die "Primary"-Eigenschaft. Beide können
nur beim Neuanlegen von Indexen gesetzt werden.
Ist "unique" True dürfen sich Schlüsselbegriffe in einem Index nicht
wiederholen, andernfalls schon.
Ist "primary" True, handelt es sich um den Primärschlüssel der Tabelle. Es kann
jeweils nur ein Index einer Tabelle der Primärindex sein.

Seite 43 von 94
❑ Zuletzt muß der neue Index noch in die "Indexes"-Collection des "TableDefs"-
Objekts der Tabelle aufgenommen werden. Dazu dient die "Append"-Methode
der "Indexes"-Collection:

db.TableDefs("Publisher Comments").Indexes.Append ind

Mit dieser Anweisung können auch bei der Arbeit mit dBase-Dateien Indizes
angelegt werden. Bei 'Connect = "dBase IV;"' wird eine "*.MDX"-Datei ange-
legt, bei 'Connect = "dBase III;"' eine "*.NDX"-Datei und dazu eine "*.INF"-
Datei, welche eine Art "INI"-Datei ist, in die alle Index-Dateinamen eingetra-
gen werden.
Wenn einmal eine "*.MDX"-Datei oder "*.NDX"-Dateien vorhanden sind,
unterscheidet Visual Basic übrigens nicht mehr zwischen "dBase III;" und
"dBase IV;", die verschiedenen Indizes werden immer erkannt.
Wegen der Verwendung von "*.INF"-Dateien durch Visual Basic ergibt sich
allerdings ein Problem mit vorhandenen "dBase III"-Datenbanken. Visual
Basic ermittelt nämlich die zu einer Datenbank gehörigen "*.NDX"-Dateien
nur aus der zugehörigen "*.INF"-Datei, welche aber bei mit dBase erstellten
Datenbanken nicht existent ist. Um also bei einer bestehenden "dBase III"-
Datenbank mit schon vorhandenen "*.NDX"-Dateien unter Visual Basic
arbeiten zu können, muß eine "*.INF"-Datei angelegt werden. Diese trägt
immer den Namen der "*.DBF"-Datei.
Soll zum Beispiel eine "dBase III"-Datei "person.dbf" mit den Index-Dateien
"name.ndx" und "vorname.ndx" bearbeitet werden, muß im selben Verzeichnis
eine Text-Datei (am besten mit dem Windows-Editor aus der "Zubehör"-
Programmgruppe) namens "person.inf" folgenden Inhalts angelegt werden:

[dbase]
NDX1=Name.NDX
NDX2=Vorname.NDX

Nach Erstellung dieser Datei kann mit den Indizes "Name" und "Vorname"
gearbeitet werden, unabhängig davon, ob für "Connect" "dBase III;" oder
"dBase IV;" gesetzt wurde. Mit INF-Dateien können allerdings nur Indizes
berücksichtigt werden, nicht dBase-Abfragen. Näheres dazu aber unter Punkt
3.3. Arbeiten mit Abfragen.

Um einen bestimmten Index zu einer Tabelle auszuwählen muß dieser mit


folgender Anweisung zugewiesen werden:

tb.Index = "PublisherIndex"

Dabei muß "tb" eine zuvor deklarierte "Table"-Variable sein und eine offene
Tabelle repräsentieren. Der Ausdruck zwischen den Anführungszeichen muß
Seite 44 von 94
der Name eines existierenden Indexes dieser Tabelle sein. Sofort nach Aufruf
dieser Anweisung wird der Index aktiv, die zugehörige Tabelle liegt ab diesem
Zeitpunkt in der mit dem Index definierten Sortierung vor.
Über das (die) im Index befindliche(n) Feld(er) kann nun schnell nach Daten-
sätzen gesucht werden.
Soll in der "Publisher Comments"-Tabelle der Datenbank "biblio.mdb" nach
dem Publisher "SYBEX" gesucht werden, muß folgende Anweisung aufgeru-
fen werden:

tb.seek "=", "SYBEX"

Daraufhin befindet sich der Datensatzzeiger auf dem gesuchten Datensatz.


Falls kein Datensatz gefunden werden sollte, wird die "NoMatch"-Eigenschaft
der Tabelle True gesetzt. Diese muß also nach jedem Suchvorgang sicherheits-
halber abgefragt werden, z.B.:

If tb.NoMatch Then '(bzw. auch If tb.NoMatch = True Then)


MsgBox "Kein Datensatz gefunden!"
Else
...
End If

Einfügen, Ändern und Löschen von Datensätzen


Zum Einfügen, Ändern und Löschen von Datensätzen dienen folgende Methoden
des "Table"-Objekts:
 AddNew
Diese Methode initialisiert den Kopier-Puffer, d.h. alle Felder werden
zurückgesetzt und können neu belegt werden.
 Edit
Diese Methode schreibt den aktuellen Datensatz zum Bearbeiten in den Kopier-
Puffer.
 Delete
Diese Methode löscht den aktuellen Datensatz aus der Tabelle.
 Update
Diese Methode kopiert den Inhalt des Kopier-Puffers in die Tabelle zurück,
entweder durch Überschreiben des aktuellen Datensatzes (nach Edit) oder
durch Anhängen eines neuen Datensatzes (nach AddNew).

Alle diese Methoden sind auch für das "Dynaset"-Objekt definiert und können
auch bei Instanzen dieses Objekts angewandt werden.

Seite 45 von 94
Beispiel
Zur Demonstration der vielen besprochenen Funktionen soll nun das Beispiel zum
Durchgehen einer Tabelle erweiter werden. Es sollen neue Datensätze in die Liste
aufgenommen, und der ausgewählte Datensatz soll geändert oder gelöscht werden
können. Dazu soll auch zwischen den beiden Indexen der Tabelle hin- und
hergeschaltet und nach einzelnen Datensätzen gesucht werden können.
Sie müssen also wie unter 3.2.3. Verwendung von Indizes beschrieben einen neuen
Index "PublisherIndex" für die Tabelle "Publisher Comments" angelegt haben,
sonst wird das folgende Beispielprogramm nicht fehlerfrei arbeiten.

Untenstehend sehen Sie das Entwurfsformular zum Beispiel mit den


entsprechenden Kontrollelemente-Namen, wie sie im Quelltext verwendet
werden. Erstellen Sie wie üblich das Formular und geben Sie hernach den
Quelltext ein.

Abb. 31. Das Entwurfsformular für das Beispiel zur Tabellenbearbeitung

Im "General"-Bereich des Quelltextes werden für die Datenbank und die Tabelle
die beiden Variablen "db" und "tb" deklariert, damit sie im gesamten Quelltext
zum Formular bekannt sind.

'Database- und Table-Variable vereinbaren


Dim db As Database
Dim tb As table
Seite 46 von 94
Als nächstes folgt der Quelltext für die "Neu"-Taste. Nach Klick auf diese Taste
soll ein neuer Datensatz eingegeben werden können.
1 Sub CommandAddNew_Click ()
2 Dim n As Integer
3 'neue PubId-Nummer generieren (muß eindeutig sein!)
4 tb.Index = "PrimaryKey"
5 tb.MoveLast
6 n = tb("PubID")
7 'neuen Datensatz anlegen
8 tb.AddNew
9 'neue PubID-Nr. zuweisen
10 tb("PubID") = n + 1
11 'neuen Publisher einlesen
12 tb("Publisher") = InputBox$("Geben Sie den neuen Ausdruck für 'Publisher'
ein!", Einfügen")
13 If Not IsNull(tb("Publisher")) Then 'es wurde also OK gedrückt
14 tb.Update
15 Liste_Neu
16 End If
17 End Sub

In Zeile 4 wird der Index "PrimaryKey" eingestellt, so daß die Tabelle nach dem
Feld "PubId" sortiert ist. Nun wird auf den letzten Datensatz gesprungen (5) und
die höchste "PubId" in der Variable "n" gespeichert. Damit kann die neue "PubId"
um eins größer vergeben werden (10), da diese dann sicher eindeutig ist. Würde
man eine schon vorhandene Nummer vergeben, würde das Programm mit einer
Fehlermeldung beendet, da "unique" bei Primärindexen True ist.
In Zeile 12 wird mit 'InputBox$' "Publisher" eingelesen. Wird in dem Eingabefen-
ster die "Cancel"-Taste angeklickt, wird ein leerer String zurückgegeben, deshalb
muß in Zeile 13 mit der Funktion "IsNull" abgefragt werden, ob eine Eingabe
erfolgte und OK angeklickt wurde.
Mit 'tb.Update' (14) wird der neue Datensatz übernommen und 'Liste_Neu' (15) ist
ein Unterprogramm, das weiter unten im Quelltext folgt und das die Liste
"ListTable" neu mit dem Inhalt der Tabelle füllt.

Im Folgenden nun der Quelltext des "Löschen"-Schalters. Hier wird der gerade in
der Liste ausgewählte Datensatz gelöscht.

1 Sub CommandDelete_Click ()
2 'Überprüfung, ob überhaupt ein Datensatz in der Liste ausgewählt ist
3 If ListTable.ListIndex = -1 Then
4 MsgBox "Sie müssen einen Datensatz in der Liste auswählen!", 48,
"Achtung"
5 Exit Sub
6 End If
Seite 47 von 94
7
8 'setzt Datensatzzeiger auf in der Liste ausgewählten Datensatz
9 Suche_Datensatz
10 'Sicherheits-Abfrage
11 If MsgBox("Wollen Sie den Datensatz '" + tb("PubId") + ", " + tb("Publisher")
+ " wirklich löschen?", 36, "Frage") = 6 Then
12 tb.Delete
13 End If
14 'Listenfeld aktualisieren
15 Liste_Neu
16 End Sub

Als erstes wird überprüft, ob ein Datensatz ausgewählt ist (3), falls nicht, wird das
Unterprogramm verlassen (5), da ja dann kein Datensatz gelöscht werden kann.
Hernach wird der Datensatzzeiger in Zeile 9 mit einem weiter unten aufgeführten
Unterprogramm auf den in der Liste ausgewählten Datensatz gesetzt. Dieser wird
dann nach einer Sicherheitsabfrage (11) gelöscht (12), und die Liste wird wieder
aktualisiert (15).

Nun folgt der Quelltext zur "Ändern"-Taste, womit der in der Liste angewählte
Datensatz geändert werden kann.
1 Sub CommandEdit_Click ()
2 'Überprüfen, ob ein Datensatz ausgewählt ist
3 If ListTable.ListIndex = -1 Then 'es ist also keiner ausgewählt
4 MsgBox "Sie müssen einen Datensatz in der Liste auswählen!", 48,
"Achtung"
5 Exit Sub
6 End If
7 'Datensatzzeiger auf in der Liste ausgewählten Satz setzen
8 Suche_Datensatz
9 'Datensatz ändern
10 tb.Edit
11 tb("Publisher") = InputBox$("Nehmen Sie für 'Publisher' die gewünschte
Änderung vor!" + Chr(13) + Chr(13) + "PubId: " + Str(tb("PubId")),
"Ändern", tb("Publisher"))
13 If Not IsNull(tb("Publisher")) Then 'es wurde also OK gedrückt
14 tb.Update
15 Liste_Neu
16 End If
17 End Sub

Zuerst wird wieder überprüft, ob ein Datensatz ausgewählt ist (3), dann der
Datensatzzeiger wieder auf den ausgewählten Datensatz gesetzt (8) und schließ-
lich kann in Zeile 11 "Publisher" geändert werden. Das 'Chr(13)' das an den Mel-
dungstext der Inputbox angehängt wird, bewirkt einfach einen Zeilenumbruch.

Seite 48 von 94
Der Ausdruck ' "Ändern" ' ist die Überschrift für das Fenster und 'tb("Publisher")'
wird als Default-Wert in das Textfeld der Inputbox geschrieben.
Nach Überprüfung, ob nicht die "Cancel"-Taste gedrückt wurde (13), wird die
Änderung übernommen (14) und die Liste aktualisiert (15).

Nach Klicken der "Sortierung"-Taste wird folgender Quelltext abgearbeitet, der


zwischen den beiden Indizes der Tabelle hin- und herschaltet.

Sub CommandIndex_Click ()
'jeweils anderen Index setzen
If tb.Index = "PrimaryKey" Then
tb.Index = "PublisherIndex"
Else
tb.Index = "PrimaryKey"
End If
'Listenfeld aktualisieren
Liste_Neu
End Sub

Falls der Index "PrimaryKey" gesetzt ist, wird der Index "PublisherIndex" gesetzt
und umgekehrt. Am Schluß wird noch die Liste aktualisiert, um die Änderung der
Sortierung auch anzuzeigen.

Nun der Quelltext für die "Suchen"-Taste, wo nach der Eingabe einer "PubId"
(falls Index "PrimaryKey") bzw. eines Publisher (falls Index "PublisherIndex")
der zugehörige Datensatz gesucht und ausgegeben wird.

1 Sub CommandSeek_Click ()
2 'zu suchenden Datensatz abfragen
3 SuchWort = InputBox("Geben Sie den Ausdruck zum Suchen ein!",
"Suche")
4 'falls nötig Eingabe in Zahl umwandeln
5 If tb.Index = "PrimaryKey" Then SuchWort = Val(SuchWort)
6 'Datensatz suchen
7 tb.Seek "=", SuchWort
8 If tb.NoMatch Then
9 'kein Datensatz gefunden
10 MsgBox "Leider keinen Datensatz '" + SuchWort + "' gefunden!", 48,
"Hinweis"
11 Else
12 'Datensatz gefunden
13 MsgBox "Gesuchter Datensatz: " + Str(tb("PubId")) + ", " + tb("Publisher")
+ "!",48, "Ergebnis"
14 End If
15 End Sub

Seite 49 von 94
Zuerst wird ein Suchausdruck abgefragt (3), der, falls eine "PubId" eingegeben
wurde, in eine Zahl umgewandelt werden muß (5), da "PubId" ein "Longinteger"-
Feld ist und "InputBox" einen String zurückgibt. Danach wird nach dem
Suchausdruck gesucht (7) und überprüft, ob ein Datensatz gefunden wurde (8).
Falls nein, erfolgt eine entsprechende Meldung (10), falls ja, wird der Datensatz
in einem Meldungsfenster angezeigt (13).
Für die "Ende"-Taste wird der übliche Quelltext 'End' eingegeben.

Sub CommandEnd_Click ()
'Programm beenden
End
End Sub

Bei der "Load"-Ereignisprozedur des Formulars werden Anfangsinitialisierungen


vorgenommen, da dieses Ereignis beim Programmstart und nur dort eintritt.
Sub Form_Load ()
'Datenbank und Tabelle öffnen
Set db = OpenDatabase("c:\vb\biblio.mdb")
Set tb = db.OpenTable("Publisher Comments")
'Index setzen
tb.Index = "PrimaryKey"
'Datensätze in Listenfeld eintragen
Liste_Neu
End Sub

Es werden die Datenbank und die Tabelle geöffnet, ein Index gesetzt und das
Listenfeld mit den Datensätzen aus der Tabelle gefüllt.

In der "Unload"-Prozedur des Formulars werden die Tabelle und die Datenbank
wieder geschlossen, da dieses Ereignis beim Programmende eintritt.
Sub Form_Unload (Cancel As Integer)
'Tabelle und Datenbank schließen
tb.Close
db.Close
End Sub

Das Unterprogramm zum Aktualisieren des Listenfeldes ist eigenständig, also


keine Ereignisprozedur. Um den Quelltext einzugeben klicken Sie bitte im
Menüfenster beim Menüpunkt 'View' auf den Unterpunkt 'New Procedure...'. Es
erscheint folgendes in Abbildung 32 dargestellte Fenster:

Seite 50 von 94
Abb. 32. Das Fenster zum Anlegen neuer Prozeduren

Geben Sie bei 'Name:' wie in der Abbildung zu sehen "List_Neu" ein. Nach dem
Drücken von "OK" können Sie untenstehenden Quelltext eingeben.
1 Sub Liste_Neu ()
2 'Listenfeld mit den Datensätzen aktualisieren
3 Dim satz As String
4
5 'Listenfeld leeren
6 ListTable.Clear
7 'Datensätze in Listenfeld eintragen
8 tb.MoveFirst
9 Do While Not tb.EOF
10 satz = tb("PubID") + ", " + tb("Publisher")
11 Form1.ListTable.AddItem satz
12 tb.MoveNext
13 Loop
14 'aktuellen Index ausgeben
15 LabelIndex.Caption = tb.Index
16 End Sub

Zuerst wird das Listenfeld geleert (6), dann der Datensatzzeiger auf den ersten
Datensatz der Tabelle gesetzt (8). Dann wird eine Schleife durchlaufen (9-13), bis
das Ende der Tabelle erreicht ist. In der Schleife werden die Felder "PubId" und
"Publisher" vom aktuellen Datensatz in die Variable "satz" geschrieben (10) und
"satz" in die Liste eingefügt (11). Schließlich wird in der Schleife noch der Daten-
satzzeiger auf den nächsten Datensatz bewegt (12).
Als letztes wird in Zeile 15 der Name des aktuelle Indexes im "LabelIndex" aus-
gegeben.

Zum Schluß noch das Unterprogramm "Suche_Datensatz", das den Datensatzzei-


ger auf den aktuell im Listenfeld ausgewählten Datensatz setzt.

1 Sub Suche_Datensatz ()
2 'Datensatzzeiger auf den Datensatz setzen,
3 'der gerade im Listenfeld ausgewählt ist
4
5 'PubId des ausgewählten Datensatzes ermitteln
6 s$ = ""
7 i=0
8 Do While zeichen <> ","
Seite 51 von 94
9 i=i+1
10 zeichen = Mid$(ListTable.List(ListTable.ListIndex), i, 1)
11 If zeichen <> "," Then s$ = s$ + zeichen
12 Loop
13
14 'richtigen Index setzen und Datensatz suchen
15 tb.Index = "PrimaryKey"
16 tb.Seek "=", Val(s$)
17 End Sub
Zuerst muß aus der, in der Liste ausgewählten Zeile, die "PubId" des gewünschten
Datensatzes ermittelt werden, um diesen über die Nummer suchen zu können.
Dazu wird in der Schleife von Zeile 8 bis 12 der ausgewählte Eintrag aus dem
Listenfeld Buchstabe für Buchstabe (10) in die Variable "s$" übertragen (11),
solange bis ein Komma gelesen wird, was heißt, daß der Inhalt des Feldes "PubId"
zu Ende ist und nun der Inhalt von "Publisher" folgt.
Die Funktion "Mid$" liefert einen Teilstring eines anderen Strings zurück und hat
die Syntax:

Mid[$] (stringexpr, start, [length])

stringexpr  der String aus dem ein Teilstring gebildet werden soll
start  Zeichenposition in stringexpr, ab der ein Teilstring genommen
werden soll
length  Anzahl der Zeichen die zurückgeliefert werden sollen. Wird
length weggelassen, wird der ganze Rest des Strings ab der
Position start geliefert.

In Zeile 10 wird also mit Hilfe der Funktion "Mid$" jeweils vom angewählten
Listeneintrag (also Array der Einträge 'ListTable.List', Eintrag an Stelle
'ListTable.ListIndex') das Zeichen an Stelle "i" der Variable "Zeichen" zugewiesen.
"i" hat beim Betreten der Schleife den Wert Null und wird bei jedem Schleifen-
durchlauf um eins erhöht.
Zum Schluß wird noch der richtige Index zum Suchen nach einer "PubId" gesetzt
(15) und der Datensatz mit "seek" gesucht (16), wonach der Datensatzzeiger ja
automatisch auf den gefundenen Datensatz gesetzt ist.

Arbeiten mit Abfragen


Außer dem Arbeiten mit Tabellen ist ein sehr wichtiger Bestandteil der Daten-
bankprogrammierung der Umgang mit Abfragen. Durch Abfragen können be-
stimmte Informationen aus einer oder mehreren Tabellen gewonnen werden. Erst
dadurch ist die effektive Nutzung von Datenbanken möglich.
Die Sprache SQL ist der Standard beim Formulieren von Abfragen, wird deshalb
von vielen Programmen unterstützt, und auch in Visual Basic können SQL-Sta-
tements verwendet werden.

Seite 52 von 94
Abfragen definieren
Eine Abfrage in Visual Basic wird wie schon erwähnt als SQL-Statement for-
muliert und als QueryDef in einer Datenbank gespeichert, so daß sie immer wie-
der angewandt werden kann.
Dem Anlegen einer neuen Abfrage dient die "CreateQueryDef"-Methode des Da-
tenbankobjektes. Diese Methode hat folgende Syntax:

Set querydef = database.CreateQueryDef(name,[sqltext])

querydef  Objektvariable vom Typ QueryDef


database  Objektvariable vom Typ Database
name  Name der Abfrage, mit dem diese in der Datenbank
abgespeichert und über den sie angesprochen wird
sqltext  das SQL-Statement für die Abfrage als String. Falls
dieser Parameter weggelassen wird, muß vor Anwendung der
Abfrage die "SQL"-Eigenschaft des "QueryDef"-Objektes
gesetzt werden.

Um etwa aus der Tabelle "Authors" der Datenbank "biblio.mdb" alle Autoren mit
"Au_Id" kleiner fünfzehn zu erhalten, ist folgendes SQL-Statement nötig:

Select * from authors where Au_Id between 0 and 15 order by Author

Eine entsprechende Abfrage speichert man in der Datenbank mit folgenden Zei-
len:

Dim qd As QueryDef
Dim db As Database
Set db = OpenDatabase ("c:\vb\biblio.mdb")

sql$ = "Select * from authors where Au_Id between 0 and 15 order by Author"
Set qd = db.CreateQueryDef("Au_Id_15", sql$)

db.Close

Das SQL-Statement ist also ein einfacher String, der bei Aufruf der
"CreateQueryDef"-Methode übergeben wird.
Obige Programmzeilen dürfen natürlich nur einmal ausgeführt werden. Bei einem
zweiten Aufruf wäre die Abfrage "Au_Id_15" schon vorhanden und das Pro-
gramm bräche beim Aufruf von "CreateQueryDef" mit einer Fehlermeldung ab.

Seite 53 von 94
Bei der Arbeit mit einer dBase-Datenbank, kann keine solche Abfrage angelegt
werden. Visual Basic bricht hier beim Aufruf von "CreateQueryDef" mit der
Fehlermeldung "Feature not available" ab.

Abfragen anwenden
Wie wendet man nun eine in einer Datenbank bestehende Abfrage an?
Dazu muß die gewünschte Abfrage zuerst mit der "OpenQueryDef"-Methode des
Datenbankobjektes geöffnet werden. Diese Methode hat folgende Syntax:
Set querydef = database.OpenQueryDef(name)

Dabei sind 'querydef' und 'database' wieder entsprechende Objektvariablen und


'name' ist der Name der gewünschten Abfrage.
Nach Öffnen der Abfrage wendet man diese mit Hilfe der "CreateSnapshot"-Me-
thode des "QueryDef"-Objektes an und erhält einen Snapshot mit den der Abfrage
entsprechenden Datensätzen. Folgende Programmzeilen sind also nötig, um die
vorher erstellte Abfrage "Au_Id_15" später anzuwenden:

Set qd = db.OpenQueryDef("Au_Id_15")
Set MySet = qd.CreateSnapshot()

Dabei müssen die Variablen "qd" und "MySet" zuvor natürlich wie folgt verein-
bart worden sein:

Dim qd As QueryDef
Dim MySet As Snapshot

Nach Aufruf der "CreateSnapshot"-Methode stehen dann die Ergebnis-Datensät-


ze der Abfrage in dem Snapshot "MySet", welcher ebenso wie eine Tabelle bear-
beitet werden kann, nur daß das Ändern von Datensätzen nicht möglich ist.

Beim Arbeiten mit dBase-Datenbanken können bestehende (mit dBase erstellte)


Abfragen nicht verwendet werden. Visual Basic weigert sich sowohl
Standardabfragen ("*.QBE"- und "*.QBO"-Dateien) als auch SQL-Abfragen von
dBase zu erkennen. Eventuell vorhandene dBase-Abfragen müssen also als
QueryDefs für Visual Basic wieder neu erstellt werden, wobei auch die dBase-
Dateien ins Access-Format übertragen werden müssen.

Beispiel
Als Beispiel sollen die standardmäßig in der Datenbank "biblio.mdb" gespeicher-
ten Abfragen in einer Liste angezeigt werden und nach Auswahl einer der Abfra-

Seite 54 von 94
gen soll diese angewandt und das Ergebnis in einer weiteren Liste am Bildschirm
ausgegeben werden.
Zum Ermitteln der Tabellen und Abfragen einer Datenbank dient die
"ListTables"-Methode des "DataBase"-Objektes. Diese Methode liefert einen
Snapshot mit einem Datensatz je Tabelle oder Abfrage und folgenden Feldern:

Name Der Name der Tabelle oder Abfrage



DateCreated Das Erstellungsdatum der Tabelle oder Abfrage

LastUpdated Das Datum der letzten Änderung

TableType Eine Zahl, die besagt, ob es sich um eine Tabelle oder Abfrage

handelt
RecordCount  Die Anzahl der Datensätze in der Tabelle; handelt es sich um
eine Abfrage, hat dieses Feld den Wert 0.
Attributes  Eine "Longinteger"-Zahl, die einige Charakteristika der Tabelle
oder Abfrage bestimmt. Ist die Zahl &H80000002, so handelt
es sich um eine Systemtabelle von Visual Basic.

Das Ergebnis einer Abfrage liegt wie oben beschrieben in einem Snapshot (oder
wahlweise auch in einem Dynaset) vor. Dieser Snapshot hat natürlich abhängig
vom SQL-Statement der Abfrage und den zugrundeliegenden Tabellen verschie-
dene Felder, welche sich mit der "ListFields"-Methode des "Snapshot"-Objektes
ermitteln lassen. Diese Methode liefert wiederum einen Snapshot, mit einem Da-
tensatz je Feld, welcher folgende Felder hat:

Name  der Name des Feldes


Type  Zahl, die den Typ des Feldes angibt
Size  Zahl, welche die maximale Länge des Feldes angibt
Attributes  Zahl, welche bestimmte Attribute angibt
SorceTable  Name der zugrundeliegenden Tabelle

Für das Beispiel sind aber, wie Sie im untenstehenden Quelltext sehen werden,
nur das "Name"- und das "Type"-Feld von Belang.

Legen Sie zuerst wie üblich ein neues Projekt an. Im Entwurfsformular sind zwei
Listenfelder, zwei Bezeichnungfelder und eine "Ende"-Taste nötig. In Abbildung
33 ist das Bild des Formulars während der Programmlaufzeit zu sehen.

Seite 55 von 94
Abb. 33. Das Formular für das Beispiel zu Abfragen

Die Abfrage-Ergebnisliste hat den Namen "ErgebnisListe", die Liste mit den
vorhandenen Abfragen heißt "AbfragenListe", das Bezeichnungsfeld, in dem das
SQL-Statement ausgegeben wird "SQLLabel" und die "Ende"-Taste
"EndCommand".

Beim Quelltext sind zuerst im "General"-Teil einige Variablenvereinbahrungen


nötig.

'Variablendeklarationen:

Dim db As database 'Datenbankvariable


Dim qd As querydef 'Abfragevariable
Dim ErgSet As Snapshot 'Snapshotvariable für das jeweilige Abfragen-Ergebnis

Als erstes muß dann beim "Load"-Ereignis des Formulars untenstehender Quell-
text abgearbeitet werden, um die Datenbank zu öffnen, und die vorhandenen
Abfragen in die Abfragen-Liste einzutragen.

1 Sub Form_Load ()
2 'Datenbank öffnen und Namen der Abfragen in AbfragenListe eintragen
3
4 Dim QSet As Snapshot 'Snapshot der Tabellen und Abfragen
5
6 Set db = OpenDatabase("biblio.mdb")
7
8 'Tabellen und Abfragen der Datenbank ermitteln
9 Set QSet = db.ListTables()

Seite 56 von 94
10 'Snapshot durchgehen und Abfragen in AbfragenListe eintragen
11 QSet.MoveFirst
12 Do While Not QSet.EOF
13 If QSet("TableType") = 5 Then
14 'es handelt sich um eine Abfrage
15 AbfragenListe.AddItem QSet("Name")
16 End If
17 QSet.MoveNext
18 Loop
19
20 End Sub

Zuerst wird also in Zeile 4 eine Objektvariable vom Typ "Snapshot" für die Tabel-
len und Abfragen der Datenbank vereinbart. In Zeile 6 wird dann die Datenbank
geöffnet und danach der Snapshot mit den Tabellen und Abfragen erstellt (9).
Dieser Snapshot wird dann in einer Schleife (12-18) - wie wir es von der Tabel-
lenbearbeitung her kennen - in die Liste "AbfragenListe" eingetragen (15). In
Zeile 13 wird der Typ des jeweiligen Snapshot-Eintrages abgefragt, um die
Abfragen ('Typ = 5') herauszufiltern.

Nach dem Starten des Programms und Abarbeitung der "Load"-Ereignisprozedur


ist die Ergebnisliste also noch leer und nur die vorhandenen Abfragen werden
angezeigt. Erst wenn man eine der Abfragen anklickt, wird das zugehörige SQL-
Statement im Bezeichnungsfeld "SQLLabel" und das Abfrageergebnis in der
Ergebnisliste ausgegeben. Um das zu erreichen müssen Sie für das "Click"-
Ereignis der "AbfragenListe" folgenden Quelltext eingeben:

1 Sub AbfragenListe_Click ()
2 'Eine neue Abfrage wurde ausgewählt:
3 ' - diese öffnen
4 ' - das SQL-Statement ausgeben
5 ' - Abfrage anwenden
6
7 Dim WhatState As String 'Variable für gewünschten Staat
8
9 'Abfrage öffnen
10 Set qd = db.OpenQueryDef(AbfragenListe.List(AbfragenListe.ListIndex))
11 'SQL-Statement ausgeben
12 SQLLabel.Caption = qd.SQL
13
14 'Abfrage anwenden
15 If qd.Name = "By State" Then
16 'bei Abfrage 'By State' Staat ermitteln
17 'und entspr. SQL-Parameter setzen
18 WhatState = InputBox("Welchen Staat: ", "Frage", "WA")
19 qd![Enter State] = WhatState
20 End If
Seite 57 von 94
21 'Abfrage-Ergebnis ermitteln
22 Set ErgSet = qd.CreateSnapshot()
23 'Abfrage-Ergebnis(ErgSet) ausgeben
24 If ErgSet.RecordCount > 0 Then ErgebnisAusgeben
25 End Sub

Zuerst wird die in der Liste ausgewählte Abfrage geöffnet (10) und dann das SQL-
Statement im zugehörigen Bezeichnungsfeld ausgegeben (12).
In Zeile 15 folgt dann eine Sonderbehandlung für die Abfrage "By State". Die
Besonderheit bei dieser Abfrage ist, daß im SQL-Statement ein Parameter enthal-
ten ist, der vor Aufruf der Abfrage angegeben werden muß. Daher wird in Zeile
18 dieser Parameter vom Benutzer abgefragt und in die Variable "WhatState"
eingelesen. Danach wird schließlich der Parameter des SQL-Statements (nämlich
"Enter State") mit dem Wert der Variablen "WhatState" belegt (19).
In Zeile 22 wird für alle Abfragen auf gleiche Weise der Snapshot mit dem Ab-
frageergebnis erstellt. Dieses wird dann mit Hilfe des Unterprogramms
"ErgebnisAusgeben" in die "ErgebnisListe" eingetragen (24), falls der Ergebnis-
Snapshot wenigstens einen Datensatz enthält, also 'ErgSet.RecordCount > 0' gilt.

Das oben schon erwähnte Unterprogramm zur Ausgabe des Abfrageergebnisses


ist eine eigenständige Prozedur, die Sie wieder mit Hilfe des Unterpunktes 'New
Procedure...' beim Menüpunkt 'View' anlegen.

1 Sub ErgebnisAusgeben ()
2 'Ausgabe des Abfrageergebnis-Snapshot in ErgebnisListe
3 Dim FieldsSet As Snapshot
4
5 ErgebnisListe.Clear
6
7 'Felder von ErgSet ermitteln
8 Set FieldsSet = ErgSet.ListFields()
9
10 'ErgSet durchgehen
11 ErgSet.MoveFirst
12 Do While Not ErgSet.EOF
13 Zeile$ = ""
14 'die Felder von ErgSet, also FieldsSet durchgehen
15 FieldsSet.MoveFirst
16 Do While Not FieldsSet.EOF
17 'Feldinhalt an Zeile$ anfügen
18 If FieldsSet("Type") >= 10 And FieldsSet("Type") <= 12 Then
19 'als String vorliegende Typen (Text, Long Binary, Memo)
20 Zeile$ = Zeile$ + ErgSet(FieldsSet("Name")) + ", "
21 Else
22 'als Zahlen vorliegende Typen
23 Zeile$ = Zeile$ + Str(ErgSet(FieldsSet("Name"))) + ", "
24 End If

Seite 58 von 94
25 FieldsSet.MoveNext
26 Loop
27 'Zeile (=Datensatz aus ErgSet) in ErgebnisListe anfügen
28 ErgebnisListe.AddItem Zeile$
29
30 ErgSet.MoveNext
31 Loop
32 End Sub

Da nicht von Anfang an bekannt ist, welche Felder im Snapshot "ErgSet" enthal-
ten sind, müssen diese erst ermittelt werden (8). Die Namen der Felder sind dar-
aufhin ebenfalls in einem Snapshot gespeichert, nämlich in "FieldsSet".
Um nun die Datensätze in "ErgSet" in die Ergebnisliste einzutragen, wird wie
gewöhnlich eine Schleife durchlaufen (12-31), der jeweilige Datensatz in die Liste
eingetragen (28) und zum nächsten Datensatz weitergeschaltet (30). Da nun die
Feldnamen der Datensatzfelder ebenfalls in einem Snapshot vorliegen, ist eine
weitere Schleife (16-26) innerhalb der vorherigen nötig, in der "FieldsSet" durch-
gegangen wird. Für jeden Datensatz aus "ErgSet" werden alle Feldnamen aus
"FieldsSet" abgearbeitet und die Feldinhalte an den String "satz$" angehängt.
Mit 'ErgSet(FieldsSet("Name"))' wird auf den Feldinhalt zugegriffen.
'FieldsSet("Name")' beinhaltet ja den jeweiligen Feldnamen von "ErgSet", muß al-
so in die Klammer hinter "ErgSet" eingetragen werden, um den Feldinhalt zu er-
halten.
Die "If"-Unterscheidung (18) ist nötig, da der jeweilige Feldinhalt entweder aus
Zeichen besteht oder aus Zahlen. Falls es Zahlen sind muß dieser beim Anhängen
an den String "satz$" mit Hilfe der Funktion "str()" in Zeichen umgewandelt
werden (23), ansonsten nicht (20).
Nach Verlassen der äußeren Schleife befindet sich das Abfrageergebnis dann in
der Ergebnisliste.

Als letztes ist noch der übliche Quellcode für die "Ende"-Taste nötig:

Sub EndCommand_Click ()
'Programm beenden
End
End Sub

Beispiele zu Standardproblemen der Datenbankbearbeitung


Außer dem Arbeiten mit Indexen und Abfragen gibt es bei der Datenbankbear-
beitung noch viele weitere Probleme, die immer wieder in ähnlicher Form auftre-
ten. Im Folgenden soll daher noch auf das Rechnen in Tabellen, die Gruppenbe-
arbeitung und das Drucken von Tabellen mit Visual Basic eingegangen werden.
Seite 59 von 94
Berechnungen in Tabellen
Für Berechnungen in Tabellen stellt Visual Basic keine eigenen Funktionen zur
Verfügung, wie etwa eine Funktion, die mit einem Aufruf den Durchschnitt einer
Spalte errechnet. Man ist daher darauf angewiesen, die Tabelle Datensatz für
Datensatz durchzugehen, will man etwa statistische Auswertungen erstellen.
Als Beispiel soll hier zur Demonstration die Durchschnittsberechnung einer Ta-
bellenspalte vorgenommen werden.
Hierzu soll bei der Tabelle "Titles" aus "biblio.mdb" vom Feld "Year Published"
der Durchschnitt der Erscheinungsjahre errechnet werden - ohne Sinn oder
Unsinn einer solchen Berechnung zu berücksichtigen.
Dazu müssen in einer Schleife die Datensätze der Tabelle durchgegangen, und die
Jahre aufsummiert werden. Der Quelltext dazu sieht dann folgendermaßen aus:

1 Sub Berechnen()
2 Dim db As Database 'Datenbank-Variable
3 Dim tb As Table 'Tabellen-Variable
4 Dim SummeJahr As Long 'Variable für die aufsummierten Jahre
5 Dim Durchschnitt As Integer 'Variable für das Ergebnis
6
7 'Datenbank und Tabelle öffnen
8 Set db = OpenDatabase("biblio.mdb")
9 Set tb = db.OpenTable("Titles")
10
11 'Tabelle Datensatz für Datensatz durchgehen
12 tb.MoveFirst
13 Do While Not tb.EOF
14 'Jahre aufsummieren
15 SummeJahr = SummeJahr + tb("Year Published")
16 tb.MoveNext
17 Loop
18
19 'Durchschnitt errechnen; tb.RecordCount ist die Anzahl der Datensätze in tb
20 Durchschnitt = Int(SummeJahr / tb.RecordCount)
21
22 'Tabelle und Datenbank schließen
23 tb.Close
24 db.Close
25 End Sub

Es werden also in der Schleife (13-17) die Jahre aufsummiert und hernach durch
die Anzahl der Datensätze geteilt (20). Die Funktion "Int" sorgt bei der
Ergebnisberechnung dafür, daß sich eine ganze Zahl ergibt.
Wenn auch nicht konkret für Berechnungen in Tabellen von Datenbanken, so
stellt Visual Basic doch für Standardberechnungen verschiedene mathematische

Seite 60 von 94
Funktionen zur Verfügung, welche untenstehend mit kurzen Erklärungen
versehen aufgeführt sind:

Abs  liefert den Absoluten Betrag einer Zahl


Atn  liefert den Arcustangens einer Zahl
Cos  liefert den Cosinus einer Zahl
Exp  liefert die Eulersche Zahl hoch einer Zahl
Fix  liefert den ganzzahligen Anteil einer Zahl (bei negativen Zahlen
Aufrundung)
Int  liefert den ganzzahligen Anteil einer Zahl (bei negativen Zahlen
Abrundung)
Log  liefert den natürlichen Logarithmus einer Zahl
Rnd  liefert eine Zufallszahl
Sgn  entspricht der aus der Mathematik bekannten Signum-Funktion
Sin  liefert den Sinus einer Zahl
Sqr  liefert die Quadratwurzel einer Zahl
Tan  liefert den Tangens einer Zahl

Wie Sie sehen sind diese Funktionen bei der Datenbankbearbeitung wohl meist
nicht nötig, notwendige Berechnungsfunktionen für Datenbanken bietet aber
SQL. Diese Funktionen können daher bei der Erstellung von Abfragen verwendet
werden. Weiteres dazu entnehmen Sie bitte der Visual Basic-Hilfe zu SQL oder
weiterführender Literatur.

Gruppenbearbeitung
Als Beispiel zur Gruppenbearbeitung sollen zu den Publisher-Namen aus der
Tabelle "Publishers" die zugehörigen Titel aus der Tabelle "Titles" gesucht wer-
den. Das Ergebnis der Bearbeitung der beiden Tabellen soll in einer Liste am
Bildschirm ausgegeben werden, so daß das Programm zur Laufzeit wie in
Abbildung 34 dargestellt aussehen soll:

Seite 61 von 94
Abb. 34. Formular zum Beispiel über Gruppenbearbeitung

Das Vorgehen im Quelltext ist folgendes, daß die Tabelle "Publishers" durchge-
gangen wird und zu dem jeweiligen Publisher dann die zugehörigen Titel über die
"PubId" aufgelistet werden.

Folgender Quelltext ist für das Beispiel nötig:

1 Sub Form_Load ()
2 Dim db As Database 'Datenbankvariable
3 Dim tbPub As Table 'Variable für Tabelle 'Publishers'
4 Dim tbTit As Table 'Variable für Tabelle 'Titles'
7
6 'Datenbank und Tabellen öffnen
8 Set db = OpenDatabase("c:\vb\biblio.mdb")
9 Set tbPub = db.OpenTable("Publishers")
10 Set tbTit = db.OpenTable("Titles")
11
12 'Indizes für die Tabellen setzen
13 tbPub.Index = "PrimaryKey"
14 tbTit.Index = "PubId"
15
16 'Äußere Schleife: Durchgehen Tabelle 'Publishers'
17 tbPub.MoveFirst
18 Do While Not tbPub.EOF
19 PubId = tbPub("PubId") 'aktuelle PubId "merken"
20 tbTit.Seek "=", PubId 'den ersten der zugehörigen Titel suchen
21 If Not tbTit.NoMatch Then 'es wurde ein zugehöriger Titel gefunden
Seite 62 von 94
22 List1.AddItem tbPub("Name") 'Publishernamen in Liste eintragen
23
24 'Innere Schleife: Durchgehen der Titel mit der aktuellen PubId
25 SchleifenEnde = False
26 Do While Not SchleifenEnde
27 List1.AddItem " " + tbTit("Title") 'Titel in Liste eintragen
28 tbTit.MoveNext
29 If tbTit.EOF Then 'Ende der Tabelle 'Titles' erreicht
30 SchleifenEnde = True 'Schleife abbrechen!
31 ElseIf PubId <> tbTit("PubId") Then ' Gruppenwechsel!
32 SchleifenEnde = True 'Schleife abbrechen!
33 End If
34 Loop
35
36 End If
37 tbPub.MoveNext
38 Loop
39 tbPub.Close
40 tbTit.Close
41 db.Close
42
43 End Sub

In einer äußeren Schleife (18-38) werden also die Datensätze der "Publishers"-
Tabelle durchgegangen. In Zeile 19 wird dabei jeweils die aktuelle Publisher-
Nummer aus "Publishers" in der Variablen "PubId" gespeichert. Daraufhin wird
nach dieser Nummer in der Tabelle "Titles" gesucht (20), wonach sich der
Datensatzzeiger auf dem ersten Titel mit der aktuellen PubId befindet, falls es
Titel mit dieser Nummer gibt. Falls nicht wird einfach auf den nächsten Publisher
weitergeschaltet (37). Ansonsten können nun in der inneren Schleife (26-34) diese
Titel der Reihe nach in "List1" eingetragen werden (27). Die innere Schleife wird
abgebrochen, wenn ein Titel mit anderer PubId auftritt (31) oder wenn das
Tabellenende von "Titles" erreicht ist (29). Nach Abbruch dieser Schleife wird
dann jeweils auf den nächsten Publisher geschaltet (37) bis das Ende der Tabelle
"Publishers" erreicht ist.
Warum findet nun in der inneren Schleife die Konstruktion mit der Variablen
"SchleifenEnde" Verwendung. Eleganter wäre es natürlich zu formulieren:

Do While Not tbTit.EOF And tbTit("PubId") = PubId


...
Loop

Das Problem dabei ist, daß Visual Basic (ab Version 2.0) beim Erreichen des
Tabellenendes von "tbTit" (also 'tbTit.EOF = True') nicht nach Überprüfung des
ersten Teiles des logischen Statements abbricht (wenn 'Not tbTit.EOF' schon falsch
ist, muß natürlich der ganze Ausdruck falsch sein, weil es sich ja um eine "And"-
Seite 63 von 94
Verknüpfung handelt), sondern auch noch den zweiten Teil abprüft. Da aber
schon das Ende der Tabelle "tbTit" erreicht ist, gibt es keinen aktuellen Datensatz
mehr, Visual Basic bricht also beim Zugriff 'tbTit("PubId")=PubId' mit einer
Fehlermeldung ab.

Drucken mit Visual Basic


Ein wichtiger Punkt bei der Arbeit mit Datenbanken ist das Ausdrucken von
Tabellen, Abfrage-Ergebnissen und ähnlichem. Dies ist unter Visual Basic recht
leicht zu bewerkstelligen, da die Druckeransteuerung ja von Windows verwaltet
wird. Man braucht also nicht zu berücksichtigen welcher Drucker angeschlossen
ist, das Vorgehen beim Ausdrucken ist immer dasselbe.
Der Drucker wird unter Visual Basic über das "Printer"-Objekt angesprochen.
Dieses Objekt hat wieder viele Eigenschaften und Methoden, von denen die
wichtigsten unten kurz aufgeführt sind:

Eigenschaften:
FontBold  True: Schrift fett, False: Schrift normal
FontItalic  True: Schrift kursiv, False: Schrift normal
FontName  Schriftart, in der gedruckt werden soll
FontSize  Schriftgröße, in der gedruckt werden soll
Page  gibt die Nummer der aktuellen Druckseite an

Methoden:
EndDoc  beenden des Druckvorganges
NewPage  Seitenvorschub am Drucker
Print  Drucken von Strings

Als Beispiel soll das Programm zur Gruppenbearbeitung so abgewandelt werden,


daß man das Ergebnis nicht nur in der Liste betrachten, sondern auch auf den
Drucker ausgeben kann.
Erweitern Sie dazu das Formular um eine weiter Aktionsschaltfläche mit der Be-
schriftung "Drucken". Wird diese Taste angeklickt, soll der Inhalt des Listenfel-
des in der Schriftart "Arial" und der Schriftgröße "10" ausgedruckt werden.
Die einzige Änderung zum vorherigen Beispiel ist dann der Quelltext zu dieser
neuen Aktionsschaltfläche.

1 Sub Command2_Click ()
2 'Schrift einstellen
3 printer.FontName = "Arial"
4 printer.FontSize = 10

Seite 64 von 94
5 'Listeninhalt ausgeben
6 For i = 0 To List1.ListCount - 1
7 printer.Print List1.List(i)
8 Next i
9 'Drucken anstoßen
10 printer.EndDoc
11 End Sub

Das eigentliche Drucken erfolgt also in Zeile 7 mit der Methode "Print" des
"Printer"-Objektes. Die Methode hat folgende Syntax:

printer.Print [Spc(n)] [expressionlist] ;

Dabei kann statt 'Spc(n)' auch 'Tab(n)' stehen und statt ';' am Ende auch ','.

Bedeutung:
Spc(n)  Einfügen von n Leerzeichen
Tab(n)  Einfügen von n Tabulatoren
expressionlist  Liste von durch Leerzeichen oder Kommata getrennten
Stringausdrücken
;  Zeilenumbruch (auch bei Weglassen von "," und ";")
,  kein Zeilenumbruch

Nachdem alle Druckzeilen mit "Print" an den Druckmanager von Windows ge-
schickt wurden, muß noch die Methode "EndDoc" des Printerobjektes aufgerufen
werden, da dann erst der Ausdruck wirklich beginnt.

Zum Schluß sei noch auf "Crystal Reports for Visual Basic" verwiesen. Dies ist
ein Zusatzprogramm zur professionellen Version von Visual Basic, das dem Er-
stellen von Datenbankreports dient. Damit können auf komfortable Weise Listen
und Ausdrucke zu Datenbank-Tabellen mit professionellem Layout erstellt
werden. Näheres entnehmen Sie bitte der Hilfe-Datei zu "Crystal Report" oder
weiterführender Literatur.

Seite 65 von 94
Beurteilung der Arbeit mit Access- und dBase-Dateien unter Visual
Basic

Zum Schluß seien noch einige zusammenfassende Aussagen zum Programmieren


von Access- und dBase-Datenbanken unter Visual Basic erlaubt.
Hervorzuheben ist vor allem das angenehme Arbeiten mit dem Data Control, das
einen wirklich leichten Zugang zur Datenbankprogrammierung mit Visual Basic
bietet. Damit wird es auch dem Einsteiger ermöglicht, relativ schnell und
unkompliziert mit Datenbanken zu arbeiten.
Wie sieht es aber konkret in der Praxis bei der Arbeit mit Access- und dBase-
Dateien unter Visual Basic aus?

Visual Basic und Access-Datenbanken


Völlig überzeugen kann erwartungsgemäß die Bearbeitung von Access-Daten-
banken mit Visual Basic. Problemlos können unter Access erstellte Tabellen ge-
öffnet, bearbeitet und wieder geschlossen werden, wobei die Syntax von Visual
Basic und Access-Basic größtenteils übereinstimmt. Leider nur größtenteils, aber
es bleibt zu hoffen, daß bei zukünftigen Versionen beider Programme diese
Einschränkung behoben sein wird.
Ohne Probleme ist auch die Verwendung von mit Access erstellten Indizes und
Abfragen. Vor allem die Verwendung von Access-Abfragen bietet eine enorme
Erleichterung bei der Programmentwicklung, wenn man mit Access und Visual
Basic parallel arbeitet. In Access können Abfragen nämlich relativ unkompliziert
(etwa mit dem Abfrage-Assistenten) erstellt werden, wobei man das entspre-
chende SQL-Statement automatisch generieren kann. Unter Visual Basic lassen
sich diese automatisch erstellten Abfragen dann ohne Probleme anwenden, so daß
man auch ohne fundierte SQL-Kenntnisse komplexe Datenbank-Abfragen
verwirklichen kann.
Ebenso erweist sich das Erstellen von Indizes und Abfragen bei der Arbeit mit
Access-Datenbanken als problemlos. Vor allem die Tatsache, daß die Abfragen
auf SQL-Statements basieren, ist hervorzuheben, da etwaige Kenntnisse mit an-
deren auf diese Abfragesprache basierenden Systemen angewandt werden kön-
nen.

Das Zusammenspiel von Visual Basic mit Access-Datenbanken ist also fast per-
fekt, einziger Wermutstropfen mag die recht eingeschränkte Geschwindigkeit bei
der Anwendung von Abfragen auf größere Datenbestände sein, was bei langsa-
meren Rechnern zu einem Geduldsspiel werden kann. Ansonsten gibt es bei der
Bearbeitung von Access-Datenbanken mit Visual Basic keinerlei Probleme, wie
es ja zu erwarten war.

Seite 66 von 94
Visual Basic und dBase-Datenbanken
Anders sieht es beim Zugriff auf dBase-Dateien aus. Hier haben sich doch gewisse
Schwächen von Visual Basic aufgetan und einige Probleme traten zu Tage.
Unproblematisch ist es, mit dem Data Control auf dBase-Dateien zuzugreifen.
Nach richtiger Belegung der "Connect"- und der "DatabaseName"-Eigenschaft ist
für den Benutzer eines entsprechenden Visual Basic-Programms nicht mehr
festzustellen, von welchem Typ die zugrundeliegende Tabelle ist. Hierbei hält
Visual Basic 3.0 also, was es verspricht, ebenso beim Bearbeiten von dBase-Ta-
bellen ohne Data Control. Beim Öffnen und Schließen von Tabellen, und beim
Ändern, Einfügen und Löschen von Datensätzen arbeitete Visual Basic einwand-
frei. Außerdem wurden die mit Visual Basic in den Dateien vorgenommenen
Änderungen hernach ohne Problem von dBase wieder übernommen.

Probleme ergaben sich erst bei der Arbeit mit Indizes. Ohne Einschränkungen ist
diese möglich, wenn eine "*.MDX"-Datei aus dBase IV vorliegt, dabei ist es al-
lerdings seltsamerweise belanglos, ob für die "Connect"-Eigenschaft "dBase III;"
oder "dBase IV;" gesetzt wird. Eigentlich müßte diese Index-Art ja mit "dBase
III;" nicht erkannt werden, da für dBase III ja nur "*.NDX"-Dateien möglich
waren.
Diese fehlende Unterscheidung kann man Visual Basic allerdings nicht einmal als
Schwäche ankreiden, eher im Gegenteil. Eine gewisse Einschränkung ist aber
beim Umgang mit "*.NDX" aus dBase III gegeben, denn Visual Basic erkennt -
wieder unabhängig von der Einstellung "dBase III" oder "dBase IV" - keinen
dieser Indizes, wenn man sie mit einer bestehenden Datenbank übernehmen will.
Ohne die Erstellung einer zusätzlichen Datei, einer INF-Datei, kann mit
"*.NDX"-Dateien leider nicht gearbeitet werden.
Das Erstellen von dBase-Indizes ist dagegen wiederum problemlos, wobei hier
durchaus zwischen dBase III und dBase IV unterschieden wird. Bei der Einstel-
lung "dBase III;" werden "*.NDX"-Dateien angelegt und - für den Benutzer un-
bemerkt - die leidige INF-Datei.
Bemerkenswert dazu ist vielleicht auch noch, daß bei dem Versuch eine schon
bestehende "*.NDX"-Datei anzulegen, die wegen Fehlens einer INF-Datei nicht
erkannt wird, Visual Basic sich dennoch mit der Fehlermeldung "Index already
exists." weigert einen neuen Index anzulegen.
Diese von dBase abweichende Behandlung der "*.NDX"-Dateien aus dBase III
durch Visual Basic ist wohl eine Schwäche, mit der man leben kann. Viel schwe-
rer wiegt dagegen, daß Visual Basic sich standhaft weigert mit irgendwelchen
Abfragen zu arbeiten, die mit dBase erstellt wurden. Sowohl die "*.QBE"- und
"*.QBO"-Dateien der dBase-Standardabfragen als auch Abfragen von dBase-
SQL-Datenbanken werden ignoriert. Dies kann eine schwere Einschränkung
darstellen, wenn Datenbanken mit vielen, komplexen Abfragen in Visual Basic
übernommen werden sollen.
Lösbar ist das Problem relativ leicht bei dBase-SQL-Datenbanken, da hier ja die
SQL-Statements der Abfragen aus dem Feld "SQLTEXT" der Datei
Seite 67 von 94
"sysviews.dbf" entnommen werden kann. Dieser Vorgang ließe sich ja relativ
leicht durch ein Visual Basic-Programm automatisieren. Da aber die meisten Be-
nutzer mit den Standard-Abfragen arbeiteten, ist die fehlende Berücksichtigung
von diesen Abfragen eine massive Einschränkung der Bearbeitungsmöglichkeiten
bestehender dBase-Dateien durch Visual Basic.

Zusammenfassung
Daß die Arbeit mit Datenbanken beider Programme möglich sein soll, hat ja
Microsoft bei der Ankündigung der Version 3.0 von Visual Basic vollmundig
angepriesen. Es war im Voraus also vor allem zu erwarten, daß das Programm in
der neuen Version mit Datenbanken von Access problemlos zusammenarbeiten
würde, da ja Access aus gleichem Hause stammt. Ebenso war zu erwarten, daß
dBase-Datenbanken mit mehr oder weniger großen Einschränkungen zu bearbei-
ten sein würden.
Zusammenfassend läßt sich zum Schluß nun sagen, daß die Arbeit mit Access-
Datenbanken unter Visual Basic erwartungsgemäß problemlos vonstatten geht,
während beim Zugriff auf dBase-Dateien nur das Bearbeiten von Tabellen ebenso
problemlos ist. Beim Hantieren mit Indizes gibt es einige Schwächen, die man
kennen muß, um nicht in Schwierigkeiten zu geraten, das eigentliche und durch-
aus gravierende Manko ist allerdings das Ignorieren vorhandener mit dBase er-
stellter Abfragen.

Seite 68 von 94
Anhang 1: Die Steuerelemente von Visual Basic

Zeiger (Pointer)

Das erste Tool ist der Zeiger, mit dem keine Windowsobjekte erstellt werden
können, sondern der zum Ändern der Größe und zum Bewegen bereits in der
Form befindlicher Objekte dient.

Bildfeld (Picture Box)

Dieses Tool ermöglicht die Erstellung einer so genannten Picture-Box, in der


Bitmaps in ein Fenster zur Illustration oder als Verzierung eingefügt werden
können. Ebenso kann es zur Darstellung von Grafiken dienen, die mit den Me-
thoden Circle, Line und Print erzeugt wurden.

Bezeichnungsfeld (Label)

Hiermit können statische Textfelder in ein Formular eingefügt werden, d.h.


Textfelder, die vom Anwender nicht geändert werden sollen, etwa Kommentare,
Hinweise oder Überschriften.

Textfeld (Text Box)

Mit diesem Tool ist es möglich ein Textfeld zu erstellen, in das vom Benutzer
Text oder auch Zahlen eingegeben oder geändert werden können.

Beispiel:

Rahmen (Frame)

Damit können Rahmen um Objekte gezeichnet werden, sowohl zur optischen


Gliederung, als auch zum Gruppieren von Objekten, etwa Schaltfeldern.

Seite 69 von 94
Beispiel:

Aktionsschalter (Command Button)

Zur Erstellung von Aktionsschalter (auch Pushbutton oder Befehlsschaltfläche),


wie OK- oder Abbrechen-Schalter dient dieses Tool.

Beispiel:

Kontrollfeld (Check Box)

Hiermit werden Check-Boxes oder Kontrollfelder angelegt, welche gekennzeich-


net durch ein Kreuz die Zustände Ja, Nein und Inaktiv annehmen können.

Beispiel:

Schaltfeld (Option Button)

Dazu unterschiedlich sind Schaltfelder, Radio-Buttons, oder Optionsfelder,


welche gekennzeichnet durch einen schwarzen Punkt die Zustände "Ja" und
"Nein" annehmen können. Meist sind sie mit einem Rahmen gruppiert und es
kann im Unterschied zum Kontrollfeld nur eines der Schaltfelder in der Gruppe
den Wert "Ja" haben.

Seite 70 von 94
Beispiel:

Einzeiliges Listenfeld (Combo Box)

Dieses Tool ermöglicht die Verwendung einer Combo-Box , eines einzeiligen Li-
stenfeldes oder Kombinationslistenfeldes, welches eine Verbindung eines
Textfeldes mit einer Liste darstellt. Es kann aus der Liste jeweils ein Eintrag
ausgewählt werden, der dann oben im Editierfeld angezeigt wird.

Beispiel:

Listenfeld (List Box)

Eine eigentliche List-Box, also eine Liste, kann man hiermit in ein Fenster ein-
binden. Sie ermöglicht ebenso wie die Combo-Box, die Darstellung einer Liste
von Ausdrücken am Bildschirm und die Auswahl eines oder mehrerer dieser Aus-
drücke durch den Benutzer.

Beispiel:

Seite 71 von 94
Bildlaufleisten (Scroll Bars)

Hiermit können horizontale bzw. vertikale Scrollbars in einem Fenster dargestellt


werden, um den Fensterinhalt, horizontal oder vertikal zu rollen. Außerdem ist es
möglich mit Scrollbars Werte zwischen zwei Grenzwerten einzustellen.

Beispiel:

Zeitgeber (Timer)

Dieses Schaltfeld dient der Programmierung von Timer-Ereignissen und ist zur
Laufzeit des Programms nicht sichtbar. Der Timer teilt einer Applikation peri-
odisch mit, wann ein zuvor eingestelltes Zeitintervall abgelaufen ist, wonach
jeweils eine vorher programmierte Aktion ausgeführt wird.

Laufwerk-Liste (Drive List Box)

Damit kann eine Liste in einem Fenster angezeigt werden, die während der
Laufzeit alle verfügbaren Laufwerken zur Auswahl darstellt.

Verzeichnis-Liste (Directory List Box)

Dagegen kann man hiermit eine Liste anzeigen mit der hierarchischen Darstellung
der Verzeichnisse im Benutzersystem.

Datei-Liste (File List Box)

Dieses Tool schließlich ermöglicht die Darstellung einer Liste mit allen Dateien
eines bestimmten Verzeichnisses.

Seite 72 von 94
Grafische Figuren (Shape)

Hiermit kann man grafische Objekte am Bildschirm zeichnen, nämlich Rechteck,


abgerundetes Rechteck, Quadrat, abgerundetes Quadrat, Ellipse oder Kreis.

Linie (Line)

Als weiteres grafisches Tool kann man hier Linien in unterschiedlicher Stärke,
Farbe und Strichelung zeichnen.

Anzeigefeld (Image)

Hiermit können wie mit der Picture-Box Bilder und Grafiken in einem Fenster
angezeigt werden, eine Picture-Box bietet aber mehr Möglichkeiten.

Tabelle (Grid)

Hiermit lassen sich auf einfache Weise Excel-ähnliche Tabellen in Fenstern dar-
stellen und zur Laufzeit bearbeiten.
Die Steuerelementdatei GRID.VBX muß eingebunden werden!

OLE-Steuerung (OLE Control)

Dieses Tool ermöglicht es OLE-Objekte in Visual-Basic-Programmen einzubin-


den, etwa Texte aus Winword, Grafiken oder Tabellen.
Die Steuerelementdatei OLE2.VBX muß eingebunden werden!

Datenbank-Steuerung (Data Control)

Damit ist der Zugriff und die Bearbeitung von Datenbanken in verschiedenen
Formaten ermöglicht, ohne Programmcode dafür schreiben zu müssen.

Standard-Dialog-Steuerung (Common Dialog Control)

Mit diesem Tool sind einige Standard-Dialogboxen zur Verwendung in eigenen


Applikationen definiert, nämlich
- Datei-öffnen-/schließen-Dialog
- Farbauswahldialog
Seite 73 von 94
- Schriftenauswahldialog
- Drucken-Dialog.
Die Steuerelementdatei CMDIALOG.VBX muß eingebunden werden!

Bei Visual Basic Professional kommen noch weitere Objekte hinzu.

Animiertes Schaltfeld (Animated Button)

Mit dem sogenannten Animated Button können selbstkreierte Bitmaps als


Schaltfelder verwendet werden, die beim Anklicken mit der Maus animiert wer-
den.
Die Steuerelementdatei ANIBUTON.VBX muß eingebunden werden!

Report-Steuerung (Crystal Custom Control)

Mit diesem Tool ist es möglich auf Reports, die mit "Crystal Reports for Visual
Basic" erstellt wurden, zuzugreifen. Crystal Reports ist ein eigenständiges Pro-
gramm, mit dem man Datenbankreports für die Verwendung in Visual Basic-
Programmen gestalten kann.
Die Steuerelementdatei CRYSTAL.VBX muß eingebunden werden!

Meßgerät-Steuerung (Gauge Control)

Tool um ein horizontales oder vertikales Thermometer, oder zwei verschiedene


Meßgerät in einem Visual Basic-Programm anzuzeigen, etwa als Prozentindika-
tor.
Die Steuerelementdatei GAUGE.VBX muß eingebunden werden!

Diagramm-Steuerung (Graph Control)

Mit diesem Tool lassen sich Diagramme in verschiedenster Form in einem For-
mular anzeigen, die auch während der Laufzeit manipuliert werden können.
Die Steuerelementdatei GRAPH.VBX muß eingebunden werden!

Tasten-Status-Steuerung (Key Status Control)

Das Tool dient der Anzeige oder Änderung des Status' der Tasten CAPS LOCK,
NUM LOCK, INS und SCROLL LOCK.
Die Steuerelementdatei KEYSTAT.VBX muß eingebunden werden!

Seite 74 von 94
Serielle Schnittstellen-Steuerung (Communications Control)

Hiermit ist es möglich, aus Visual Basic Programmen heraus über die serielle
Schnittstelle Daten abzugeben oder zu empfangen.
Die Steuerelementdatei MSCOMM.VBX muß eingebunden werden!

Formatierte Text-Ein-/Ausgabe (Masked Edit)

Man kann mit diesem besonderen Editierfeld eine formatmäßig kontrollierte


Eingabe und eine formatierte Ausgabe von Daten verwirklichen.
Die Steuerelementdatei MSMASKED.VBX muß eingebunden werden!

Hierarchische Liste (Outline Custom Control)

Ausgabe einer Liste, in der die einzelnen Ausdrücke hierarchisch angeordnet sind,
ähnlich wie im Dateimanager von Windows die einzelnen Verzeichnisse.
Die Steuerelementdatei MSOUTLIN.VBX muß eingebunden werden!

Bilder-Steuerung (Picture Clip Control)

Mit diesem Tool, dem Picture Clip Control ist eine vereinfachte Möglichkeit ge-
geben mit vielen eigenen Iconen zu arbeiten, etwa um eine selbst erstellte Toolbox
zu verwenden. Die einzelnen Schalter einer Toolbox sind etwa jeweils im
gedrückten und nicht gedrückten Zustand matrixartig in einem großen Bitmap
angeordnet, und können einfach durch Angabe der Tabellen-Zelle oder der Ko-
ordinaten des Bereichs ausgewählt und am Bildschirm angezeigt werden.
Die Steuerelementdatei PICCLIP.VBX muß eingebunden werden!

Zähler-Steuerung (Spin Button)

Hiermit läßt sich ein Aktionsschalter zur Bearbeitung von Zahlen bei Benutzer-
eingaben erstellen. Das Spin Button wird direkt an ein Editierfeld gesetzt und
durch Klicken mit der Maus wird dann während der Laufzeit des Programms die
in dem Editierfeld dargestellte Zahl erhöht oder erniedrigt.
Die Steuerelementdatei SPIN.VBX muß eingebunden werden!

3D-Kontroll-Feld (3D Check Box)

Dies ist ein Tool, mit dem man 3D-Check-Boxes erstellen kann.
Die Steuerelementdatei THREED.VBX muß eingebunden werden!
Seite 75 von 94
3D-Rahmen (3D Frame)

Damit lassen sich 3D-Rahmen in Fenstern darstellen.


Die Steuerelementdatei THREED.VBX muß eingebunden werden!

3D-Schaltfeld (3D Option Button)

Mit diesem Tool kann man 3D-Radio-Buttons in einem Formular verwenden.


Die Steuerelementdatei THREED.VBX muß eingebunden werden!

3D-Aktionsschalter (3D Command Button)

Hiermit lassen sich 3D-Aktionsschalter in Fenstern erzeugen.


Die Steuerelementdatei THREED.VBX muß eingebunden werden!

3D-Fläche (3D Panel)

Man kann damit räumlich erhöhte Flächen zur Textausgabe am Bildschirm dar-
stellen, wobei die optische Höhe der Umrahmung und der ganzen Fläche indivi-
duell eingestellt werden kann.
Die Steuerelementdatei THREED.VBX muß eingebunden werden!

3D-Gruppen-Schalter (3d Group Push Button Control)

Hiermit kann man 3D-Schaltfelder darstellen, die entweder gedrückt oder heraus-
ragend im Fenster angezeigt werden. Innerhalb einer Gruppe solcher Felder kann
dazu vereinbart werden, daß nur ein Feld gedrückt sein kann. Damit lassen sich
Toolbars wie etwa in Winword oder Excel verwirklichen.
Die Steuerelementdatei THREED.VBX muß eingebunden werden!

Mail System (MAPI Session, MAPI Message)

Mit diesem Tool wird es ermöglicht, ein Mailsystem mit Visual Basic für ver-
schiedene Benutzer zu programmieren, basierend auf Microsoft Mail for Win-
dows, welches also auf dem System installiert sein muß.
Die Steuerelementdatei MSMAPI.VBX muß eingebunden werden!

Seite 76 von 94
Multi Media Steuerung (Multi Media MCI Control)

Damit kann man aus einer Application heraus vorhandene Multimedia-Dateien


abspielen, etwa Videos, MIDI-Dateien oder Audio-CD's, falls die nötige Hard-
ware vorhanden ist.
Die Steuerelementdatei MCI.VBX muß eingebunden werden!

Pen Edit Controls

Diese Tools sind zur Erstellung von Applikationen für Windows mit Pen-Com-
puting gedacht.
Die Steuerelementdatei PENCNTRL.VBX muß eingebunden werden!

Pen Ink-On-Bitmap Control

Ebenfalls ein Tool für das Pen-Computing, um dem Benutzer das übermalen von
Bitmaps zu ermöglichen.
Die Steuerelementdatei PENCNTRL.VBX muß eingebunden werden!

Pen On-Screen Keyboard Control

Ein weiteres Tool für Pen-Computing, das den Zugriff auf die Bildschirm-Tasta-
tur beim Pen-Computing erlaubt.
Die Steuerelementdatei PENCNTRL.VBX muß eingebunden werden!

Seite 77 von 94
Anhang 2: Die wichtigsten Eigenschaften und Ereignisse von Visual
Basic

Die wichtigsten Eigenschaften


Auto Redraw
Diese Eigenschaft ist relevant für Formulare und Picture-Boxes, und kann entwe-
der wahr oder falsch gesetzt werden.
TRUE
Falls wahr gesetzt ist, sorgt Windows automatisch dafür, daß Grafikausgaben in
einem Fenster aktualisiert werden, falls sie durch Verschieben des Fensters oder
Überdeckung eines Teilbereichs zerstört wurden.
FALSE
Bei dieser Einstellung wird nicht automatisch nachgezeichnet, sondern es muß
dies über die Programmierung des "Paint"-Events vorgenommen werden. Dieses
tritt immer dann auf, wenn von Windows eine "WM_PAINT"-Botschaft an das
Fenster geschickt wird, also wenn Windows feststellt, daß ein Bereich des
Fensters vielleicht nicht mehr aktuell ist.

BackColor
Hiermit läßt sich die Hintergrundfarbe der meisten Steuerelemente bestimmen. Es
wird dabei für die Farben das RGB-Modell von Windows verwendet. Außerdem
können die System-Farben verwendet werden, wie sie in der Systemsteuerung
eingestellt sind. Die ensprechenden Konstanten von Visual Basic zur Ansteuerung
dieser Farben sind der Textdatei CONSTANT.TXT zu entnehmen.
Die RGB-Farben kann man mit Hilfe der Funktion RGB verwenden, die einen
"Longinteger"- Wert zurückliefert, der eine bestimmte Farbe aus der Farbpalette
repräsentiert. Die jeweilige Farbe setzt sich aus verschiedenen Anteilen der drei
Grundfarben Rot, Grün und Blau zusammen. Die Anteile werden jeweils durch
ein Byte bestimmt, können also Werte zwischen 0 und 255 annehmen. So liefert
etwa 'RGB (0,0,0)' die Farbe Schwarz, 'RGB(255,0,0)' Rot und 'RGB (255,255,255)'
Weiß.

BorderStyle
Hiermit läßt sich die Rahmenart verschiedener Controls einstellen, wobei die
Einstellungsmöglichkeiten von Control zu Control verschieden sind.

Caption
Diese Eigenschaft beinhaltet einen Text, der bei Formularen in der Titelzeile
ausgegeben wird und bei anderen Controls in oder am Control.

ClipControls
Regelt die Art des Nachzeichnens, falls grafische Objekte etwa durch Überdecken
mit einem anderen Fenster, zerstört wurden, und also von Windows die
Seite 78 von 94
WM_PAINT Meldung kommt. Falls ClipControl True gesetzt ist, wird das ganze
Fenster jedesmal neu gezeichnet, andernfalls nur jeweils der Bereich des Fensters,
der wieder sichtbar wurde.

ControlBox
Bestimmt, ob ein Systemmenüfeld in der oberen linken Ecke eines Fensters an-
gezeigt werden soll (ControlBox = True) oder nicht (ControlBox = False).

Count
Mit dieser Eigenschaft können zur Laufzeit alle Formulare oder Steuerelemente
eines Formulars (einschließlich Menüs) aufgelistet werden.

DataBase
Diese Eigenschaft legt die Datenbank fest, die in Verbindung mit dem Daten-
steuerelement verarbeitet werden soll.

DataBaseName
Diese Eigenschaft legt Name und Suchpfad der Datenbank für das Datensteuere-
lement fest. Bei dBase-Dateien muß hier ein Unterverzeichnis angegeben werden,
in dem sich alle Daten- und Indexdateien befinden.

DataChanged
Diese Eigenschaft zeigt an, daß die Daten, die in Verbindung mit dem Daten-
steuerelement bearbeitet werden, geändert wurden (True) oder mit dem ur-
sprünglichen Datensatz übereinstimmen (False).

DataField
Diese Eigenschaft verbindet ein Visual Basic-Steuerelement mit einem Datenfeld
einer bestimmten Tabelle einer Datenbank.

DataSource
Diese Eigenschaft verbindet ein Bezeichnungs- oder Textfeld, das zur Ausgabe
und Bearbeitung von Datenbankdaten eingesetzt wird, mit einem "DataControl"-
Kontrollelement.

DrawStyle
Bestimmt das Aussehen von Linien bei grafischen Objekten, also etwa ob Linien
gestrichelt oder gepunktet oder transparent (nicht sichtbar) gezeichnet werden.

Seite 79 von 94
DrawWidth
Mit dieser Eigenschaft läßt sich die Liniendicke bei grafischen Objekten und
Formular-Rahmen einstellen.
Enabled
Setzt man diese Eigenschaft bei einem Steuerelement False, dann kann der Be-
nutzer während der Laufzeit nicht auf das Steuerelement zugreifen, dieses dient
dann also nur der Anzeige.

FillColor
Hiermit kann man die Farbe festsetzen, mit welcher grafische Objekte (Kreis,
Viereck) gefüllt werden.

FillStyle
Mit dieser Eigenschaft können verschiedene Füllmuster für grafische Objekte
bestimmt werden.

FontBold
Bestimmt, ob die Textattribute für den Text eines Controls entsprechend den Ei-
genschaften FontItalic, FontStrikeThru, FontUnderline gesetzt werden FontBold
= True) oder nicht (FontBold = False).

FontItalic
Falls diese Eigenschaft True gesetzt wird, wird dem Steuerelement zugehöriger
Text kursiv ausgegeben.

FontName
Hier läßt sich die gewünschte Schriftart für den Text des Steuerelements einstel-
len.

FontSize
Diese Eigenschaft bestimmt die Schriftgröße der mit "FontName" ausgewählten
Schrift.

FontStrikeThru
Falls diese Eigenschaft True gesetzt ist, wird dem Steuerelement zugehöriger Text
durchgestrichen ausgegeben.

FontTransparent
Ist diese Eigenschaft True sieht man den Hintergrund der Schrift (etwa grafische
Objekte) zwischen den Buchstaben hindurch, ist sie False, überdecken die ein-
zelnen Buchstaben den Hintergrund.

Seite 80 von 94
FontUnderline
Falls diese Eigenschaft True gesetzt wird, wird dem Steuerelement zugehöriger
Text unterstrichen ausgegeben.

ForeColor
Bestimmt die Farbe, mit der Linien und Text in einem Steuerelement ausgegeben
werden.

Heigt/Height
Diese Eigenschaft bestimmt die Höhe eines Controls in Pixel.

Icon
Hier wird der Name eines Icons eingetragen, das ausgegeben wird, wenn ein
Formular während der Laufzeit minimiert wird.

KeyPreview
Bestimmt wie mit den Tastaturereignissen (KeyPressed, KeyDown, KeyUp) ver-
fahren werden soll. Ist KeyPreview gleich True, dann werden alle Tastaturer-
eignisse zuerst an das Formular gegeben, bevor sie an das aktuelle Kontrollele-
ment weitergeleitet werden. Ist KeyPreview False, gelangen die Tastaturereignis-
se sofort zum aktuellen Steuerelement.

Left
Gibt den Abstand der linken Ecke eines Controls zum linken Rand seines Eltern-
Controls oder -Formulars, also seines übergeordneten Controls, an.

MaxButton
Diese Eigenschaft bestimmt, ob eine Maximize-Box (Vollbildschaltfläche) in der
rechten oberen Ecke eines Fensters angezeigt werden soll (MaxButton = True)
oder nicht (MaxButton = False).

MinButton
Diese Eigenschaft bestimmt, ob eine Minimize-Box (Symbolschaltfläche) in der
rechten oberen Ecke eines Fensters angezeigt werden soll (MinButton = True)
oder nicht (MinButton = False).

Seite 81 von 94
Name
Legt den Namen für eine Form oder ein Steuerelement fest, unter dem das Steu-
erelement im Quelltext angesprochen wird.

Value
Setzt oder ermittelt den aktuellen Status eines Controls.
Visible
Legt fest, ob ein Formular oder ein Steuerelement auf dem Bildschirm sichtbar ist
(True) oder nicht (False).

Width
Diese Eigenschaft bestimmt die Breite eines Steuerelements in Pixel.

Die wichtigsten Ereignisse

Activate
Tritt ein, wenn ein Formular zum aktiven Fenster wird.
Change
Tritt ein, wenn sich der Inhalt eines Steuerelements änderte.
Click
Tritt ein, wenn der Benutzer über einem Objekt eine Maustaste drückt.
DblClick
Tritt ein, wenn der Benutzer über einem Objekt eine Maustaste doppelt drückt.
Deactivate
Tritt ein, bevor ein Formular "nicht aktuell" wird.
DragDrop
Tritt ein, wenn eine Drag-&-Drop-Aktion ausgeführt wurde.
DragOver
Tritt ein, wenn ein Objekt im Rahmen einer Drag-&-Drop-Aktion über ein ande-
res Objekt bewegt wird.
DropDown
Tritt ein, wenn das Listenfeld einer Combo Box herunterklappt.
Error
Tritt bei fehlerhaften Datenbank-Zugriffen ein, bei denen kein Visual Basic-Code
ausgeführt wurde.
GotFocus
Tritt ein, wenn ein Objekt etwa durch anklicken den Focus erhält.
KeyDown
Tritt ein, wenn ein Objekt den Focus hat und eine Taste gedrückt wird.
KeyPress
Tritt ein, wenn der Benutzer eine ANSI-Zeichen-Taste drückt.
KeyUp
Seite 82 von 94
Tritt ein wenn ein Objekt den Focus hat und eine Taste losgelassen wird.
LinkClose, LinkError, LinkExecute, LinkNotify, LinkOpen
Treten in Zusammenhang mit DDE-Anwendungen auf.
Load
Tritt ein, wenn ein Formular geladen wird.
LostFocus
Tritt ein, wenn ein Objekt den Focus verliert.
MouseDown
Tritt ein, wenn der Benutzer eine Maustaste drückt.
MouseMove
Tritt ein, wenn der Benutzer über einem Objekt die Maus bewegt.
MouseUp
Tritt ein, wenn der Benutzer eine Maustaste losläßt.
Paint
Tritt ein, wenn ein Fenster neugezeichnet werden muß.
QueryUnload
Tritt in allen Formen ein, wenn die zugehörige Applikation geschlossen wird,
auch wenn Windows beendet weden soll.
Reposition
Tritt ein, wenn ein anderer Datensatz in einem Recordset der aktuelle Datensatz
wird.
Resize
Tritt ein, wenn ein Formular das erste Mal auf den Bildschirm gebracht wird, oder
wenn sich die Größe eines Objekts ändert.
RowColChange
Tritt ein, wenn die aktuelle Zelle in einer Tabelle wechselt.
SelChange
Tritt ein, wenn der ausgewählte Bereich in einer Tabelle sich ändert.
Unload
Tritt ein wenn ein Formular geschlossen wird.
Validate
Tritt ein, wenn der aktuelle Datensatz wechselt, also wenn ein neuer Datensatz
zum aktuellen wird.

Seite 83 von 94
Anhang 3: Glossar

A
Abfrage Eine Abfrage liefert eine Auswahl von
Datensätzen aus einer oder mehreren ➔Tabellen,
die bestimmten Anforderungen entsprechen.
Access Key ➔Direktzugriffstaste
Aktueller Datensatz Der aktuelle Datensatz ist immer der ➔Datensatz,
auf den der ➔Datensatzzeiger gerichtet ist.
Applikation Unter einer Applikation versteht man allgemein
ein Anwendungsprogramm
Array Datenstruktur zur Bearbeitung größerer
Datenmengen mit gleichem Typ . In Basic etwa
6

mit folgender Variablenvereinbarung 'Dim


Zahlen(3) As Single', womit ein Array für Zahlen
vom Typ "Single" mit 4 Elementen (0-3) einge-
richtet wird. Arrays bezeichnet man auch als Vek-
toren oder Felder. Um aber einen Array nicht mit
einem Tabellen-➔Feld zu verwechseln wird in
dieser Arbeit immer von Array gesprochen.
B
Boolean Datentyp für Wahrheitswerte, kann entweder wahr
(true) oder falsch (false) sein.
C
Code siehe ➔Programmcode
Collection Eine Collection ist eine geordnete Menge oder
Liste von gleichwertigen ➔Objekten. So gibt es in
Visual Basic etwa die ➔Fields-Collection oder die
➔TableDefs-Collection.
Compiler Programm zum Übersetzen (Compilieren) von
➔Quelltext in eine ausführbare EXE-Datei.
Control siehe ➔Steuerelement
Copy-buffer siehe ➔Kopier-Puffer
Custom Control siehe ➔Steuerelement
D
Datenbank Eine Datenbank ist eine große Anzahl von Daten,
die in Tabellen aufbewahrt und von einem
Datenbankverwaltungssystem gemeinsam
verwaltet werden. 7

6
nach Irene Bauder, Jürgen Bär, Turbo Pascal für Windows, Das Kompendium, 1992, Markt & Technik Verlag,
Haar bei München, S. 56
7
nach Hans Robert Hansen, Wirtschaftsinformatik I, Einführung in die betriebliche Datenverarbeitung, 5.
Auflage 1987, Gustav Fischer Verlag, Stuttgart, S. 108
Seite 84 von 94
Datenbank-Engine Programm(-teil), das in Client/Server-
➔Datenbanken eingesetzt wird und dessen
Hauptaufgabe die Bearbeitung von Client-
Nachfragen ist. In Visual Basic wird dieselbe Da-
tenbank-Engine wie in MS Access verwendet.8
Datensatz Ein Datensatz ist ein Datenobjekt, das aus einem
oder mehreren Daten-➔Feldern besteht.9
Datensatzzeiger Gedachter Zeiger auf einen ➔Datensatz eines
➔Recordsets. Der Zeiger ist immer nur auf einen
Datensatz gerichtet, und es kann immer nur der
Datensatz bearbeitet werden, auf den der
Datensatzzeiger zeigt.
Default Ein Default (-Wert) ist immer der voreingestellte
Wert einer Variablen oder eines Parameters.
Direktzugriffstaste Taste oder Tastenkombination durch die sofort,
ohne das umständliche Anwählen von
➔Menüpunkten, bestimmte Programmfunktionen
aufgerufen werden können.
DLL "Dynamic Link Library"-Dateien sind
Bibliotheken mit Funktionen zur Windows-
Programmierung, die von Win-
dowsprogrammiersystemen genutzt werden
können, auch von Visual Basic.
Dynaset Ein Dynaset ist eine dynamische Kopie aus einer
oder mehreren ➔Tabellen nach Ausführung einer
➔Abfrage.
E
Editor Bei einem Editor handelt es sich um ein Programm
zur Bearbeitung eines Textes bzw. ➔Quelltextes.
Der Visual Basic-Editor ist in die
➔Entwicklungsumgebung integriert, arbeitet
prozedurorientiert und bietet die farbige Hervor-
hebung von Visual Basic-Anweisungen.
Eigenschaft (property) Eigenschaften bestimmen das Aussehen und das
Verhalten von ➔Objekten. Neben den
Farbeinstellungen legen Sie z.B.
➔Titelleistentexte oder Beschriftungen fest. Eine
Liste der Eigenschaften finden Sie in Anhang 2!

8
a.o.O. Pia Maslo,Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für Windows, S. 729
9
nach Hans Robert Hansen, Wirtschaftsinformatik I, a.o.O., S. 108
Seite 85 von 94
Entwicklungsumgebung Die Visual Basic-Entwicklungsoberfläche ist eine
integrierte Benutzeroberfläche, mit der VB-
Programme entwickelt werden können. Alle
Schritte der Programmerstellung werden von der
Oberfläche aus durchgeführt, vom Formulardesign
bis zum ➔Compilieren.
Ereignis Ein Ereignis wird durch den Benutzer (Mausklick,
Eingabe über die Tastatur), das System oder
➔Applikationen ausgelöst und ruft in Visual
Basic-Programmen automatisch die zugehörige
➔Ereignisprozedur auf.
Ereignisprozedur Eine Ereignisprozedur ist ein Unterprogramm, das
nach Eintreten eines ➔Ereignisses abgearbeitet
wird.
Event siehe ➔Ereignis
Extension die "Erweiterung" eines Dateinamens unter DOS,
bestehend aus drei Buchstaben durch einen Punkt
vom eigentlichen Dateinamen getrennt, also etwa
'.EXE' oder '.DBF'.
F
Feld Jede ➔Tabelle besteht aus mehreren Feldern,
welche die Spalten der Tabelle darstellen.
Fensterelement Elemente, aus denen ein Windowsfenster besteht,
wie ➔Titelleiste, ➔Systemmenüfeld, ➔Rahmen,
➔Vollbildschaltfläche und ➔Symbolschaltfläche
Field siehe ➔Feld
Fields ➔Collection der Felder einer Tabelle, für jede
Tabelle verfügbar.
Fokus (Focus) Das Fenster oder Steuerelement, das den Fokus
hat, ist immer das aktuelle ➔Objekt, das
Tastatureingaben erhält, mit dem gearbeitet
werden kann. So muß etwa ein Textfeld den Fokus
haben, damit man Eingaben machen kann.
Formular (Form) Programm- und Dialogfenster werden als Form
oder Formular bezeichnet. In ein Formular können
➔Steuerelemente plaziert und ein ➔Menü
aufgenommen werden.
Funktion (function) Funktionen sind besondere ➔Unterprogramme,
die einen Funktionswert nach ihrem Ablauf
zurückliefern.

Seite 86 von 94
I
Icon Ein Icon ist ein kleines Bildsymbol für Programme
oder Formulare unter Windows, das etwa im
Programmmanager angezeigt wird.
Beispiel: Das Icon des Programmmanagers von
Windows:

Index Indexe werden verwendet, um ➔Tabellen nach


einem oder mehreren Schlüssel-Feldern zu
sortieren. Dazu verkürzen sie außerdem die Suche
nach einzelnen Datensätzen.
INI-Datei Eine INI-Datei ist eine Initialisierungsdatei unter
Windows. Viele Programme verwenden solche
Dateien, um Treiber oder benutzerdefinierte
Einstellungen zu speichern.
Instanz Instanzen sind die Variablenvereinbarungen eines
Objekts, es gibt immer nur ein Objekt eines
bestimmten Typs, zu dem es aber viele Instanzen
geben kann.
Interpreter Ein Interpreter dient ebenso wie ein ➔Compiler
der Übersetzung von ➔Quelltext, nur wird bei
einem Interpreter keine ausführbare EXE-Datei
erzeugt, vielmehr wird der ➔Programmcode
zeilenweise abgearbeitet (interpretiert).
K
Kopier-Puffer Dies ist ein Speicherbereich, in dem immer der
➔Datensatz eines ➔Recordsets steht, der
bearbeitet werden kann.
Kontrollelement siehe ➔Steuerelement
M
Meldung (message) oft für ➔Ereignis
Menü Ein Menü ist eine Liste möglicher Kommandos
bzw. Eingaben eines Programms, die am
Bildschirm angeboten werden.10
Methode (method) Methoden sind spezielle Prozeduren oder
Funktionen, die für bestimmte ➔Objekte definiert
sind und ausschließlich in Verbindung mit diesen
einsetzbar sind.

10
nach Hans Robert Hansen, Wirtschaftsinformatik I, a.o.O., S. 253
Seite 87 von 94
O
Objekt Zu den Objekten zählen ➔Formulare und
➔Steuerelemente, dazu auch ➔Datenbanken,
➔Tabellen und ➔Abfragen, sowie spezielle
Objekte, wie etwa u.a. der Drucker (Printer) oder
der Bildschirm (Screen).
Für jedes Objekt können verschiedene
➔Eigenschaften, ➔Methoden und ➔Ereignisse
definiert sein.
Objektvariable Eine Variable die ein Visual Basic bekanntes
➔Objekt repräsentiert, also eine ➔Instanz eines
Objekts.
ODBC "Open Database Connectivity", also etwa "offene
Datenbank-Verbindungen". ODBC ist ein
Industriestandard zum Bearbeiten beliebiger
➔Datenbanken über eine einheitliche
11
Befehlssyntax .
ODBC-Treiber (-Driver) Ein ➔ODBC-Treiber ist eine ➔DLL, die ODBC-
Funktionsaufrufe ausführt und Datenquellen
beeinflußt.
P
Primärschlüssel Durch den Primärschlüssel ist jeder ➔Datensatz
(PrimaryKey) einer ➔Tabelle eindeutig auffindbar. In einem
➔Index über den Primärschlüssel darf kein
Schlüsselfeld doppelt auftreten.
Programmcode Unter Programmcode versteht man den
geschriebenen Text eines Programms - also z.B.
Basic-Befehle - der für den Ablauf des Programms
dann entweder interpretiert oder compiliert wird
(➔Compiler,➔Interpreter).

Projekt Als Projekt bezeichnet man die ➔Form- und


➔Quelldateien, die zu einem Programm gehören.
Visual Basic verwaltet ein Projekt über das
Projektfenster. Die Dateien, die zu einem Projekt
gehören, werden in der Projektdatei
([Name].MAK) gespeichert.

Property (Eigenschaft) Siehe ➔Eigenschaft

11
a.o.O. Pia Maslo,Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für Windows, S. 727
Seite 88 von 94
Prozedur (Procedure) siehe ➔Unterprogramm

Q
Quellcode siehe ➔Programmcode
Quellmodul (Quelldatei) Ein Quellmodul enthält benutzerdefinierte
➔Funktionen und ➔Unterprogramme, die bei
Bedarf von allen ➔Formen und Quellmodulen aus
gestartet werden können. In Quellmodulen können
Sie zudem Variablen programmübergreifend als
global vereinbaren.
Query siehe ➔Abfrage
QueryDef Visual Basic-Objekt, welches vor allem den SQL-
Ausdruck beinhaltet, der eine Abfrage definiert.
R
Rahmen Mit Hilfe des Rahmens werden Fenster in ihrer
Größe geändert. Über dem Rahmen nimmt der
Mauscursor die Form eines Doppelpfeils an.
Ziehen Sie dann bei gedrückter linker Maustaste
den Rahmen auf die gewünschte Größe.

RecordSet Ein Recordset ist allgemein eine Gruppe von


➔Datensätzen. Die drei Typen von Recordsets
unter Visual-Basic sind ➔Dynaset, ➔Snapshot
und ➔Table.
S
Snapshot Ein Snapshot ist eine statische Kopie aus einer
oder mehreren ➔Tabellen nach Ausführung einer
➔Abfrage.
SQL "Structured Query Language" ist eine
standardisierte Abfragesprache für
➔Datenbanken. Die meisten Datenbank-
Entwicklungssysteme erlauben heute Abfragen
mit SQL.
Steuerelement Bei Steuerelementen handelt es sich um
Oberflächenelemente, die aus der ➔Toolbox der
Visual Basic-Entwicklungsumgebung entnommen
und in ein ➔Formular plaziert werden.
Steuerelemente sind z.B. Textfelder, Listenfelder
oder Aktionsschaltflächen.
Sub siehe ➔Unterprogramm
Seite 89 von 94
Symbolschaltfläche

Durch einen Klick auf die


Symbolschaltfläche verkleinern Sie das Fenster zu
einem Bildsymbol (➔Icon), das am unteren Rand
des Bildschirms angeordnet wird.12
Syntax Formaler Aufbau der Elemente einer
Programmiersprache sowie die Gesamtheit der
Regeln, nach denen die Programmiersprache zu
benutzen ist.13
Systemmenüfeld

Es befindet sich in der linken oberen


Ecke eines Fensters. Durch einen Mausklick auf
dieses Feld oder die Tastenkombination 'Alt' und '-
' öffnen Sie das Systemmenü. Durch einen
Doppelklick auf das Systemmenüfeld schließen
Sie ein Fenster.14
T
Tabelle (Table) Tabellen enthalten in einer ➔Datenbank die
eigentlichen Daten. Sie bestehen aus Datensätzen
(Zeilen) und Feldern (Spalten).
Eine Datenbank kann mehrere Tabellen
beinhalten.
TableDef Eine TableDef ist ein ➔Objekt, das die Struktur
einer ➔Tabelle definiert, und das für jede Tabelle
einer ➔Datenbank vorhanden ist.
TableDefs Ist eine ➔Collection von TableDef-Objekten. In
jeder ➔Datenbank sind in der zugehörigen
TableDefs-Collection die TableDef-Objekte zu
jeder ➔Tabelle der Datenbank enthalten.
Titelleiste Jedes Fenster besitzt eine Titelleiste, in welcher
der Titel des Fensters steht, und die im aktiven
Fenster hervorgehoben ist. Der Titel ist in Visual
Basic durch die "Caption"-➔Eigenschaft eines
Formulars bestimmt.
Toolbar Eine Toolbar ist eine ➔Toolbox in Form eines
Balkens, meist unter der ➔Menüzeile eines
Fensters plaziert.

12
nach Irene Bauder, Jürgen Bär, Turbo Pascal für Windows, S. 133
13
Steiner Franz-Josef, Manfred Czerwinski, Turbo Pascal Lexikon: Von A bis Z, 1989, Markt & Technik-
Verlag, Haar bei München, S. 441
14
nach Irene Bauder, Jürgen Bär, Turbo Pascal für Windows, S. 133
Seite 90 von 94
Toolbox In einer Toolbox sind bildlich dargestellte Tasten
zusammengefasst, mit denen auf wichtige
Funktionen eines Programms schnell zugegriffen
werden kann.
U
Unterprogramm Unterprogramme (bzw. Prozeduren) sind in sich
abgeschlossene Programmteile, die durch eine
einzelne Anweisung an anderen Stellen eines
Programms aufgerufen und abgearbeitet werden
können.
V
VBX-Datei Dies sind sogenannte Steuerelement-Dateien
(eigentlich besondere ➔DLL-Dateien), mit denen
zusätzliche ➔Steuerelemente zu den
standardmäßig in Visual Basic enthaltenen zur
Verfügung gestellt werden. Um solche Steuer-
elemente zu nutzen, muß die zugehörige VBX-
Datei über das Projektfenster in das ➔Projekt ein-
gebunden werden.
Vollbildschaltfläche

Durch einen Mausklick auf die


Vollbildschaltfläche vergrößern Sie ein Fenster
auf den gesamten Bildschirm. Die Schaltfläche
zeigt dann einen Doppelpfeil, der dem
Zurücksetzen auf die ursprüngliche Größe dient.15

15
nach Irene Bauder, Jürgen Bär, Turbo Pascal für Windows, S. 133
Seite 91 von 94
Anhang 4: Abbildungs- und Literaturverzeichnis

Abbildungsverzeichnis
Abb. 1. Die Programmoberfläche von Visual Basic
Abb. 2. Das Menüfenster
Abb. 3. Das Entwurfsformular
Abb. 4. Beispiele für typische Windows-Steuerelemente
Abb. 5. Das Toolbox-Fenster
Abb. 6. Aktionsschalter mit unterschiedlichen Eigenschaften
Abb. 7. Das Properties- oder Eigenschaftsfenster
Abb. 8. Verändern der "Caption"-Eigenschaft im Properties-Fenster
Abb. 9. Editorfenster zum Eingeben von Basic-Quellcode
Abb. 10. Das Entwurfsformular für das Beispiel
Abb. 11. Ein markiertes Steuerelement
Abb. 12. Ein Aktionsschalter und die zugehörige Taste aus dem Toolbox-
Fenster
Abb. 13. Ein Textfeld und die zugehörige Taste aus dem Toolbox-Fenster
Abb. 14. Mehrzeiliges Textfeld mit horizontaler und vertikaler Bildlaufleiste
Abb. 15. Ein markiertes Bezeichnungsfeld und die zugehörige Taste aus dem16
Toolbox-Fenster
Abb. 16. Mit diesem Menüpunkt wird ein neues Projekt angelegt
Abb. 17. Das Entwurfsformular für das Beispiel zum Bezeichnungsfeld
Abb. 18. Der Quelltext für die Taste Ändern
Abb. 19. Das Speichern-unter-Dialogfeld von Visual Basic
Abb. 20. Ein Listenfeld und die zugehörige Taste aus dem Toolboxfenster
Abb. 21. Listenfeld mit columns = 2 und columns = 3
Abb. 22. Das Entwurfsformular des Beispiels zum Listenfeld
Abb. 23. Das Entwurfsformular des Beispiels zu Schaltfelder
Abb. 24. Das Entwurfsformular zum Alkomat mit Namen der Controls
Abb. 25. Wechseln in den "General"-Bereich des Quelltextes
Abb. 26. Erweitertes Formular für das Alkomat-Beispiel
Abb. 27. Bildschirmanzeige des Data Controls und die zugehörige Taste aus
dem Toolbox-Fenster
Abb. 28. Das Kombinationslistenfeld der "RecordSource"-Eigenschaft
Abb. 29. Das Entwurfsformular für das Beispiel zum Data Control
Abb. 30. Das Formular zum Beispiel "Durchgehen einer Tabelle"
Abb. 31. Das Entwurfsformular für das Beispiel zur Tabellenbearbeitung
Abb. 32. Das Fenster zum Anlegen neuer Prozeduren
Abb. 33. Das Formular für das Beispiel zu Abfragen
Abb. 34. Formular zum Beispiel über Gruppenbearbeitung

Seite 92 von 94
Literaturverzeichnis
Hilfe-Dateien zu Microsoft Visual Basic Version 3.0, Copyright © 1987-1993
Microsoft Corporation

Dr. Pia Maslo, Stefan Dittrich, Das große Buch zu Visual Basic 3.0 für
Windows, 1. Auflage 1993, DATA BECKER GmbH, Düsseldorf

Irene Bauder, Jürgen Bär, Turbo Pascal für Windows, Das Kompendium, 1992,
Markt & Technik Verlag, Haar bei München

Hans Robert Hansen, Wirtschaftsinformatik I, Einführung in die betriebliche


Datenverarbeitung, 5. Auflage 1987, Gustav Fischer Verlag, Stuttgart

Steiner Franz-Josef, Manfred Czerwinski, Turbo Pascal Lexikon: Von A bis Z,


1989, Markt & Technik-Verlag, Haar bei München

Seite 93 von 94
Seite 94 von 94