Gemeinsamen EventHandler für dynamisch erzeugte Objekte

  • VB.NET
  • .NET (FX) 4.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Gemeinsamen EventHandler für dynamisch erzeugte Objekte

    Hallo,
    wie in der Überschrift schon steht will ich zur Laufzeit Objekte erstellen die ein Ereigniss auslösen welches
    in einem gemeinsamen Handler behandelt werden soll. Bekomms aber nicht hin X/

    Mein kleines Test-Programm beendet sich einfach ohne mir eine Fehlermeldung auszuspucken ?!?

    Das ganze soll eigentlich so weit gehen, dass ich verschiedene Objekte in die Liste lade die aber das gleiche
    Event besitzen, muss also auch das DirectCast wegbringen.
    Hoffe ich hab mich deutlich genug ausgedrückt :)

    Hier mal mein Code:


    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class Form1
    3. Dim Objects As List(Of Object)
    4. Dim t As Test
    5. Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Objects.Add(New Test("AA"))
    7. Objects(0).Start()
    8. AddHandler DirectCast(Objects(0),Test).Ereigniss, AddressOf MyEventHandler
    9. End Sub
    10. Private Sub MyEventHandler(Msg As String)
    11. Debug.Print(Msg)
    12. End Sub
    13. End Class
    14. Public Class Test
    15. Private m_Name As String = ""
    16. Private myThread As Thread
    17. public Event Ereigniss(Msg As String)
    18. Public Sub New(Name As String)
    19. m_Name = Name
    20. End Sub
    21. Public Sub Start()
    22. myThread = New Thread(AddressOf DoWork)
    23. myThread.IsBackground = True
    24. myThread.Start()
    25. End Sub
    26. Private Sub DoWork()
    27. While true
    28. RaiseEvent Ereigniss(m_Name)
    29. Thread.Sleep(500)
    30. end while
    31. End Sub
    32. End Class
    Ja Stimmt. Fehler war auch weil ich nicht "NEW" List(Of benutzt habe.
    Habe jetzt mal 2 Objekte hinzugefügt, Funktioniert.

    Jetzt muss ich nur noch DirectCast loswerden weil ich mit verschiedenen Objekten arbeiten muss:

    VB.NET-Quellcode

    1. ​Imports System.Threading
    2. Public Class Form1
    3. Dim Objects As new List(Of Object)
    4. Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. End Sub
    6. Private Sub MyEventHandler(Msg As String)
    7. Debug.Print(Msg)
    8. End Sub
    9. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    10. Objects.Add(New Test("AA"))
    11. Objects.Add(New Test2("BB"))
    12. Objects(0).Start()
    13. Objects(1).start()
    14. AddHandler DirectCast(Objects(0),Test).Ereigniss, AddressOf MyEventHandler
    15. 'HIER FEHLERMELDUNG DA ICH TEST2 STATT TEST BENUTZEN MUSS
    16. AddHandler DirectCast(Objects(1),Test).Ereigniss, AddressOf MyEventHandler
    17. End Sub
    18. End Class
    19. Public Class Test
    20. Private m_Name As String = ""
    21. Private myThread As Thread
    22. public Event Ereigniss(Msg As String)
    23. Public Sub New(Name As String)
    24. m_Name = Name
    25. End Sub
    26. Public Sub Start()
    27. myThread = New Thread(AddressOf DoWork)
    28. myThread.IsBackground = True
    29. myThread.Start()
    30. End Sub
    31. Private Sub DoWork()
    32. While true
    33. RaiseEvent Ereigniss(m_Name)
    34. Thread.Sleep(500)
    35. end while
    36. End Sub
    37. End Class
    38. Public Class Test2
    39. Private m_Name As String = ""
    40. Private myThread As Thread
    41. public Event Ereigniss(Msg As String)
    42. Public Sub New(Name As String)
    43. m_Name = Name
    44. End Sub
    45. Public Sub Start()
    46. myThread = New Thread(AddressOf DoWork)
    47. myThread.IsBackground = True
    48. myThread.Start()
    49. End Sub
    50. Private Sub DoWork()
    51. While true
    52. RaiseEvent Ereigniss(m_Name)
    53. Thread.Sleep(500)
    54. end while
    55. End Sub
    56. End Class

    Uran schrieb:

    DirectCast loswerden weil ich mit verschiedenen Objekten arbeiten muss:
    Gib z.B. den beiden Klassen eine gemeinsame Basisklasse / Interface, in der minimal das Event drinsteht.
    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!
    Hi,
    habs mit einem Interface gelöst. Funktioniert perfekt!

    Hier der funktionierende Code (inkl. Ereignis richtig geschrieben :) )

    VB.NET-Quellcode

    1. Imports System.Threading
    2. 'Interface erstellen
    3. Public Interface myInterface
    4. Event Ereignis(Msg As String)
    5. End Interface
    6. Public Class Form1
    7. Dim Objects As new List(Of Object)
    8. Private Sub MyEventHandler(Msg As String)
    9. Debug.Print(Msg)
    10. End Sub
    11. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    12. Objects.Add(New Test("AA"))
    13. Objects.Add(New Test2("BB"))
    14. Objects(0).Start()
    15. Objects(1).start()
    16. AddHandler DirectCast(Objects(0),myInterface).Ereignis, AddressOf MyEventHandler
    17. AddHandler DirectCast(Objects(1),myInterface).Ereignis, AddressOf MyEventHandler
    18. End Sub
    19. End Class
    20. Public Class Test
    21. '!!!
    22. Implements myInterface
    23. '!!!
    24. public Event Ereignis(Msg As String) Implements myInterface.Ereignis
    25. Private m_Name As String = ""
    26. Private myThread As Thread
    27. Public Sub New(Name As String)
    28. m_Name = Name
    29. End Sub
    30. Public Sub Start()
    31. myThread = New Thread(AddressOf DoWork)
    32. myThread.IsBackground = True
    33. myThread.Start()
    34. End Sub
    35. Private Sub DoWork()
    36. While true
    37. RaiseEvent Ereignis(m_Name)
    38. Thread.Sleep(500)
    39. end while
    40. End Sub
    41. End Class
    42. Public Class Test2
    43. Implements myInterface
    44. Public Event Ereignis(ByVal Msg As String) Implements myInterface.Ereignis
    45. Private m_Name As String = ""
    46. Private myThread As Thread
    47. public Event Ereigniss(Msg As String)
    48. Public Sub New(Name As String)
    49. m_Name = Name
    50. End Sub
    51. Public Sub Start()
    52. myThread = New Thread(AddressOf DoWork)
    53. myThread.IsBackground = True
    54. myThread.Start()
    55. End Sub
    56. Private Sub DoWork()
    57. While true
    58. RaiseEvent Ereignis(m_Name)
    59. Thread.Sleep(1000)
    60. end while
    61. End Sub
    62. End Class

    Uran schrieb:

    VB.NET-Quellcode

    1. Event Ereignis(Msg As String)
    In .NET haben Events üblicheerweise die Parameter sender As Object, da kannst Du beim Aufruf ein Me reinschreiben und entweder e As EventArgs oder e As MyEventArgs, wobei MyEventArgs von EventArgs abgeleitet ist. Dies kannst Du verwenden, wenn Du Daten transportieren willst, gim Deinen MyEventArgs die Property Name As String.
    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!
    Dann vergiss bei Deiner Sonntagslektüre nicht, Dich über OPTION STRICT ON zu informieren. Das ist mitunter grausam, was Du da gebastelt hast.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Meinst du mit Grausam das?

    VB.NET-Quellcode

    1. Objects(1).start()​


    Hier bekomm ich einen Fehler wenn OPTION STRICT ON - lässt spätes Binden nicht zu

    ICH weiß ja dass jedes meiner Objekte über Start() verfügt, der Compiler nicht...
    Wie kann man Erfragen ob ein unbekanntes Objekt eine bestimmte Methode besitzt
    bzw. wie kann man drauf zugreifen?

    Uran schrieb:

    lässt spätes Binden nicht zu
    Weil Deine Variablen als Object deklariert sind, Object weiß nix von Deinen Properties / vents. Deklarier sie als myInterface und pack ggf. noch ein paar Deklarationen in Deine Event-Klasse rein.
    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!