Anrufbeantworter(OOP & Events )

  • VB.NET
  • .NET (FX) 4.0

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    WithEvents + Handles-Klausel empfängt nur von einem Objekt das Event. Wenn du in btnNeuerApfel_Click() das Objekt (den Apfel) austauscht, dann empfängt die Handles-Klausel halt nur von dem das Event, vom vorherigen logischerweise nicht mehr.

    Wenn du von vielen Objekten die Events abonnieren willst, ist die Handles-Klasusel nicht geeignet, sondern dann musste das AddHandler-Schlüsselwort verwenden, für jedes Objekt.
    Gugge: Alles über Events

    Amro schrieb:

    wills erstmal verstehen

    ganz klar, bin auf deiner Seite, bin auch noch am lernen und verstehen ist das wichtigste...
    Ich muss gestehen, dass ich da auch ab und an noch Probleme hab (allerdings eher beim anwenden), deswegen ist diese Baum-Geschichte von @ErfinderDesRades 'ne coole Idee... und deswegen geb ich meinen Senf dazu :thumbsup:
    Option Strict On!
    Ja das Apfel-LernProjekt find ich auch gut.
    Ich glaub damit kann man noch viel anstellen.

    @EDR bevor ich jetzt das Projekt umbaue und mit AddHandler Arbeite
    Ich dachte mit neuerApfel= New cApfel erzeuge ich ein Objekt.
    1. Warum tausche ich es damit aus?

    2. Kann ich dann in einer Schleife den Baum durchlaufen und den Objekten
    einen AddHandler zuweisen.

    3. Im Baum sind jetzt die Zeiger auf die Objekte oder die Objekte selber drinn ? ?(

    Amro schrieb:

    1. Warum tausche ich es damit aus?

    Weil ja nur die eine Variable neuerApfel existiert und diese ja immer nur ein Objekt "tragen" kann ;)

    Amro schrieb:

    2. Kann ich dann in einer Schleife den Baum durchlaufen und den Objekten
    einen AddHandler zuweisen.

    Ja, kannst du. Allerdings kannst du das auch direkt beim Erstellen des Apfels.

    Amro schrieb:

    3. Im Baum sind jetzt die Zeiger auf die Objekte oder die Objekte selber drinn ?

    Die Zeiger auf die Objekte. Die Objekte werden durch das Hinzufügen in die Liste ja nicht kopiert.

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

    1. VB.NET-Quellcode

      1. WithEvents neuerApfel As cApfel
      2. Private Sub btnNeuerApfel_Click(sender As Object, e As EventArgs) Handles btnNeuerApfel.Click
      3. neuerApfel = New cApfel
      4. '...

      Na offensichtlich ist in zeile#4 doch jetzt eine anderer Apfel der neueApfel, odr?

    2. Wozu solltest du das tun? Abonniere das Event, sobald der neue Apfel erstellt ist, noch bevor der dem Baum zugefügt wird.
      Am besten löschst du zeile#1, denn weder WithEvents noch Handles-Klausel kann dir derzeit helfen.
      Verwende stattdessen eine lokale Variable für den Appel.

    3. Tja, was ist ein Objekt?
      Ja, meinetwegen fasse es so auf, dass Zeiger auf Äpfel da drin sind.
    In VB.NET gibt es dieses WithEvents und Handles.

    Das übernimmt dir die Arbeit, die Events selber zu abonnieren.
    Das heißt in dem Moment:

    VB.NET-Quellcode

    1. neuerApfel = New cApfel

    werden im Hintergrund auf magische Weise für neuerApfel alle Eventhandler hinzugefügt, wofür es auch eine Handles Klausel gibt (In dem Fall Fallen).
    Doch nicht nur das. Nein, auch wenn eine Referenz entfernt wird, werden auch automatisch alle Handler wieder auf magische Weise entfernt. Damit hast du in deinem Beispiel auch immer genau ein Objekt, welches Eventhandler abonniert hat und daher auch nur 1 Event was ausgelöst wird.

    Ich empfehle dir daher WithEvents und Handles erstmal nicht zu verwenden, bis du verstehst, was genau es damit auf sich hat.
    Das ist meine Signatur und sie wird wunderbar sein!
    Klasse cApfel ist unverändert

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. 'WithEvents neuerApfel As cApfel
    4. Private Baum As New List(Of cApfel)
    5. Private Sub btnNeuerApfel_Click(sender As Object, e As EventArgs) Handles btnNeuerApfel.Click
    6. Dim neuerApfel As New cApfel
    7. AddHandler neuerApfel.Fallen, AddressOf neuerApfel_Fallen
    8. Baum.Add(neuerApfel)
    9. Label2.Text &= Baum.Count.ToString & " " & Environment.NewLine
    10. End Sub
    11. Private Sub btnWachse_Click(sender As Object, e As EventArgs) Handles btnWachse.Click
    12. Label1.Text = String.Empty
    13. For Each oApfel As cApfel In Baum
    14. oApfel.ApfelGroesse += 50
    15. Next
    16. End Sub
    17. Private Sub neuerApfel_Fallen() 'Handles neuerApfel.Fallen
    18. Label1.Text &= "Apfel fällt..." & Environment.NewLine
    19. End Sub
    20. End Class


    Also mit AddHandler wird auch das Event der cApfel-Klasse in der Eigenschaft
    ApfelGroesse ausgelöst.

    VB.NET-Quellcode

    1. Public Class cApfel
    2. Public Event Fallen()
    3. Private _apfelGroesse As Single
    4. Public Property ApfelGroesse() As Single
    5. Get
    6. Return _apfelGroesse
    7. End Get
    8. Set(ByVal value As Single)
    9. _apfelGroesse = value
    10. If _apfelGroesse >= 100 Then
    11. RaiseEvent Fallen()
    12. End If
    13. End Set
    14. End Property
    15. End Class


    Was ist der Unterschied ?
    Ok, für mehrere Objekte AddHandler ,
    und für ein Objekt Event /WithEvent .
    Oder?
    Super - du kriegst es offsichtlich gebacken.
    Zu deine Fragen, lies doch einfach das ganze Tut durch, was ich verlinkt habe.
    Oder kurz: WithEvent/Handles ist sog. "syntaktischer Zucker", also eine Bequemlichkeit zum Hinschreiben.
    Im Hintergrund wird da was mit Addhandler gebastelt - so gesehen ist da kein Unterschied.

    Eine zwangsläufige Eigenheit dieser Bequemlichkeit ist, dass man damit nur die Events einzelner Objekte behandeln kann, die WithEvents als KlassenVariable deklariert sind.