Variable als Zeiger auf Prozedur

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Variable als Zeiger auf Prozedur

    Hallo,

    ich möchte gerne mit einer Variable auf einer Prozedur zeigen.
    kleines Beispiel:

    VB.NET-Quellcode

    1. Dim stopw As New Stopwatch
    2. Sub TimerStarten(Byval AufzurufendeProzedur as ???)
    3. AddHandler Startseite.stopw.Tick, AddressOf AufzurufendeProzedur
    4. stopw.start()
    5. end sub
    6. Sub stopw_tick(sender As System.Object, e As System.EventArgs)
    7. hier_wird_jetzt_einfach_irgendwas_gemacht()
    8. end sub


    Bei dem Beispiel wurde jetzt die Prozedur so aufgerufen:

    VB.NET-Quellcode

    1. TimerStarten(stopw_tick)


    Bei den ??? weiß ich nicht was eigefügt werden soll.
    Ich hoffe da ist möglich auf eine Prozedur oder Funktion zu zeigen.

    Vielen Dank schonmal für eure Hilfe :)

    Krogjan schrieb:

    Prozedur oder Funktion
    Das Zauberwort heißt Delegate.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In diesem Fall, wo du ein Event anhängen willst, ist der Delegat schon vordefiniert, und hat den Typ EventHandler (übrigens der typische Delegat für sehr sehr viele Events)

    Guck dir diesen Code an:

    VB.NET-Quellcode

    1. Private _Counter As Integer = 0
    2. Dim stopw As New Timer With {.Interval = 1000, .Enabled = True} 'läuft die ganze Zeit, macht ja nix, wenn nix dranhängt
    3. Sub TimerStarten(prevProc As EventHandler, newProc As EventHandler)
    4. RemoveHandler stopw.Tick, prevProc
    5. AddHandler stopw.Tick, newProc
    6. End Sub
    7. Sub CountUp(sender As System.Object, e As System.EventArgs)
    8. _Counter += 1
    9. End Sub
    10. Sub CountDown(sender As System.Object, e As System.EventArgs)
    11. _Counter -= 1
    12. End Sub
    13. Private Sub CheckBox1_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged
    14. Dim newHandler, previousHandler As EventHandler
    15. If CheckBox1.Checked Then
    16. newHandler = AddressOf CountUp
    17. previousHandler = AddressOf CountDown
    18. Else
    19. newHandler = AddressOf CountDown
    20. previousHandler = AddressOf CountUp
    21. End If
    22. TimerStarten(previousHandler, newHandler)
    23. End Sub
    (eine StopWatch ist übrigens kein Timer!)
    Ist die Checkbox gecheckt, so wird CountDown entfernt, und CountUp geaddet - andernfalls annersrum.
    Beachte, dass eine echte Delegat-Variable ohne das AddressOf-Schlüsselwort geadded wird.
    AddressOf ist einfach ein besonderer Operator, der aus einer MethodenDeklaration einen Delegaten macht. Ist der Delegat schon ein Delegat, so ist AdressOf türlich fehl am Platz.

    Zu Delegaten gibts endlos viel zu lernen - auch eine Menge grad mit Events. Guck dir mal Alles über Events - das hat einen anneren Schwerpunkt, aber Delegaten kommen auch reichlich vor.

    Seit 2005 - Einführung der Generica ist das selbst deklarieren von Delegaten fast immer überflüssig. Aber die übliche Literatur führt das immer noch vor, aber gewöhn dir besser an, gleich die generischen Delegaten Action(Of T) zu verwenden - mit denen kann man fast alles abdecken.
    Für Events gibts auch generische Delegaten, Eventhandler(Of T) - naja, ziemlich fortgeschritten - siehe das Tut.

    PS: Falls du nu selbst Code damit erstellst, empfehle ich dir, den hier zu posten. Da kann man meist jede Menge aufhübschen, wenn Einsteiger Code produzieren, grad zu Neuland-Themen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()