AW: Zeit für die nächste Stufe
08.10.2021 22:39:52
Yal
Die Basics: https://codekabinett.com/rdumps.php?Lang=1&targetDoc=objekte-klassen-vba-programmierung
Erste Code Kommt in einem Klassen-Modul, das clsPlaer heissen soll:
Private pName As String
Private pPlayDays As Collection
Private Sub Class_Initialize()
Set pPlayDays = New Collection
End Sub
Property Let Name(PlayerName As String)
'name kann nur einmal gesetzt werden
If pName = "" Then
pName = PlayerName
End If
End Property
Property Get Name() As String
Name = pName
End Property
Public Property Get Punktzahl() As Long
'Nur einen "Get", weil Read-Only
Dim PD As clsPlayDay
For Each PD In pPlayDays
Punktzahl = Punktzahl + PD.Punktzahl
Next
End Property
Public Function PlayDay_Add(Datum As Datum, Punktzahl As Long) As clsPlayDay
'Es darf kein PlayDay doppelt angelgt werden
Dim PD As clsPlayDay
On Error Resume Next
Set PD = Playdays(Datum)
If PD Is Nothing Then
Set PD = New clsPlayDay
PD.Datum = Datum
PD.Punktzahl = Punktzahl1
pPlayDays.Add PD, Format(Datum, "DD.MM.YYYY")
Set PlayDay_Add = PD
End If
End Function
Dann die Klasse clsPlayers (davon nur einenObjekt instanzieren):
Private pPlayers As Collection
Private Sub Class_Initialize()
Set pPlayers = New Collection
End Sub
Public Property Get Count() As Long
Count = pPlayers.Count
End Property
Public Function Player_Add(PlayerName As String) As clsPlayer
Dim P As clsPlayer
On Error Resume Next
Set P = pPlayers(PlayerName)
If P Is Nothing Then
Set P = New clsPlayer
P.Name = PlayerName
pPlayers.Add P, PlayerName
Set Player_Add = P
End If
End Function
Public Function GetTopPlayer() As clsPlayer
Dim P As clsPlayer
Dim TopP As clsPlayer
For Each P In pPlayers
If P.Punktzahl > TopP.Punktzahl Then Set TopP = P
Next
Set GetTopPlayer = TopP
End Function
Dann die clsPlayDay, die Klasse zur Objekte, das nach meinem Design (nicht der Beste. Quick eben), nur in der Collection eines clsPlayer vorkommen:
Private pDatum As Date
Private pPunktZahl As Long
Property Let Datum(PlayDayDate As Date)
'Datum darf nicht geändert werden
If CLng(pDatum) = 0 Then
pDatum = PlayDayDate
End If
End Property
Property Get Datum() As Date
Datum = pDatum
End Property
Property Let Punktzahl(PktZahl As Long)
'PunktZahl darf nicht nachträglich geändert werden
If pPunktZahl = 0 Then
pPunktZahl = PktZahl
End If
End Property
Ansonsten kannst Du nach Pattern Design suchen. EIn Bischen too much am Anfang, aber irgendwann kommt man auch selber drauf, was Sinn ergibt oder nicht.
VG
Yal