Was ist zu tun?
In das Formular per Maus einen Timer ->
einfügen. Es ist egal, wo er angeordnet wird, er wird später unsichtbar sein. Noch solange er markiert ist, tragen wir im Eigenschaftsfenster bei der Eigenschaft "Interval" (mit nur einem "l", weil es ein englisches Intervall ist!), statt der dort stehenden Null eine 1000 ein.
Null heißt, der Timer arbeitet nicht, 1000 bedeutet, daß er sich nach jeweils 1000 Ticks meldet, ein Tick, was immer das sein mag, dauert genau 10-3 Sekunden.
Wir haben damit den Timer so eingestellt, daß er genau jede Sekunde ein "Ereignis" abschickt.
Jetzt wird ein Label ->
eingefügt. Mit der Maus auf dem Formular schön groß ziehen.
Doppelklick auf das Timersymbol im Formular. Es erscheint der Codeeditor mit einem Unterprogrammrahmen. Der beginnt (so etwas schreibt man nie!) mit: "Private Sub Timer1_Timer()" und endet mit "End Sub". Diese "Sub" wird immer dann aufgerufeb, wenn sich der Timer, der den Namen "Timer1" trägt, meldet, genau jede Sekunde einmal. Zwischen die beiden Zeilen wird gleich das Programm geschrieben. Zu schreiben ist "Label1.Caption = Now". Das bedeutet nämlich, daß das Label, welches "Label1" heißt, eine Aufschrift (Caption) erhält, die den Inhalt der vb-Variablen namens "Now" darstellt. Was das ist, wird sich gleich zeigen.
![]() Private Sub Timer1_Timer() Label1.Caption = Now End Sub |
Jetzt das Formular und das Projekt speichern und das fertige Programm starten. Wider Erwarten haben wir soger eine Uhr mit Datumsanzeige geschaffen! Ist das nicht informativer, als alle "Hallo world"-Programme?
Nun ja, schön ist anders. Deshalb sollen hier ein paar kleine Verzierungen folgen.
Die Ausgabe des Datums und der Zeit ist in dieser kompakten Form schwer zu entziffern. Eine Formatierung mit Hilfe der Format$-Funktion und geeigneter vordefinierter Formate hilft. Zwischen die beiden Auzsgaben setzen wir noch einen Zeilenumbruch, der den so einprägsamen Namen "vbCrLf" trägt. Wie man sich den merkt? Ganz einfach: visual basic Carriage return Line feed. Zu deutsch: Wagenrücklauf, Zeilenvorschub. Schönen Gruß von der Schreibmaschine!
| Private Sub Timer1_Timer() Label1.Caption = Format$(Now, "long date") & vbCrLf & Format$(Now, "long time") End Sub |
Die Eigenschaften des Labels lassen sich im Eigenschaftenfenster verändern: Es empfiehlt sich "Font" für die Schriftart und -größe, "ForeColor" für die Schriftfarbe, "BackColor" für den Hintergrund zu verändern.
Das Formular kann ebenfalls im Eigenschaftenfenster verschönt werden. Das ist hier die Fensterüberschrift (Caption), die Fensterfarbe (BackColor) und ein Icon (Icon). Man kann das Fenster auch von der Titelleiste befreien etc. Bitte selber probieren!
Ergebnis wäre etwa:

