Gradebook version 2

Form

' Simple code to test various classes
'
Option Explicit
Private c As CCourse

Private Sub cmdSave_Click()
    c.saveData App.Path & "\" & "courseData.dta"
End Sub

Private Sub cmdShowAssignments_Click()
    Dim assignments As String
    Dim assignmentList() As String
    Dim i As Integer
    
    assignments = c.assignmentNames()
    assignmentList = Split(assignments, vbCrLf)
    
    For i = 0 To UBound(assignmentList)
        lstAssignments.AddItem assignmentList(i)
    Next i

End Sub

Private Sub cmdShowStudents_Click()
    Dim students As String
    Dim studentList() As String
    Dim i As Integer
    
    'students = c.studentNames()
    'studentList = Split(students, vbCrLf)
    
    studentList = c.studentNameArray()
    
    For i = 0 To UBound(studentList)
        lstStudents.AddItem studentList(i)
    Next i
End Sub

Private Sub Command1_Click()
    
    Dim s As CStudent
    Set s = New CStudent
    
    Dim sName As String
    sName = InputBox("Student Name: ")
    
    s.theName = sName
    'MsgBox s.theName
    c.addStudent s
    
End Sub

Private Sub Command2_Click()
    Dim searchName As String
    Dim theStudent As CStudent
    
    searchName = InputBox("Search for which student?")
    
    Set theStudent = c.getStudent(searchName)
    
    If theStudent Is Nothing Then
        MsgBox "Student not found"
    Else
        MsgBox "Student found"
        
    End If
End Sub

Private Sub Command3_Click()
    Dim a As CAssignment
    
    Set a = New CAssignment
    
    Dim aName As String
    Dim aPoints As Integer
    
    aName = InputBox("Assignment name: ")
    aPoints = Val(InputBox("Max Points: "))
    
    a.theName = aName
    a.maxPoints = aPoints
        
    c.addAssignment a
    
End Sub

Private Sub Command4_Click()  'ADD GRADE
    Dim s As CStudent
    Dim a As CAssignment
    Dim score As Integer
    Dim g As CGrade
    Dim assignmentInfo() As String
    
    Dim theName As String
    
    If lstStudents.ListIndex = -1 Then
        theName = InputBox("Student?")
    Else
        theName = lstStudents.List(lstStudents.ListIndex)
    End If
    
    Set s = c.getStudent(theName)
    
    If lstAssignments.ListIndex = -1 Then
        theName = InputBox("Assignment?")
    Else
        theName = lstAssignments.List(lstAssignments.ListIndex)
        assignmentInfo = Split(theName)
        theName = assignmentInfo(0)
    End If
    
    Set a = c.getAssignment(theName)
    
    score = Val(InputBox("Score?"))
    
    Set g = New CGrade
    Set g.assign = a
    g.score = score
    
    s.addGrade g
    
End Sub

Private Sub Command5_Click()
    Dim theName As String
    
    Dim s As CStudent
    
    If lstStudents.ListIndex = -1 Then
        theName = InputBox("Student?")
    Else
        theName = lstStudents.List(lstStudents.ListIndex)
    End If

    Set s = c.getStudent(theName)
    If s Is Nothing Then
        MsgBox "Bad student name: not found"
    Else
     MsgBox theName & "'s Scores: " & vbCrLf & vbCrLf _
                    & s.getScores
    End If
    
End Sub

Private Sub Form_Load()
    Set c = New CCourse
    c.theName = "Math"
End Sub

CCourse

Option Explicit

Private mName As String

Private mStudents() As CStudent
Private mStudentCount As Integer

Private mAssignments() As CAssignment
Private mAssignmentCount As Integer

Public Sub saveData(ByVal filePath As String)

    Dim fileRef As Integer
    fileRef = FreeFile
    
    Open filePath For Output As #fileRef
    
    Write #fileRef, mName
    Write #fileRef, mStudentCount
    Write #fileRef, mAssignmentCount
    writeAssignments (fileRef)
    writeStudents (fileRef)
    
    Close fileRef
    
End Sub

Private Sub writeAssignments(ByVal fileNum As Integer)
    Dim i As Integer
    
    For i = 0 To mAssignmentCount - 1
        mAssignments(i).save fileNum
    Next i
End Sub

Private Sub writeStudents(ByVal fileNum As Integer)
    Dim i As Integer
    
    For i = 0 To mStudentCount - 1
        mStudents(i).save fileNum
    Next i
End Sub

Public Function getStudent(ByVal theName As String) As CStudent
    Dim i As Integer
    Dim found As Boolean
    
    i = 0
    found = False
    
    Do While (i < mStudentCount) And Not found
        If mStudents(i).theName = theName Then
            found = True
            Set getStudent = mStudents(i)
        Else
            i = i + 1
        End If
    Loop
    
    If Not found Then
        Set getStudent = Nothing
    End If
    
End Function

