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 Wie­derverwendung 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