2.8 Ereignisgesteuerte Programmierung
Damit wäre die Erstellung der Form abgeschlossen. Nun geht es an die eigentliche Programmierung.
Dazu einige Vorbemerkungen:
1 Alle Visual Basic-Programme bestehen aus abgetrennten Programmteilen = Unterprogrammen. Man unterscheidet Prozeduren (Sub) und Funktionen (Function).
2 Ereignisgesteuerte Programmierung: Jede Prozedur beginnt mit dem Wort Sub und endet mit End Sub. Nach dem Wort Sub steht der Name der Prozedur. Dieser Name ist bei Ereignisprozeduren nicht frei wählbar, sondern besteht aus dem Namen des Objekts und dem Namen der Aktion (des Ereignisses = Events), bei der das Unterprogramm ausgelöst werden soll. Bei Prozeduren, die nicht von einem Ereignis abhängen, sondern anders (etwa durch Aufruf in einer anderen Prozedur) gestartet werden, ist der Name frei wählbar.
Zuerst programmieren wir den Schalter “Abbrechen”: Die Prozedur muß daher heißen “Private Sub CmdAbbrechen_Click()”. Hier soll das Programm beendet werden. Das geschieht mit dem Befehl Unload.
(Übrigens: Kommentare beginnen in VB mit einem einfachen Apostroph-Zeichen ‘).
Private Sub CmdAbbrechen_Click () ‘ Was passiert bei Anklicken der ‘ “Abbrechen“-Taste Unload MWSt End Sub
Mit der Anweisung Unload wird die Startform entladen, das heißt, sie wird aus dem Arbeitsspeicher entfernt. Statt des Namens der Form kann in diesem Fall auch
Unload Me
stehen, wobei Me für die aktuelle Form steht.
Mit dem Pulldown-Menü Ausführen – Starten kann das Programm gestartet werden.
Probieren Sie aus, ob die ABBRECHEN-Taste funktioniert!
Eine der wichtigsten Ereignisprozeduren ist FORM_LOAD. Dieses wird immer dann aufgerufen, wenn die Form geladen wird – also beim Programmstart!
In diesem Fall soll dieses Programm eine andere Ereignisprozedur auslösen, die den Sinn hat, die Bildlaufleiste immer zu aktualisieren. Dies sieht dann so aus:
Dabei haben wir noch nicht festgestellt, was das “Aktualisieren” der Bildlaufleisten eigentlich bewirken soll. Die Prozedur ScrMehrwertsteuer_Change wird also noch zu programmieren sein.
Unter “Aktualisieren” versteht man, daß das Programm auf jede Veränderung der Bildlaufleiste entsprechend reagieren soll. In unserem Fall soll sich die Bezeichnung unter der Bildlaufleiste ändern.
Wir weisen daher der Eigenschaft Caption des Bezeichnungsfeldes unter der Bildlaufleiste den Wert der Bildlaufleiste zu:
BezMehrwertsteuer.Caption = ScrMehrwertsteuer.Value & “ %“
“Value” war offenbar mit der Bildlaufleiste fest verbunden. Eine derartige “Eigenschaft” wird vom Objektnamen durch einen Punkt getrennt. Durch das Verkettungszeichen “&“ wird an den Wert noch das “%”-Zeichen angehängt, weil wir ja möchten, daß als Beschriftung z.B. “37 %” erscheint.
Schließlich muß eine erneute Berechnung erfolgen, da sich der Prozentwert ja geändert hat. Für die Berechnung benötigen wir allerdings eine neue Prozedur, die wir Private Sub Neuberechnung() nennen wollen.
Völlig neue Prozeduren – wie unsere Berechnungsprozedur Neuberechnung – können nur mit Einfügen – Prozedur (Insert – Procedure) erstellt werden. Diese Vorgangsweise werden wir bei der eigentlichen Berechnung des Endbetrages anwenden.
Bei dieser Prozedur müssen wir das Problem lösen, wie wir aus den Eingabeobjekten (der Bildlaufleiste für die Mehrwertsteuer und dem Textfeld für den Betrag) die eigentlichen Zahlenwerte “herauskitzeln“.
Für den Wert einer Bildlaufleiste kennen wir schon die Eigenschaft Value, die wir einer Variable mwstsatz zuweisen können:
mwstsatz = ScrMehrwertsteuer.Value
Für die Eingabe des Betrags wurde ein Textfeld verwendet. (Es ist nicht sehr sinnvoll, den Grundbetrag durch eine Bildlaufleiste einzuschränken. Außerdem können durch Bildlaufleisten nur schwer “Groschenbeträge” eingegeben werden.)
Die Eigenschaft Text beinhaltet als Wert zwar den eingegebenen Text, allerdings als String. Die Funktion Val() wandelt eine Zeichenkette (String) in eine Zahl um:
nettobetrag = Val(EinNettobetrag.Text)
Somit können wir – die mathematische Formel für Prozentrechnung vorausgesetzt – die Prozedur Neuberechnung entwerfen:
Private Sub Neuberechnung() Dim nettobetrag As Single Dim mwstsatz As Single Dim steuer As Single Dim erg nettobetrag = Val(EinNettobetrag.Text) mwstsatz = ScrMehrwertsteuer.Value steuer = nettobetrag * mwstsatz / 100 erg = “ERGEBNIS: “ & Str$(steuer) & “ öS“ BezErgebnis.Caption = erg End Sub
Die Funktion Str$() wandelt eine Zahl in eine Zeichenkette (string) um.
Formatierte Ausgabe: Oft ist eine Ausgabe wie “2.3859234E-2" nicht sehr übersichtlich. Um eine genormte Ausgabe (etwa: 2 Kommastellen, Tausender-Trennzeichen) zu erreichen, kann man die Funktion Format$ verwenden.
Beispiel:
MsgBox “Ergebnis:“ & Format$(erg, “#,##0.00")
Der zweite Parameter in der Funktion Format$ ist der “Format-String“, Dabei steht ein “#“ für ein Zeichen, das bei Bedarf (bzw. Vorhandensein) angezeigt wird, eine “0" für eine Stelle, die immer angezeigt werden muß.
Beispiele für das verwendete Format “#,##0.00":
12,3452542 angezeigt als 12,34
19342,1 angezeigt als 19.342,10
0,1234 angezeigt
als 0,12
Wir haben auch noch die beiden Pulldown-Menüpunkte “Ende” und “Hilfe”. Den Menüpunkt Ende können wir ganz einfach behandeln:
Private Sub menEnde_Click () Unload MWSt End Sub
Damit wird das Programm beendet.
Beim Menüpunkt “Hilfe” soll ein ganz einfacher Hilfetext erscheinen. Das realisiert man am einfachsten mit der bereits bekannten Message-Box.
Möchte man mehrere Ausgabezeilen in der Messagebox erreichen, so kombiniert man Texte mit Zeilenschaltungen.
In Windows wird für die Behandlung von Zeichen die sogenannte ANSI-Code-Tabelle verwendet (siehe Anhang B!). Diese besteht aus 256 Zahlen, von denen jede Zahl für ein darstellbares Zeichen steht.
Die Werte 08, 09, 10 und 13 stehen nicht für Zeichen, sondern verändern die Ausgabe:
08 |
BS |
back space |
Rückwärtsschritt und Zeichen löschen |
09 |
HT |
horizontal tab |
waagrechter Tabulatorsprung |
10 |
LF |
line feed |
Zeilenvorschub |
13 |
CR |
carriage return |
Wagenrücklauf |
Es ist daher sinnvoll, eine Variable NZ$ (für “neue Zeile”) zu definieren, die aus Zeilenvorschub und Wagenrücklauf besteht. Für spezielle ANSI-Zeichen gibt es dafür die Funkion Chr$(). Das sieht dann etwa so aus:
Private Sub menHilfe_Click () NZ$ = Chr$(13) + Chr$(10) Msg$ = “Hilfe wollen Sie?“ + NZ$ Msg$ = Msg$ + “Aber doch nicht wirklich!“ Msg$ = Msg$ + NZ$ + NZ$ Msg$ = Msg$ + “Um fortzufahren, klicken“ Msg$ = Msg$ + “Sie auf OK ...“ MsgBox Msg$ End Sub
Ergebnis
Eine bessere Möglichkeit besteht darin, die vordefinierte Konstante vbCrLf zu verwendet, die als
vbCrLf = Chr$(13) + Chr$(10)
definiert ist.
Das obige Programm lautet dann:
Private Sub menHilfe_Click () Msg$ = “Hilfe wollen Sie?“ + vbCrLf + “Aber doch nicht wirklich!“ Msg$ = Msg$ + + vbCrLf + vbCrLf Msg$ = Msg$ + “Um fortzufahren, klicken Sie auf OK ...“ MsgBox Msg$ End Sub
Festlegen der Aktivierreihenfolge mit dem Tabulator-Index
Durch Betätigen der «TAB»-Taste springt der Cursor (im englischen Original übrigens “Caret“ genannt) zum nächsten aktivierbaren Feld.
Angenommen, es gibt mehrere Textfelder zur Eingabe. Dann möchte man natürlich, daß der Cursor beim Programmstart auf dem 1. Textfeld steht; weiter geht es mit der «TAB»-Taste. Dazu benützt man die Eigenschaft “TabIndex”: in der Reihenfolge ihres Anwählens mit «TAB» sollen die Steuerelemente mit 0, 1, 2 usw. durchnumeriert werden.
Rechtsbündige Textfelder: Sind nur möglich, wenn man die Eigenschaft MultiLine auf True setzt. Diese Eigenschaft erlaubt mehrzeilige Eingaben.
Möchte man beim Programmstart bestimmte Elemente nicht sehen, so setzt man die Eigenschaft Visible auf False.