popeye1977 Geschrieben 13. Juli 2013 Teilen Geschrieben 13. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
R1I9C8H5I Geschrieben 13. Juli 2013 Teilen Geschrieben 13. Juli 2013 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
popeye1977 Geschrieben 13. Juli 2013 Autor Teilen Geschrieben 13. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
R1I9C8H5I Geschrieben 13. Juli 2013 Teilen Geschrieben 13. Juli 2013 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
popeye1977 Geschrieben 13. Juli 2013 Autor Teilen Geschrieben 13. Juli 2013 Oh Sorry. Werde das nachher mal testen und berichten. Danke für die Hilfe. Gruß Andreas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
popeye1977 Geschrieben 13. Juli 2013 Autor Teilen Geschrieben 13. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
popeye1977 Geschrieben 13. Juli 2013 Autor Teilen Geschrieben 13. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. Juli 2013 Teilen Geschrieben 14. Juli 2013 (bearbeitet) 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 2013 von lbm1305 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
popeye1977 Geschrieben 14. Juli 2013 Autor Teilen Geschrieben 14. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
R1I9C8H5I Geschrieben 14. Juli 2013 Teilen Geschrieben 14. Juli 2013 @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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. Juli 2013 Teilen Geschrieben 14. Juli 2013 Mir ging es nur darum, wie man Events in VB.Net implementiert. (Best Practice) In C# gibt es (meines Erachtens) nur einen Weg. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 14. Juli 2013 Teilen Geschrieben 14. Juli 2013 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" ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 15. Juli 2013 Teilen Geschrieben 15. Juli 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.