Währungsrechner
- Das Projekt soll die Arbeit mit mehr als einem Fenster demonstrieren. Warum hier zwei Fenster nötig sind, wird später klar.
Wozu man einen Währungsrechner braucht? Wer weiß? Vielleicht müssen wir demnächst Euro in 'Mark der DDR' umrechnen? - Es werden Steuerelementefelder genutzt. Das Programm läßt sich deshalb ohne größeren Aufwand um beliebig viele weitere Währungen erweitern.
- Die Eingaben in die Textboxen werden so überwacht, daß Fehleingaben sicher verhindert werden.
- Um Variable zu definieren, die von beiden Formularen verwendet werden können, muß ein Modul eingefügt werden. Auf ihm startet dann auch das Programm.
Zunächst ein Blick auf den Projektexplorer: 
Es folgt zunächst der Code zu Module1:
Option Explicit Global E_Wert As Currency, Eu_Geld(3) As Currency Sub Main()Form2.Show End Sub Function PrüfeZeichen(Prüfling As Integer, vorhTxt As String) As Integer Dim erlaubt As StringIf Not (Prüfling = 8) Then '8 ist Backspace zum Korrigieren erlaubt = "0123456789" If Len(vorhTxt)> 0 Then erlaubt = ",0123456789" If InStr(vorhTxt, ",") Then erlaubt = "0123456789" If InStr(erlaubt, Chr(Prüfling)) = 0 Then PrüfeZeichen = 0 Exit Function 'Prüfling war unzulässig! End If End If PrüfeZeichen = Prüfling 'Prüfling ist zulässig! End Function |
Erläuterungen:
- Als Basis aller Umrechnungen wird der Geldwert in Euro gewählt, er erhält deshalb eine eigene Variable "E_Wert", der Typ ist Currency, weil es um Geld geht.
- Das Array EU-Geld() soll die Faktoren enthalten, mit denen man den Euro multiplizieren muß, damit die Währung "Nummer von Index" herauskommt.
- Sub Main() startet das Programm mit dem Aufruf eines später noch anzulegenden Fensters.
- Die Funktion "PrüfeZeichen" wird von beiden Formularen aus genutzt, um die Zulässigkeit von Zeicheneingaben zu testen.
Das eigentliche Rechenfenster ist "Form1":

Option Explicit Dim Eingabe As Integer Private Sub Text1_GotFocus(Index As Integer)Text1(Index).Text = "" Eingabe = Index End Sub Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)KeyAscii = Module1.PrüfeZeichen(KeyAscii, Text1(Index).Text) End Sub Private Sub Text1_Change(Index As Integer) Dim i As IntegerIf Index = Eingabe And Text1(Index).Text <> "" Then E_Wert = CCur(Text1(Index).Text) / Eu_Geld(Index) For i = 0 To 3 If i <> Index Then Text1(i).Text = Format$(E_Wert * Eu_Geld(i), "fixed") Next End If End Sub |
Erläuterungen:
- Das Fenster besitzt außer den Textboxen und den üblichen Möglichkeiten eines Windowsfensters kein Bedienelement. Das ist Absicht. Es kann sogar noch weiter "verschlankt" werden, so daß es später möglichst wenig stört:

- Bei den Textboxen handelt es sich um ein Steuerelementefeld. (Zur Erinnerung: Textbox einfügen, Namen unverändert lassen, also "Text1", kopieren, wieder einfügen, Frage: "Ein Steuerelement hat bereits den Namen 'Text1'. Wollen Sie ein Steuerelementefeld erstellen?" bejahen, weiter einfügen, bis die Zahl erreicht ist.)
- Wenn man den Code für dieses Fenster schreibt, beachte man, daß die Prozedurköpfe (und End Sub-Einträge) netterweise vom Editor erzeugt werden, indem man (schwerer zu beschreiben, als zu zeigen) etwa so auf das gewünschte Ereignis klickt:

