Raiseevent aus der Class

  • VB.NET

Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von zoranmaric.

    Raiseevent aus der Class

    Hallo ,

    habe eine Serielle Schnittstelle und versuche aus der Class die Daten mittels Raiseevant zu übergeben. Hier der Code:

    VB.NET-Quellcode

    1. Public Class COMPortx
    2. Inherits IO.Ports.SerialPort
    3. Public Event MeinEvent(ByVal Daten() As Char, ByVal Count As Integer)
    4. Public Sub ComPortRX_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles COMPort.DataReceived
    5. Do
    6. RXCnt = 0
    7. Do
    8. RXByte = COMPort.ReadByte
    9. RXArray(RXCnt) = LookUpTable(RXByte >> 4)
    10. RXCnt = RXCnt + 1RXArray(RXCnt) = LookUpTable(RXByte And 15)
    11. RXCnt = RXCnt + 1
    12. RXArray(RXCnt) = " "
    13. RXCnt = RXCnt + 1Loop Until (COMPort.BytesToRead = 0)
    14. RaiseEvent ComPort_RX(RXArray, RXCnt)
    15. Loop Until (COMPort.BytesToRead = 0)
    16.  
    17.  
    18. End Sub


    In der Form habe ich:

    VB.NET-Quellcode

    1. Private WithEvents mk As New COMPortx
    2. Private Sub mk_MeinEvent(ByVal Daten() As Char, ByVal Count As Integer) Handles mk.MeinEvent
    3. TextBox3.AppendText(New String(Daten, 0, Count))
    4. End Sub


    In der Textbox sollten die Daten zu sehen sein. Aber es will nicht klappen .... 8|

    Innerhalb der Form mit invoke funktioniert es aber wie so nicht hier... ?(

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

    Hey,

    Du löst dieses Event aus

    VB.NET-Quellcode

    1. RaiseEvent ComPort_RX(RXArray, RXCnt)


    Aber dieses Event sehe ich in Deinem Code nicht.

    Mach mal:

    VB.NET-Quellcode

    1. RaiseEvent MeinEvent(RXArray, RXCnt)
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    das ist der Richtige Code:
    hatte mich verschrieben... trotzdem geht es nicht... ist dass überhaupt möglich ... ?

    VB.NET-Quellcode

    1. Public Event MeinEvent(ByVal Daten() As Char, ByVal Count As Integer)
    2.  
    3. Public Sub ComPortRX_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
    4. Do
    5. RXCnt = 0
    6. Do
    7. RXByte = COMPort.ReadByte
    8. RXArray(RXCnt) = LookUpTable(RXByte >> 4)
    9. RXCnt = RXCnt + 1RXArray(RXCnt) = LookUpTable(RXByte And 15)
    10. RXCnt = RXCnt + 1
    11. RXArray(RXCnt) = " "
    12. RXCnt = RXCnt + 1
    13. Loop Until (COMPort.BytesToRead = 0)
    14. RaiseEvent MeinEvent(RXArray, RXCnt)
    15. Loop Until (COMPort.BytesToRead = 0)
    16. End Sub




    Die idee war ja die Serielle Abfrage in eine DLL zu legen und bei bedarf sie abzurufen ....



    als Test habe ich dass probiert und es geht...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents mk As New MeineKlasse
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. End Sub
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. mk.Routine()
    7. End Sub
    8. Private Sub mk_MeinEvent(ByVal w As String) Handles mk.MeinEvent
    9. MsgBox(w)End Sub
    10. End Class
    11.  
    12. Public Class MeineKlasse
    13.  Public Event MeinEvent(ByVal w As String)
    14. Public Sub Routine()RaiseEvent MeinEvent("Bla Bla")
    15. End Sub
    16. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „zoranmaric“ ()

    Äh ja. Wenn Du magst, dann setz nochmal nen Haltepunkt im Eventhandler auf der Form und gugg, ob dieser Teil angesprungen wird.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Lol, irgendwie tappen wir da im Dunkeln.

    Nächster Versuch

    VB.NET-Quellcode

    1. Private Sub OnMeinEvent(ByVal data() As Char,ByVal count As Integer)
    2. RaiseEvent MeinEvent(data,count)
    3. End Sub


    Mach mal das RaiseEvent da raus und pack das in eine extra Sub. Ruf dann, wo jetzt das RaiseEvent bei Dir steht, OnMeinEvent auf.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ja genau, so meinte ich das... Was passiert nun? Schau, ob die OnMeinEvent-Sub aufgerufen wird und schau, ob das Event nun ausgeführt wird.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Alter, das kann doch nicht sein. Irgendwo hast Du nen Bug, den wir nicht sehen. Wenn Du magst, dann stell Dein Projekt mal hier als .zip rein, damit ich den ganzen Code anguggn kann. Das nervt mich selber :)
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So wie es mir scheint, scheitert das Ganze an Deinem Design, was die Klasse betrifft. Du hast es doch nicht wirklich so gelöst, wie es in der Datei steht? Ist das Ganze eine Windows-Forms-Anwendung oder ne Consolenanwendung? Wenn Du es so nutzt, wie Du es mir geschickt hast, dann kann das nicht gehen. Als erstes solltest Du auch mal Option Strict auf ON setzen. Dann erstell Dir eine neue Form und instanziere Deinen Comport im Code dieser Form.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _p As New COMPortx
    3. Private Sub _p_MeinEvent(Daten() As Char, Count As Integer) Handles _p.MeinEvent
    4. End Sub
    5. End Class


    Es ist wohl das Beste, wenn Dir nochmal ein komplett neues Projekt anlegst. Als erstes die Form designen, dann fügst Du die Datei ein, die Du mir geschickt hast und entfernst vorher den Krampf mit Form1 in dieser Datei.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Nimm das RaisEvent aus der Do-Loop raus, sammle die Ergebnisse auf und raise dann das Event.
    Vielleicht machst Du Dur ein kleines Testprogramm, das sich mit dem Event raisen befasst, unabhängig von Serial oder parallel oder sonst Port.
    Wenn Du versuchst, alle Deine Probleme gleichzeitig zu lösen, kommst Du in Teufels Küche.
    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!
    Habe viele Test durchgeführt auch diesen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents mText As TimerState
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. mText = New TimerState
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. mText.StartCountdown(10.0, 0.1)
    8. End Sub
    9. Private Sub mText_ChangeText() Handles mText.Finished
    10. TextBox1.Text = "Done"
    11. End Sub
    12. Private Sub mText_UpdateTime(ByVal Countdown As Double) Handles mText.UpdateTime
    13. TextBox1.Text = Format(Countdown, "##0.0")
    14. End Sub
    15. End Class
    16. Class TimerState
    17. Public Event UpdateTime(ByVal Countdown As Double)
    18. Public Event Finished()
    19. Public Sub StartCountdown(ByVal Duration As Double, ByVal Increment As Double)
    20. Dim Start As Double = DateAndTime.Timer
    21. Dim ElapsedTime As Double = 0
    22. Dim SoFar As Double = 0
    23. Do While ElapsedTime < Duration
    24. If ElapsedTime > SoFar + Increment Then
    25. SoFar += IncrementRaiseEvent UpdateTime(Duration - SoFar)
    26. End IfElapsedTime = DateAndTime.Timer - Start
    27. Loop
    28. RaiseEvent Finished()
    29. End Sub
    30. End Class
    Funktioniert alles... mit Zahlen, etc. aber ich habe die Vermutung das der Serieller Port aus einen anderen Thread ausgeführt wird. Was ich nicht weiß ob das Raiseevant über Threads das Evant auslösen kann….



    Habe auch lt. SpaceyX neu erstellt aber ohne Erfolg.... ob es mit dem Thread zu tun hat ????