Weil wir es nicht mehr mit Programmier-Anfängern zu tun haben, kommt jetzt ein großer Schritt. Es soll eine Uhr mit Zeigern werden.
Zuerst seien die wichtigsten Schritte erklärt.
Um eine Uhr zu malen, braucht man ein Koordinatensystem. Das errichten wir hier auf dem Formular so, daß der Ursprung in der Mitte eines etwa quadratischen Formulars liegt. Das Koordinatensystem muß mit dem Befehl "Scale..." deklariert werden. Das passiert hier in der Form_Load-Prozedur. Den zugehörigen Aufruf erzeugt man durch Doppelklick auf das Formular.
Die Formularränder sollen in x- und y-Richting jeweils etwa bei -1,1 bzw. +1,1 liegen, dann kann unser längster Zeiger genau die Länge 1 haben.
Die Koordinaten der Zeiger müssen wenigstens für den Sekundenzeiger jede Sekunde neu berechnet werden. Die Minuten- und Stundenzeiger nur beim Wechsel der Anzeige zu berechnen und sie inzwischen zu merken, wäre zwar möglich aber umständlicher, als sie für jeden Zeichenvorgang neu zu berechnen.
Wie geht's weiter? Man denke sich einen Einheitskreis, die x- und y-Werte eines Zeigers lassen sich mit Cosinus bzw. Sinus berechnen, wenn man den Winkel kennt. Jeder Zeiger startet bei 90° entgegen der Zählrichtung der Winkelskale. Der Sekundenzeiger hopst jedesmal um -6°, der Stundenzeiger um -30°. Für die Berechnung der Winkelfunktionen muß leider das Bogenmaß her.
Zeiger malt man, wenn man die Koordinaten kennt, mit dem Line...-Befehl. Die Linienstärke kann jeweils mit "DrawWidth = Pixelzahl" eingestellt werden.
Bevor jede Sekunde die Uhr neu gemalt wird, muß reiner Tisch geschaffen werden. Dies bewirkt der Cls-Befehl am Beginn der Timer-Prozedur.
Wenn alle drei Zeiger gemalt sind, haben wir noch immer nicht genug. Es folgt ein Kranz mit unterschiedlich dicken Minuten- und Stundenmarkierungen. Deren Unterscheidung erfolgt durch Test auf Teilbarkeit des Gradwertes durch 5. Eigentlich wäre ja auf 30 zu prüfen, aber das gäbe mehr Schreibarbeit! (Wer's verstehen will, sehe noch mal bei den Rechenzeichen nach!) Sollte soweit klar sein.
Schließlich müssen die Variablendeklarationen eingetragen werden. Wann und wo man dies tut, ist zwar egal. Man setzt sie der Übersicht halber an den Beginn des Programms. Die Konstante Pi, die ebenfalls erklärt werden muß, wird nur im Kopfbereich akzeptiert.
| Option Explicit 'Variable deklarieren Dim alf As Single, x As Single, y As Single Dim i As Integer Const Pi = 3.1415926 Private Sub Form_Load() 'Maßstab errichten End SubScale (-1.2, 1.2)-(1.2, -1.2) Private Sub Timer1_Timer() 'ganzes Fenster löschen Form1.Cls 'Texteintrag Label1.Caption = Format$(Now, "long date") & " " & Format$(Now, "long time") 'Sekundenzeiger alf = (90 - 6 * Second(Now)) * Pi / 180 x = Cos(alf) y = Sin(alf) DrawWidth = 1 Line (0, 0)-(x, y) 'Minutenzeiger alf = (90 - 6 * Minute(Now)) * Pi / 180 x = Cos(alf) y = Sin(alf) DrawWidth = 2 Line (0, 0)-(x, y) 'Stundenzeiger alf = (90 - 30 * Hour(Now)) * Pi / 180 x = 0.5 * Cos(alf) y = 0.5 * Sin(alf) DrawWidth = 4 Line (0, 0)-(x, y) 'Außenkranz malen For i = 0 To 360 Step 6 alf = (90 - i) * Pi / 180 x = 1.1 * Cos(alf) y = 1.1 * Sin(alf) If i / 5 = i \ 5 Then DrawWidth = 8 Else DrawWidth = 3 End If PSet (x, y), QBColor(0) Next End Sub |

Nach so vielen Bildern stehender Uhren soll wenigstens eine gehen:
![]() ![]() ![]() ![]() ![]() ![]() |
Wieso sie geht? Sie geht, weil sie in JavaScript geschrieben ist.