- Die Arbeit mit diesem "Rechner" geschieht so, daß man die bekannte Summe in das gewünschte Textfeld schreibt. Alle anderen Werte werden sogleich errechnet und angezeigt.
- Wenn die Maus auf ein Textfeld klickt (Sub Text1_GotFocus()) erhält es den "Focus", wird gelöscht und merkt sich seine Nummer (Variable Eingabe).
- Immer wenn eine Taste gedrückt wird (Sub Text1_KeyPress()) werden Tastendrücke auf Zulässigkeit geprüft.
- Die Textveränderung, die eintritt, wenn ein neues Zeichen akzeptiert ist, führt zur Errechnung der übrigen Wertangaben und zu ihrer Neuanzeige.
- Da die Wechselkurse täglich wechseln, muß es eine Möglichkeit geben, vor Beginn der Arbeit die am laufenden Arbeitstag gültigen Kurse einzugeben. Dazu dient ein zweites Formular "Form2". Brächte man diese Eingabemöglichkeiten mit auf dem ersten Formular unter, dann bestünde die Gefahr, daß falsche Textboxen beschrieben werden und die Übersichtlichkeit wäre dahin. Um Verwechslungen zu vermeiden, erhält dieses zweite Formular auch eine andere Farbe.
- Professionell wäre es, die Wechselkurse aus dem Internet zu laden und den Nutzer nicht mit diesen Eingaben zu behelligen. Aber das ginge hier (programmtechnisch) zu weit!
Wie geht's weiter? Über das Menü "Projekt" wähle man "Formular hinzufügen". In dieses Formular gehört außer den (hier) zwei Textfeldern ein Button. Den sollte man zuerst einfügen. (Für Fortgeschrittene: Er erhält dadurch den ersten Focus, mit "Return" kann man das Fenster direkt wegklicken, was mindestens zum Testen günstig ist. Besitzt eines der Textfelder beim Laden des Fensters den Focus, dann wird beim Fensteraufbau das GotFocus-Ereignis ausgelöst und das Feld startet leer.)
Ein besonderer Trick ist bei den beiden Textfeldern nötig. Sie sollen, damit der Code einfacher wird, ein Steuerelementefeld bilden und zweites Problem, die Nummern zwei und drei tragen. Man kann vier Textfelder (Nummern 0 bis 3) einfügen, anschließend die ersten beiden löschen. Alternativ können gleich nur zwei Textfelder eingefügt werden, dann im Eigenschaftsfenster über die Eigenschaft "Index" auf 2 und 3 gesetzt werden.

Option Explicit Private Sub Form_Load()Label1.Caption = "Kurse vom " & Format$(Now, "short date") Eu_Geld(0) = 1 Eu_Geld(1) = 1.95583 Eu_Geld(2) = 0.83 'Defaultwerte Eu_Geld(3) = 1.22 Text1(2).Text = CStr(Eu_Geld(2)) Text1(3).Text = CStr(Eu_Geld(3)) End Sub Private Sub Text1_GotFocus(Index As Integer)Text1(Index).Text = "" End Sub Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)KeyAscii = Module1.PrüfeZeichen(KeyAscii, Text1(Index).Text) End Sub Private Sub Command1_Click() Dim i As IntegerFor i = 2 To 3 If Text1(i).Text = "" Then MsgBox "Bitte die Einträge ergänzen!" Exit Sub Else Eu_Geld(i) = CCur(Text1(i).Text) Endif Next Form2.Hide Form1.Show End Sub |
Erläuterungen:
- Die ersten beiden Faktoren Eu_Geld() verstehen sich von selbst und liegen fest. Für weitere empfehlen sich Default-Werte, damit das Fenster bei schnellem Übergehen nicht eine Fehlermeldung produziert.
- Sub Text1_GotFocus() sorgt wieder für Löschung des Eintrags, wenn das Textfeld angeklickt wird. Ebenfalls wie bei Form1 wird auf Tastendruck die Zulässigkeit des Zeichens geprüft.
- Erst wenn der Button Command1 geklickt wird und wenn beide Eingabefelder eine Eingabe enthalten, werden die Einträge ausgelesen und die Fenster gewechselt.
Zum Schluß noch eine Kleinigkeit: Das Programm soll mit dem Modul starten. Denn immerhin muß es die globalen Variablen lernen, danach die Routine "Main()" starten. Das muß dem Projekt erst beigebracht werden. Im Menü "Projekt" den untersten Punkt "Eigenschaften von Projekt1..." wählen. Auf der Registerkarte wählt man, wie im Bild zu sehen:

© R. Hirte * 2001/2004