Zum Inhalt springen

RaiseEvent wird nicht ausgeführt!


popeye1977

Empfohlene Beiträge

Hallo Liebe Gemeinde,

ich hab mal wieder ein Problem. Ich sitze an einer Aufgabe in der ich Kontobuchungen simulieren soll.

Soweit funktioniert auch alles, nur das RaiseEvent wird nicht ausgeführt, bitte hilft mir und gebt mir ein Tip warum das so ist.

Der Code:


Imports System.Console

Imports System.Windows.Forms

Class Konto

    Private m_Kontonr As String

    Private m_Dispo As Decimal

    Private m_Kontostand As Decimal

    Public Event DispoGrenze(ByVal sender As Object, ByRef Abbrechen As Boolean)

    Sub New(ByVal Kontonr As String, _

    ByVal Dispo As Decimal)

        m_Kontonr = Kontonr

        m_Dispo = Dispo

    End Sub

    ReadOnly Property Kontonr As String

        Get

            Kontonr = m_Kontonr

        End Get

    End Property

    ReadOnly Property Kontostand As Decimal

        Get

            Return m_Kontostand

        End Get


    End Property

    ReadOnly Property Verfügbar As Decimal

        Get

            Verfügbar = m_Kontostand

        End Get

    End Property

    Sub Anzeigen()

        WriteLine("Kontonr:{0,8}, Kontostand:{1,8}, Disporahmen:{2,8}", m_Kontonr, m_Kontostand, m_Dispo)

    End Sub

    Public Function Buchung(ByVal Betrag As Decimal) As Decimal


        Dim ks As Decimal

        Buchung = ks

        ks = Kontostand + Betrag

        m_Kontostand = ks

        If ks < m_Dispo Then

            Dim Abbrechen As Boolean = True


            RaiseEvent DispoGrenze(Me, Abbrechen) 'hier komme ich nicht weiter


            WriteLine("Zu wenig geld")


        End If


    End Function

End Class

Public Class Test

    Shared WithEvents k As Konto

    Shared Sub Main()

        Dim k As New Konto("123", "-3000")

        k.Anzeigen()

        ReadLine()

        k.Buchung(2000)

        k.Anzeigen()

        ReadLine()

        k.Buchung(-4000)

        k.Anzeigen()

        ReadLine()

        k.Buchung(-2000)

        k.Anzeigen()

        ReadLine()


    End Sub

    Shared Sub k_DispoGrenze(ByVal sender As Object, ByRef Abbrechen As Boolean) Handles k.DispoGrenze

        Dim s As String = "Der gewünschte Betrag kann nicht abgehoben werden," _

                          & "da der Dispositionsrahmen überschritten wurde." & vbCrLf & vbCrLf _

                          & "Sie können noch" & CType(sender, Konto).Verfügbar & "Euro" & vbCrLf _

                          & "abheben. " & vbCrLf _

                          & "Betrag abheben (JA), Abbrechen (NEIN)."

        Dim Antwort As DialogResult


        Antwort = MessageBox.Show(s, "Buchung", MessageBoxButtons.OKCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2)


        If Antwort = DialogResult.OK Then

            Abbrechen = False

        End If

    End Sub

End Class

Danke schon mal und Grüße

Andrea

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast mich nicht richtig verstanden.

Ich hatte gemeint, dass das Schlüsselwort "Shared" hier sehr wahrscheinlich genau das Probelm verursacht, was du eben hast. "Shared" bedeutet nämlich, dass diese Methoden auch außerhalb einer normalen Klasseninsatanz aufrufbar sind.

Mir ist eben auch noch was aufgefallen:

Das Konto k wird zweimal deklariert... In der Main Methode wird eine vollkommen andere Instanz verwendet... Wenn du da wirklich das Event geraist bekommen willst, muss du das ändern und schreiben k = new Konto(...). Schon alleine deswegen kann es nicht funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey,

leider komme ich nicht auf einen grünen zweig.

Kannst du mir das etwas näher erklären.

Das Konto k wird zweimal deklariert... In der Main Methode wird eine vollkommen andere Instanz verwendet... Wenn du da wirklich das Event geraist bekommen willst, muss du das ändern und schreiben k = new Konto(...). Schon alleine deswegen kann es nicht funktionieren.

Entweder ich seh den Wald vor lauter bäumen nicht, oder ich bin echt zu blöd um das zu kappieren. Hab mir das ja auch selber angetan und nun muss ich zusehen wie ich klar komme und auf hilfe hoffen :)

Gruß

Andreas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist das die eigentliche Vorgehensweise bei der Implementierung von Events bei VB.NET?

Ich dachte immer, Events werden mit AddHandler registriert.

bspw.


    Sub Main()


        Dim foo As Foo = New Foo()

        'Dim foo As New Foo()


        AddHandler foo.FooEvent, AddressOf FooEventHandler


        foo.DoSomething()


        RemoveHandler foo.FooEvent, AddressOf FooEventHandler


        Console.ReadKey()


    End Sub


    Private Sub FooEventHandler(ByVal sender As Object, ByVal e As DispoGrenzeEventArgs)


        Console.WriteLine("FooEvent: {0}", e.Value)


    End Sub


Public Class Foo


    Public Event FooEvent As EventHandler(Of DispoGrenzeEventArgs)


    Public Sub DoSomething()


        RaiseEvent FooEvent(Me, New DispoGrenzeEventArgs(True))


    End Sub


End Class

Bearbeitet von lbm1305
Link zu diesem Kommentar
Auf anderen Seiten teilen

@lbm1305: Wie popeye1977 schreibt ist es richtig. Es gibt viele Wege, die nach Rom führen und man muss daraus halt den auswählen, der am Besten zur eigenen Situation passt... dein beschriebener Fall würde sich z.B. am Besten dann anbieten, wenn man den Event-Handler nur vorrübergehend braucht, später dann aber nicht mehr. Im Fall von popeye1977 wäre das dann der Fall, dass man zu Begin den Handler setzt und die ganze Zeit darauf zurückgreift.

Link zu diesem Kommentar
Auf anderen Seiten teilen

dein beschriebener Fall würde sich z.B. am Besten dann anbieten, wenn man den Event-Handler nur vorrübergehend braucht, später dann aber nicht mehr. Im Fall von popeye1977 wäre das dann der Fall, dass man zu Begin den Handler setzt und die ganze Zeit darauf zurückgreift.

Nicht benötigte Events sollten deregistriert werden, was oft vergessen wird. Und das wird in dem Beispiel des TE nicht durchgeführt.

Wie bereits geschrieben geht es hier nicht um das Kritisieren, sondern nur um ein mögliches "Best Practice" ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit AddHandler bist du vorallem auch flexibler, die Handles... variante ist z.B. bei dynamischer Programmierung wenn du mehrere Komponenten in einer schleife los lässt die alle ein bestimmtes Event auf einen bestimmten Handler mappen sollen etwas schwierig, geht sicher irgendwie aber keine ahnung wie^^. Handles ist denk ich einfach nur die (bei statischer Programmierung) übersichtlichere

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...