VB.NET Timer zur Laufzeit erstellen

VB.NET Timer zur Laufzeit erstellen

VB.NET Timer zur Laufzeit erstellen

In diesem Beitrag werde ich Dir erklären, wie man in VB.NET einen Timer zur Laufzeit erstellen kann.

Dabei wirst Du unter Anderem sehen, wie die AddHandler-Anweisung zum Einsatz kommt.

In Kombination dazu, benötigen wir auch den AddressOf-Operator, um an die „Adresse“ der zu verknüpfenden Methode zu kommen.

Diese beiden Werkzeuge brauchen wir, um das Tick-Ereignis dynamisch mit einer Methode verknüpfen zu können.

VB.NET Timer Beispiel – Allgemein

Falls du ein allgemeines Tutorial, bzw. ein allgemeines VB.NET Timer Beispiel suchst, wirst du in diesem Beitrag auf meiner Seite fündig.

Dort erkläre ich alle Basics über das Timer-Control, wie z. B. Eigenschaften, Methoden und dessen Funktionsweise.

Zusätzlich erzähle ich noch etwas über einen eigenen kleinen Bug den ich damals zuerst nicht gefunden habe und was man beachten muss.

Timer – Eine kleine Wiederholung

Beispielreiche Einsatzmöglichkeiten

Wie wir im anderen Beitrag schon lernen konnten, ist der Timer dazu da, gewissen Code im Intervall zu wiederholen.

Die Einsatzbeispiele sind vielfältig:

  • Eine simple digitale Uhr
  • Einen Kalender mit Termin-Synchronisation
  • Einen Windows-Service der im Hintergrund eventuell Signale an eine Http-Schnittstelle sendet
  • uvm.

Das Tick-Ereignis

Falls Du Dich noch erinnern kannst, oder es ggf. bereits weißt, brauchen wir für die Verwendung des Timers hauptsächlich sein wichtigstes Ereignis: Das Tick-Ereignis.

VB.NET Timer zur Laufzeit erstellen

Nun kann es von Zeit zu Zeit vorkommen, dass man als .NET-Entwickler einen Timer zur Laufzeit erstellen möchte.

Sei es zum Beispiel für ein Spiel der Marke Eigenbau, sei es auch noch so klein, bzw. grafisch noch so schlicht.

Achtung!

Achtung bei der Erstellung mehrerer Timer
Achtung bei der Erstellung mehrerer Timer

Ich möchte bevor ich dir die Beispiele zeige, noch gerne einen gut gemeinten Rat ans Herz legen.

Du solltest Dir bei dem Design Deiner kleinen Anwendung, deines Spiels, etc. im Klaren sein, dass es unter Umständen bessere Lösungen geben könnte, als nachher 15 Timer zu haben – just saying.

Überlege Dir daher ausgiebig, ob Dein Problem nicht eventuell mit wenigeren Timern, oder gar einem erledigt werden könnte.

Allerdings sehe ich es auch teils relativ locker, denn das Lernen ist ein Prozess und man wird nun einmal meist nur durch das Probieren besser – behalt‘ es nur im Kopf!

VB.NET Timer zur Laufzeit erstellen – Auf Form-Ebene

Ist ähnlich dem Designer, nur halt pur Code-Datei basiert, sprich nicht im Designer.

Der Code der Form

Konstruktor

Im Konstruktor der Form initialisieren wir den Timer mit einer neuen Instanz.

Könnte alternativ auch im Load-Ereignis passieren, allerdings macht es für mich persönlich mehr Sinn im Konstruktor.

Im Konstruktor wird halt konstruiert – auch die Kind-Elemente, zumindest wenn keine Dependency Injection o. Ä. verwendet wird..

Das auskommentierte Initialisierungs-Beispiel tut es dem Designer in der Designer-Datei gleich.

Die letzte Zeile erkläre ich hier, im Teil der „WithoutHandlesClause„-Methode

Form1_Load – Load-Ereignishandler

Im Ereignishandler für das „Form-Load„-Ereignis können wir den Timer dann per Timer.Start() starten. Alternativ könnte man natürlich auch hier, oder schon bei der InitialisierungEnabled“ auf True stellen, etc.

WithHandlesClause – Tick-Eventhandler

Diese Sub ist wie üblich via Handles-Klausel verknüpft, das geht deshalb, weil wir den Timer auf Form-Ebene und mit WithEvents deklariert haben.

WithoutHandlesClause – Tick-Eventhandler

Diese Methode wird dynamisch durch die AddHandler-Anweisung im Konstruktor mit dem Tick-Event des Timers verknüpft. Diese Vorgehensweise ist praktisch das Kernelement des ersten Beispiels.

Imports System.Diagnostics

Public Class Form1

    Private WithEvents Timer As Timer

    Sub New()
        InitializeComponent()
        Timer = New Timer()
        ' this is how the designer does it internally
        ' Timer = New Timer(Me.components)
        AddHandler Timer.Tick, AddressOf WithoutHandlesClause
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' or use Enabled = True above or here
        Timer.Start()
    End Sub

    Private Sub WithHandlesClause(sender As Object, e As EventArgs) Handles tmrTime.Tick
        Debug.WriteLine("WithHandlesClause")
    End Sub

    Private Sub WithoutHandlesClause(sender As Object, e As EventArgs)
        Debug.WriteLine("WithoutHandlesClause")
    End Sub

End Class

VB.NET Timer zur Laufzeit erstellen – Durch Button-Klick

In diesem Beispiel zeige ich, wie man einen Timer innerhalb eines „Button-Klick„-Ereignishandlers erstellen kann.

Auch hier werden wir „bekannte Methoden“ verwenden, also Methoden, die bereits in der Form vorhanden sind.

Private Sub btnCreateTimer_Click(sender As Object, e As EventArgs)
    Dim timer = new Timer()
    timer.Interval = 1000 ' default 100ms
    AddHandler timer.Tick, AddressOf MyTicker
    timer.Start() ' or use Enabled = True if you want to start it immediately
End Sub

Private Sub MyTicker(sender As Object, e As EventArgs)
   System.Diagnostics.Debug.WriteLine("MyTicker")
End Sub

VB.NET Timer zur Laufzeit erstellen – Mit anonymem Handler

Mit dem dritten und letzten Beispiel möchte ich die Möglichkeit für einen sogenannten anonymen Handler“ nutzen.

Selbstverständlich muss man auch hier auf die Signatur, also in diesem Fall auf die korrekte Anzahl der Parameter der Methode achten.

Mit anonymer Sub

Hier brauchst Du auch keine AddressOf-Operator angeben, da wir nicht darüber praktisch an die Adresse der Funktion kommen müssen.

Private Sub btnCreateTimer_Click(sender As Object, e As EventArgs)
    Dim timer = new Timer()
    timer.Interval = 1000 ' default 100ms
    AddHandler timer.Tick, Sub(sender, e)
                                   Debug.WriteLine("anonymous")
                               End Sub
    timer.Start() ' or use Enabled = True if you want to start it immediately
End Sub

Mit anonymer Sub und Variable

Du kannst diesen Handler auch in eine Variable stecken und dann mit AddHandler zuweisen:

Private Sub btnCreateTimer_Click(sender As Object, e As EventArgs)
    Dim timer = new Timer()
    timer.Interval = 1000 ' default 100ms
    Dim dynamicCreatedHandler = Sub(sender, e)
                                    Debug.WriteLine("anonymous")
                                End Sub
    AddHandler Timer.Tick, dynamicCreatedHandler
    timer.Start() ' or use Enabled = True if you want to start it immediately
End Sub

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.