Animation: Digitaluhr
Diese kleine Fallstudie zeichnet sich durch folgende Eigenschaften aus:
- Es wird ein reines Formular-UI benutzt. Das Formular wird beim Öffnen der Arbeitsmappe automatisch geöffnet.
- Es handelt sich um eine 2-Schichten-Anwendung, bestehend aus einer Schicht für das UI und einer Schicht für die Programmlogik.
- Die Anwendung macht Gebrauch von Animation.
Beim Öffnen der Arbeitsmappe wird ein Formular gezeigt, das mit zwei Schaltflächen ausgestattet ist, die erste zum Starten der Zeitanzeige, die zweite zu ihrem Beenden und zum Schließen des Fensters. Die Animation besteht daraus, dass der Betrachter die Veränderung der Uhrenziffern verfolgen kann. Das folgende Bild zeigt das Formular nach dem Starten:

Das Formularmodul ZeitForm enthält das gesamte UI. Es enthält eine globale Variable abbrechen vom Typ Boolean, deren aktueller Wert in der Ereignisprozedur StartBtn_Click als Signal zum Beenden bzw. Weiterführen der Zeitanzeige benutzt wird. Diese Variable wird anfangs auf FALSE gesetzt und beim Anklicken der Schaltfläche schließen auf TRUE abgeändert. Das Schließen des Formulars über die Standard-Schaltfläche in der rechten oberen Ecke ist unterbunden, damit mit dem Schließen auch die periodische Zeitermittlung beendet werden kann.
Von den drei angezeigten Zeiten wird die Berlin-Zeit direkt aus einem Aufruf der VBA-Funktion Now abgeleitet. Die beiden anderen Zeiten werden aus dem von Now gelieferten Wert durch Aufrufe von Umrechnungsfunktionen ermittelt, die im Modul Zeitexperte der zweiten Schicht enthalten sind.
Damit der Benutzer die Zeitanzeigen und ihre Veränderungen auch sieht, müssen diese verzögert werden. Dies geschieht mit Hilfe der Prozedur verzoegern, welche den Rechner für die gewünschte Verzögerungszeit anderweitig beschäftigt.
Dim abbrechen As Boolean
'füllt die Textfelder mit den Uhrzeiten in den 3 Städten
'==========================================
Private Sub ZeitSetzen()
Me.BStunden.Text = vornullen(CInt(Hour(Now)), 2)
Me.BMin.Text = vornullen(CInt(Minute(Now)), 2)
Me.BSek.Text = vornullen(CInt(Second(Now)), 2)
Me.NYSek.Text = vornullen(CInt(Me.BSek), 2)
Me.NYMin.Text = vornullen(CInt(Me.BMin), 2)
Me.NYStunden.Text = vornullen(Zeitexperte.BnachNY(CInt(Me.BStunden)), 2)
Me.TokSek.Text = vornullen(CInt(Me.BSek), 2)
Me.TokMin.Text = vornullen(CInt(Me.BMin), 2)
Me.TokStunden.Text = vornullen(Zeitexperte.BnachTokyo(CInt(Me.BStunden)), 2)
End Sub
'Aktionen nach Klicken der Schließen-Schaltfläche
'=======================================
Private Sub SchliessenBtn_Click()
abbrechen = True
Unload Me
End Sub
'verhindert das ungewollte Schließen des Fensters '=======================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "Benutzen Sie nur die Schaltflächen innerhalb des Fensters", vbCritical
Cancel = True
End If
End Sub
'füllt die übergebene Zahl bis zur Länge Laenge mit Nullen auf
'================================================
Public Function vornullen(ByVal z As Integer, ByVal Laenge As Integer) As String
Dim dummy As String
dummy = "" & z
Do While Len(dummy) < Laenge
dummy = "0" & dummy
Loop
vornullen = dummy
End Function
'setzt die Zeitanzeige in Gang
'======================
Private Sub StartBtn_Click()
abbrechen = False
Do While Not abbrechen
ZeitSetzen
verzoegern (1)
Loop
End Sub
'verzögert die Ausführung des Programms um Dauer Sekunden
'=================================================
Private Sub verzoegern(ByVal Dauer As Single)
Dim Zeit As Single
Zeit = Timer
Do While Timer < Zeit + Dauer
DoEvents
Loop
End Sub
Die zweite und gleichzeitig unterste Schicht des Programms besteht aus dem Modul Zeitexperte. Dieses enthält eine Sammlung von Zeitumrechnungsfunktionen. Tatsächlich sind mehr Funktionen enthalten als für diese Anwendung gebraucht werden. Dies ist aber eine typische Situation bei Wiederverwendung von Code.
Public Function BnachNY(ByVal BStunde As Integer) As Integer
BnachNY = (BStunde + 18) Mod 24
End Function
Public Function BnachTokyo(ByVal BStunde As Integer) As Integer
BnachTokyo = (BStunde + 8) Mod 24
End Function
Public Function NYnachB(ByVal NYStunde As Integer) As Integer
NYnachB = (NYStunde + 6) Mod 24
End Function
Public Function TokyoNachB(ByVal TokyoStunde As Integer) As Integer
TokyoNachB = (TokyoStunde + 16) Mod 24
End Function
Für das Starten des Formulars beim Öffnen der Arbeitsmappe sorgt die folgende Ereignisprozedur, die im Modul DieseArbeitsmappe platziert ist:
Private Sub Workbook_Open()
Dim z As ZeitForm
Set z = New ZeitForm
z.Show
End Sub