Public Function getAssignment(ByVal theName As String) As CAssignment
    Dim i As Integer
    Dim found As Boolean
    
    i = 0
    found = False
    
    Do While (i < mAssignmentCount) And Not found
        If mAssignments(i).theName = theName Then
            found = True
            Set getAssignment = mAssignments(i)
        Else
            i = i + 1
        End If
    Loop
    
    If Not found Then
        Set getAssignment = Nothing
    End If
    
End Function

Public Sub addStudent(ByVal s As CStudent)
    ReDim Preserve mStudents(mStudentCount)
    Set mStudents(mStudentCount) = s
    mStudentCount = mStudentCount + 1
End Sub

Public Sub addAssignment(ByVal s As CAssignment)
    ReDim Preserve mAssignments(mAssignmentCount)
    Set mAssignments(mAssignmentCount) = s
    mAssignmentCount = mAssignmentCount + 1
End Sub

Public Function studentNames() As String
    Dim names As String
    names = ""
    
    Dim i As Integer
    
    For i = 0 To mStudentCount - 1
        'MsgBox mStudents(i)
        names = names + mStudents(i).theName & vbCrLf
    Next i
    
    studentNames = names
    
End Function

Public Function studentNameArray() As String()
    ReDim names(mStudentCount - 1) As String
    
    Dim i As Integer
    
    For i = 0 To mStudentCount - 1
        'MsgBox mStudents(i)
        names(i) = mStudents(i).theName
    Next i
    
    studentNameArray = names
    
End Function

Public Function assignmentNames() As String
    Dim names As String
    names = ""
    
    Dim i As Integer
    
    For i = 0 To mAssignmentCount - 1
        'MsgBox mStudents(i)
        names = names + mAssignments(i).theName & _
                        Str(mAssignments(i).maxPoints) & vbCrLf
    Next i
    
    assignmentNames = names
    
End Function


Private Sub Class_Initialize()
    mStudentCount = 0
    mAssignmentCount = 0
End Sub

Public Property Get theName() As String
    theName = mName
End Property

Public Property Let theName(ByVal vNewValue As String)
    mName = vNewValue
End Property

Public Function studentCount() As Integer
    studentCount = mStudentCount
End Function

Public Function assignmentCount() As Integer
    assignmentCount = mAssignmentCount
End Function

CAssignment

Option Explicit

Private mName As String
Private mMaxPoints As Integer

Public Sub save(ByVal fileNum As Integer)

    'save assignements
    Write #fileNum, mName, mMaxPoints
    
End Sub

Public Property Get maxPoints() As Integer
    maxPoints = mMaxPoints
End Property

Public Property Let maxPoints(ByVal vNewValue As Integer)
    mMaxPoints = vNewValue
End Property

Public Property Get theName() As String
    theName = mName
End Property

Public Property Let theName(ByVal vNewValue As String)
    mName = vNewValue
End Property

CStudent

Option Explicit

Private mName As String

Private mGrades() As CGrade
Private mGradeCount As Integer

Public Sub save(ByVal fileNum As Integer)

    'save student
    Write #fileNum, mName
    writeGrades (fileNum)
    
End Sub

Private Sub writeGrades(ByVal fileNum As Integer)
    Dim i As Integer
    
    For i = 0 To mGradeCount - 1
    
    Next i
    
End Sub

Public Function getScores() As String
    Dim i As Integer
    Dim scores As String
    
    scores = ""
    
    For i = 0 To mGradeCount - 1
        scores = scores + mGrades(i).assign.theName & " " & _
                            mGrades(i).score & vbCrLf
    Next i
    
    getScores = scores

End Function

Public Property Get theName() As String
    theName = mName
End Property

Public Property Let theName(ByVal vNewValue As String)
    mName = vNewValue
End Property

Public Sub addGrade(ByVal s As CGrade)
    ReDim Preserve mGrades(mGradeCount)
    Set mGrades(mGradeCount) = s
    mGradeCount = mGradeCount + 1
End Sub

Private Sub Class_Initialize()
    mGradeCount = 0
End Sub

CGrade

Option Explicit

Private mScore As Integer
Private mAssignment As CAssignment

Public Property Get score() As Integer
    score = mScore
End Property

Public Property Let score(ByVal vNewValue As Integer)
    mScore = vNewValue
End Property

Public Property Get assign() As CAssignment
    Set assign = mAssignment
End Property

Public Property Set assign(ByVal vNewValue As CAssignment)
    Set mAssignment = vNewValue
End Property

CGB

Option Explicit

Private mCourses() As CCourse
Private mCourseCount As Integer

Public Sub addCourse(ByVal c As CCourse)
    ReDim Preserve mCourses(mCourseCount)
    Set mCourses(mCourseCount) = c
    mCourseCount = mCourseCount + 1
End Sub

Public Function getCourseNames() As String()

    Dim names() As String
    ReDim names(mCourseCount - 1)
    Dim i As Integer
    
    For i = 0 To mCourseCount - 1
        names(i) = mCourses(i).theName
    Next i
    
End Function

Private Sub Class_Initialize()
    mCourseCount = 0
End Sub