Hallo!
Der Konstruktor der Klasse dient zum Erstellen eines neuen Kontos.
Der Stand ist deshalb zunächst 0. Für Buchungen ist die
entsprechende Methode zu verwenden.
Der freie Verfügungsrahmen eines Kontos ergibt sich als
Differenz zwischen Kontostand und Dispolimit.
Im Rahmen der Ereignisbehandlung ist eine Fallunterscheidung
zweckmäßig: kann noch ein Restbetrag vom Konto abgebucht
werden oder ist das Dispolimit erreicht.
Die Angaben im Konsolenfenster sollten nicht durch Kommas getrennt
werden (Geldbeträge!) - besser wäre eine geeignete Formatierung.
Bei der Gestaltung von Event-Parametern könnte das im Framework übliche
Vorgehen gewählt werden (Event-Bezeichnung: "DispoLimit_Überschritten").
Public Class CKonto
Public Class KontoEventargs
Inherits System.EventArgs
Dim m_Verfügungsrahmen As Decimal
Dim m_Kommentar As String
Public Sub New(ByVal sender As Object, _
ByVal Verfügungsrahmen As Decimal, _
ByVal Kommentar As String)
m_Verfügungsrahmen = Verfügungsrahmen
m_Kommentar = Kommentar
Abbrechen = False
End Sub
Public ReadOnly Property Verfügungsrahmen As Decimal
Get
Return m_Verfügungsrahmen
End Get
End Property
Public ReadOnly Property Kommentar As String
Get
Return m_Kommentar
End Get
End Property
Public Property Abbrechen As Boolean
End Class
Private m_Kontonr As String
Private m_Kontostand As Decimal
Private m_DispoLimit As Decimal
Public Event DispoGrenze(ByVal sender As Object, _
ByVal e As KontoEventargs)
Public Sub New(ByVal Kontonr As String, _
ByVal DispoLimit As Decimal)
'Hier wäre zu prüfen, ob diese Kontonummer bereits existiert
m_Kontonr = Kontonr
m_Kontostand = 0D
If DispoLimit > 0D Then
Throw New ArgumentException("Dispo-Grenze ist größer als 0.00")
End If
m_DispoLimit = DispoLimit
End Sub
Public Sub Buchung(ByVal Betrag As Decimal)
If Betrag + m_Kontostand >= m_DispoLimit Then
m_Kontostand += Betrag
Else
'Verfügungsrahmen kann nicht kleiner 0 sein
Dim kea As New KontoEventargs _
(Me, Math.Max(0, m_Kontostand - m_DispoLimit), GetInfotext)
RaiseEvent DispoGrenze(Me, kea)
If Not kea.Abbrechen Then
'Betrag oder max. Verfügungsbetrag (=> Stand 0)
m_Kontostand = Math.Max(Betrag + m_Kontostand, m_DispoLimit)
End If
End If
End Sub
Private Function GetInfotext() As String
Dim Knr_Out As String = m_Kontonr & StrDup(12 - m_Kontonr.Length, " ")
Dim Warnung As String = ""
If m_Kontostand < 0 Then Warnung = " !!!"
Return _
"Kontonr: " & Knr_Out & _
" Kontostand: " & String.Format("{0,15:C}", m_Kontostand) & _
" Disporahmen: " & Format(m_DispoLimit, "0.00 €") & Warnung
End Function
Public Sub Ausgabe()
Console.WriteLine(GetInfotext() & vbCrLf)
End Sub
End Class
Class KontoTest
Shared WithEvents k As CKonto
Shared Sub Main()
k = New CKonto("123-456", -3000)
With k
.Ausgabe()
.Buchung(2000) 'Erstbuchung nach Kontoeröffnung
.Ausgabe()
.Buchung(-1000)
.Ausgabe()
.Buchung(-3000)
.Ausgabe()
End With
End Sub
Private Shared Sub k_DispoGrenze(ByVal sender As Object, _
ByVal e As CKonto.KontoEventargs) Handles k.DispoGrenze
Dim s As String = _
e.Kommentar & vbCrLf & vbCrLf & _
"Der gewünschte Betrag kann nicht abgehoben werden," _
& " da der Dispositionsrahmen überschritten wurde." _
& vbCrLf & vbCrLf
If e.Verfügungsrahmen > 0 Then
s &= "Sie können noch " & e.Verfügungsrahmen & " € abheben." _
& vbCrLf & "Diesen Betrag abheben (Ja), Abbruch (Nein)."
Dim Antwort As DialogResult = _
MessageBox.Show(s, "Buchungsinformation", _
MessageBoxButtons.YesNo, _
MessageBoxIcon.Exclamation, _
MessageBoxDefaultButton.Button2)
e.Abbrechen = (Antwort = DialogResult.No)
Else
MsgBox(s, MsgBoxStyle.Critical, "Buchungsinformation")
e.Abbrechen = True
End If
End Sub
End Class |