Veröffentlicht 13. Juli 201312 j 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
13. Juli 201312 j Vom Prinzip her richtig... allerdings bin ich mir nich so 100%-ig sicher, ob die Events bei der Shared-Geschichte funktionieren. Baue es mal um und probiere es nochmal aus...
13. Juli 201312 j 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
13. Juli 201312 j 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.
13. Juli 201312 j Autor Oh Sorry. Werde das nachher mal testen und berichten. Danke für die Hilfe. Gruß Andreas
13. Juli 201312 j 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
13. Juli 201312 j Autor Hey, ich habs kappiert! anstatt "Dim k As New konto", besser "k = new konto" So klappt es auch, vielen dank noch mal für deine Hilfe. Werde die bestimmt noch mal brauchen Gruß Andreas
14. Juli 201312 j 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 14. Juli 201312 j von lbm1305
14. Juli 201312 j Autor Hey, es gibt mit Sicherheit mehrere wege. Allerdings hatte ich die Aufgabe das so zu lösen. Da ich ein totaler newbie bin kann ich dir das auch nicht sagen. Gruß Andreas
14. Juli 201312 j @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.
14. Juli 201312 j Mir ging es nur darum, wie man Events in VB.Net implementiert. (Best Practice) In C# gibt es (meines Erachtens) nur einen Weg.
14. Juli 201312 j 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" ;-)
15. Juli 201312 j 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.