RichTextBox-Effekt mittels Timer?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Fonsi.

    RichTextBox-Effekt mittels Timer?

    Moin,

    ich will folgendes realisieren: In einer RichTextBox (mit immer genau 10 Zeichen Inhalt) sollen bestimmte Zeichen einen "Glüheffekt" erhalten.

    Die Buchstaben sind blau (RGB 0, 0, 255). Tritt jetzt ein bestimmtes Ereignis ein, dann wird ein Zeichen mittels Timer (Intervall=5ms) erst weiß gefärbt (RGB 255, 255, 255) und dann werden bei jedem Timer-Tick Rot- und Grünanteil in 5er Schritten verkleinert, sodass das Zeichen also nach 255ms wieder blau ist (RGB 0, 0, 255).

    Ich hoffe, das ist soweit klar 8-) . Ist halt ein selbst gebastelter Effekt in einer RichTextBox.

    Das funktioniert für ein Zeichen genau so, wie ich es haben will. Bei mehreren Zeichen steh ich jetzt aber momentan aufm Schlauch. Angenommen, das Ereignis löst zum Zeitpunkt 0 aus, dann braucht der Timer 255ms. Nach 50ms (Timer 1 läuft also noch) aber kann nun schon ein weiteres Ereignis ausgelöst werden, welches ein zweites Zeichen dann mit diesem Effekt verändern soll.

    Der Link hier ist eigentlich fast das, was ich benötige. Also verschiedene Timer während der Laufzeit mittels Array erstellen und ansteuern. Nur müssen die Timer, wenn der Effekt abgelaufen ist (das Zeichen also wieder blau ist), wieder gestoppt werden, was bisher im Timer_Tick-Ereignis passierte:

    VB.NET-Quellcode

    1. Dim WithEvents oTimer as Timer
    2. Dim red as Integer = 255
    3. Dim green as Integer = 255
    4. Private Sub oTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles oTimer.Tick
    5. If red >= 0 then
    6. 'Farbe des Zeichens setzen
    7. red -= 5
    8. green -=5
    9. Else
    10. red = 255
    11. green = 255
    12. oTimer.Stop() '<------ !
    13. End Sub
    Nein, es geht generell um das Problem, wie ich die Timer, die ich als Array erstellt habe, im jeweils eigenen Tick-Ereignis wieder beende.

    Mein Code im Groben:

    VB.NET-Quellcode

    1. Private Sub FarbeAendern(ByVal stelle as Integer) 'stelle kann nur 0 bis 9 sein)
    2. Dim red As Integer = 255
    3. Dim green As Integer = 255
    4. Dim oTimer(stelle) As Timer
    5. oTimer(stelle) = New Timer
    6. oTimer(stelle).Interval = 5
    7. Select Case stelle
    8. Case 1: AddHandler oTimer(stelle).Tick, AddressOf Timer0Farbe
    9. Case 2: AddHandler oTimer(stelle).Tick, AddressOF Timer1Farbe
    10. ' usw. bis 9
    11. End Select
    12. oTimer(stelle).Start()
    13. End Sub
    14. Private Sub Timer0Farbe()
    15. If red >= 0 then
    16. 'Farbe des Zeichens setzen
    17. red -= 5
    18. green -=5
    19. Else
    20. red = 255
    21. green = 255
    22. ' hier müsste der jeweilige Timer jetzt gestoppt werden, funktioniert aber nicht, da in Sub FarbeAendern deklariert wird
    23. End Sub
    Du musst das Beispiel nur noch bei dir einbauen.

    VB.NET-Quellcode

    1. Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick, Timer2.Tick
    2. Dim timerobject As Timer = Nothing
    3. timerobject = CType(sender, Timer)
    4. End Sub

    Fonsi schrieb:

    die ich als Array erstellt habe, im jeweils eigenen Tick-Ereignis wieder beende.

    Indem du die "korrekte" Signatur für deinen EventHandler verwendest?
    Dann wird nämlich der auslösende Timer (als object) übergeben und kann dann einfach per DirectCast(sender, Timer).Enabled=False beendet werden.
    ich dachte du willst es aus diesem Event beenden? Wie willst du es dann noch aufrufen? Die sender Eigenschaft in einem Event gibt das Objekt an, welches das Event ausgelöst hat und somit auch deinen entsprechenden Timer, sender ist jedoch vom Typ Objekt, über DirectCast oder CType(DirectCast ist schneller) musst du dieses Objekt noch in einen Timer konvertieren, anschließend hast du vollen Zugriff auf den Timer...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich habs nun anders gelöst ... manchmal sieht man den Wald vor lauter Bäumen bzw. die einfachste und naheliegenste Lösung einfach nicht :whistling: .

    Ich hab ne Klasse geschrieben und für jeden Buchstaben wird Objekt dieser Klasse deklariert. Somit können problemlos auch 5 Buchstaben zeitversetzt mit einem "Glüheffekt" versehen werden und ich hab nicht das durcheinander mit 10 Timer :thumbup: .