Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

  • Autor

Hey, Danke für die Antwort.

Allerdings ist das eine Vorgabe der Aufgabe das es in der Funktion Buchung erfolgen sollte. Eigentlich ist alles vorgegeben. Hat noch jemand eine andere Idee?

Dankeschön

Andreas

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.

  • Autor

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

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

@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.

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" ;-)

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.