|
Schreibmaschinen-Effekte, bei denen ein Text so zu sagen vor den Augen des Anwenders "eingetippt" wird, können Sie am besten mit Hilfe eines Timers realisieren. Sie können die Verwaltung des Ablaufs direkt im Code des Forms, auf dem der Timer platziert ist, codieren. Sie können aber auch die Verwaltung eines Schreibablaufs in eine Klasse packen, wie wir es Ihnen im folgenden Beispiel der Klasse clsTypeWriter zur Ausgabe in einem Label zeigen.
Sie initialisieren eine Instanz der Klasse mit dem Aufruf der Start-Methode und übergeben ihr dabei den auszugebenden Text, das Label, in dem der Text ausgegeben werden soll, und ein Timer-Steuerelement, das den Takt der Ausgabe steuern soll. Optional können Sie das Takt-Interval des Timers setzen (Voreinstellung: 300) und ebenso optional festlegen, ob der Inhalt der Caption-Eigenschaft des Labels beim Start gelöscht werden soll. Ist Letzteres der Fall, wird eine "Schreibmarke" (Unterstrich) als Anfangsinhalt der Caption-Eigenschaft des Labels zugewiesen. Sol der Inhalt nicht gelöscht werden, wird der Unterstrich angefügt, falls der Inhalt nicht schon damit endet.
Private mCaption As String
Private mLabel As Label
Private WithEvents eTimer As Timer
Public Sub Start(Caption As String, Label As Label, _
Timer As Timer, Optional ByVal Interval As Long = 300, _
Optional ByVal Clear As Boolean = True)
mCaption = Caption
Set mLabel = Label
Set eTimer = Timer
With eTimer
Select Case Interval
Case Is > 0
.Interval = Interval
End Select
.Enabled = True
End With
With mLabel
If Clear Then
.Caption = "_"
ElseIf Right$(.Caption, 1) <> "_" Then
.Caption = .Caption & "_"
End If
End With
End Sub
Da die Variable, in der die Referenz auf den Timer in einer Ereignisempfänger-Variablen (Withevents...) abgelegt wird, treffen die Timer-Ereignisse auch in der Timer-Ereignisprozedur in dieser Klasse ein.
Ist noch genügend Text in mText vorhanden (mehr als 1 Zeichen), wird das erste Zeichen an den Caption-Text des Labels angefügt. Der Unterstrich als Schreibmarke wird zuvor entfernt und wieder ans Ende gehängt. Anschließend wird mText um das erste Zeichen gekürzt. Ist nur noch ein einziges Zeichen zur Ausgabe in mText vorhanden, wird mText gelöscht und die Ausgabe erfolgt ohne Anhängen der Schreibmarke. Ist mText nun leer, wird beim nächsten Eintreffen des Timer-Ereignisses der Timer gestoppt. Die Referenz-Variablen werden freigegeben und es wird das Ereignis Done ausgelöst, um dem "Besitzer" der Klasse zu signalisieren, dass die Ausgabe abgeschlossen ist.
Public Event Done()
Private Sub eTimer_Timer()
Select Case Len(mCaption)
Case 0
Set mLabel = Nothing
eTimer.Enabled = False
Set eTimer = Nothing
RaiseEvent Done
Case 1
With mLabel
.Caption = Left$(.Caption, Len(.Caption) - 1) _
& Left$(mCaption, 1)
End With
mCaption = ""
Case Else
With mLabel
.Caption = Left$(.Caption, Len(.Caption) - 1) _
& Left$(mCaption, 1) & "_"
End With
mCaption = Mid$(mCaption, 2)
End Select
End Sub
Dieses Ereignis können Sie dazu verwenden, die Start-Methode erneut aufzurufen. So können Sie die Ausgabe wiederholen, neue bzw. aktualisierte Texte ausgeben, oder eine Sammlung (Array oder Collection) von Texten zyklisch ausgeben. Letzteres sehen Sie im folgenden Code-Beispiel:
Private WithEvents eTypeWriter As clsTypeWriter
Private mTexts() As String
Private mTextIndex As Integer
Private Sub cmdStart_Click()
mTextIndex = mTextIndex + 1
If mTextIndex > UBound(mTexts) Then
mTextIndex = LBound(mTexts)
End If
eTypeWriter.Start mTexts(mTextIndex), Label1, tmrTypeWriter
End Sub
Private Sub eTypeWriter_Done()
If chkRepeat.Value Then
cmdStart_Click
End If
End Sub
Private Sub Form_Load()
ReDim mTexts(1 To 2)
mTexts(1) = "ABOUT Visual Basic"
mTexts(2) = "Das Webmagazin"
Set eTypeWriter = New clsTypeWriter
End Sub
|