Event Kommunikation zwischen 2 Objekten

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von brichun.

    Event Kommunikation zwischen 2 Objekten

    Hi,

    das Ziel ist, dass ein SenderObjekt einen Wert an ein EmpfängerObjekt übergeben soll.

    Mein Versuch war folgender

    VB.NET-Quellcode

    1. Public Class Sender
    2. Dim prozent As Integer
    3. Public Event WeitergabeProzent(ByVal Werta As Integer) 'Eventdeklaration
    4. Public Sub New()'Konstruktor
    5. prozent = 0
    6. End Sub
    7. Public Sub berechne_prozent(ByVal Wert As Integer)
    8. prozent = Wert
    9. RaiseEvent WeitergabeProzent(Wert) 'Eventtrigger
    10. End Sub
    11. End Class
    12. Public Class Empfänger
    13. Dim RahmenWidth As Integer
    14. Dim FortschrittWidth As Integer
    15. Private WithEvents Weitergabe As Sender'Event bekanntgabe
    16. Public Sub New(ByVal Breite As Integer) 'Konstruktor
    17. RahmenWidth = Breite
    18. FortschrittWidth = 0
    19. End Sub
    20. Sub bereche_Panelgröße(ByVal prozent As Integer)
    21. FortschrittWidth = RahmenWidth / prozent
    22. End Sub
    23. Function FortschrittWeite()
    24. FortschrittWeite = FortschrittWidth
    25. End Function
    26. Private Sub berechne_Panelgröße(ByVal Werta As Integer) Handles Weitergabe.WeitergabeProzent 'Handle
    27. FortschrittWidth = RahmenWidth / Werta
    28. End Sub
    29. End Class



    an der Stelle mit Fragezeichen brauche ich den Wert aus dem SenderObjekt. Ähnlich wie beim Event Mous.Move

    VB.NET-Quellcode

    1. Private Sub btnStart_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
    2. Handles btnStart.MouseMove
    3. XKoordinate = e.X
    4. End Sub


    Bin gerade noch mit den ganzen Beschreibungen aus der msdn Hilfe überfordert. Delegates, EventKlassen etc

    Danke Gruß
    Brichun

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „brichun“ ()

    brichun schrieb:

    Private Sub berechne_Panelgröße() Handles Weitergabe.WeitergabeProzent

    Eine Sub, die ein Event "handlet", sollte klugerweise dieselbe Signatur wie das Event haben - es müssen also dieselben Übergabewerte definiert werden

    Public Event Foo(Byval a as integer, byval b as string)
    -> Private Sub FooHandler(byval a as integer, byval b as string) handles Foo
    Fehler treten keine auf.

    Beim Debuggen springe ich in die Eventtrigger Sub vom Sender. Danach sollte er doch in das Handle vom Empfänger springen. Tut er aber nicht. Als ob das Empfängerobjekt nicht mitbekommt das gerade ein Event getriggert wurde.

    Gruß
    Brichun
    Hier die Form von der das Ganze gesteuert wird.

    Auf der Form ist ein Panel,Button und ein Timer (pnlFortschritt,btnStart,Timer1) Der Startbutton erzeugt das Empfängerobjekt und startet den Timer. Der Timer zählt intervalweise über die Variable AnzahlTicks seinen Aufruf und soll den Wert 100 dabei nicht überschreite. In der Abfrage wird die Trigger-Sub vom Sender aufgerufen. Und dann die Funktion die mir die mir die Eigenschaft des Empfänger-Objekts "FortschrittWidth" zurückgeben soll.

    VB.NET-Quellcode

    1. Public Class ObjektKommunikation
    2. Dim Sendern As New Sender
    3. Dim Empfängern As Empfänger
    4. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    5. Empfängern = New Empfänger(pnlFortschritt.Size.Width) 'EmpfängerObjekt erzeugen und initialisieren
    6. Timer1.Start() 'Starten des Timers
    7. End Sub
    8. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    9. Static AnzahlTicks As Integer
    10. If AnzahlTicks = 100 Then
    11. Timer1.Stop()
    12. Sendern.berechne_prozent(AnzahlTicks)
    13. pnlFortschritt.Width = Empfängern.FortschrittWeite ''''''
    14. AnzahlTicks = 0
    15. Else
    16. AnzahlTicks += 1
    17. Sendern.berechne_prozent(AnzahlTicks)
    18. pnlFortschritt.Width = Empfängern.FortschrittWeite
    19. End If
    20. End Sub
    21. End Class

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

    Du erzeugst einen "sender" mit "new" aber weist dem EventHandler niemals das Event DIESES objekts zu.

    Du verstehst da vermutlich etwas miss ...

    Events sind objektbezogen und nicht klassenbezogen. D.h. du musst einen EventHandler dem Event eines SPEZIFISCHEN Objekts zuweisen. Der reagiert nicht auf alle "gleichen" Events einer Klasse! Deswegen wird das Event auch in diesem Fall gar nicht gefeuert, weil kein Delegate in der InvocationList steht.

    Du verstehst da vermutlich etwas miss ...


    ^^

    Das denke ich nämlich auch, bin noch am Anfang und hab noch mit den einfachsten Dingen zu kämpfen.
    :)


    Ist der Code grundsätzlich falsch -> Stichwort Delegates? Oder erzeuge ich nur das Objekt falsch?
    na es ist schon ungewöhnlich umständlich, einen Sender zu haben, und einen Empfänger, damit man selbst sein panel ausgerechnet bekommt.

    Das Form selbst kann doch empfängern - wozu ein Extra Empfänger-Objekt?

    VB.NET-Quellcode

    1. Public Class ObjektKommunikation
    2. Private WithEvents Sendern As New Sender
    3. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    4. Timer1.Start() 'Starten des Timers ' <-unsinniger Kommentar
    5. End Sub
    6. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    7. Static AnzahlTicks As Integer
    8. If AnzahlTicks = 100 Then
    9. Timer1.Stop()
    10. Sendern.berechne_prozent(AnzahlTicks)
    11. AnzahlTicks = 0
    12. Else
    13. AnzahlTicks += 1
    14. Sendern.berechne_prozent(AnzahlTicks)
    15. End If
    16. End Sub
    17. Private Sub berechne_Panelgröße(ByVal Werta As Integer) Handles Sendern.WeitergabeProzent
    18. FortschrittWidth = RahmenWidth / Werta
    19. pnlFortschritt.Width = FortschrittWidth
    20. End Sub
    21. End Class
    ungetestet.

    Ereignisse dienen normalerweise der Bottom-Up-Kommunikation. Also das Form ruft TopDown Sendern.BerechneProzent auf, und Sendern kann nur ein Event sendern, denn es hat ja kein Form, auf dasses zugreifen könnte.
    Diese Kommunikations-Richtung nenne ich Bottom-Up . gugge Kommunikation in der Programm-Baumstruktur

    gugge auch Alles über Events