Grade Keeper (and reports)
#1
Star 
So, deciding to abandon the GUI ideas, I went back to making a different style. Spent the last two days drawing and programming in some of my ideas (and recycling a little of my old code). I hope to finish up the student side before building the gradebook side. Next time, I hope to print the database to .txt files for easing organizing and printing info (pdf would be better but not sure I am ready for that) for those various teacher clipboards. In the end, I hope to print weekly, monthly, and term grade reports by students to make it easier keeping parents informed what homework is missing or completed poorly. A long way to go but it would be nice to share with the community  Big Grin

Enjoy!

I'll post the code here but I do use pictures for the sake of my programming simplicity so feel free to download the attached .zip for the full thing (contents .bas, .ttf. .png files only)

[Image: image.png]

Code: (Select All)
'===========================================
'| Grade Keeper Version 3 Release V:.1     |
'| Updated: November 2022                  |
'| Rebuild of V1, code cleanup             |
'| Contact: NasaCow @                      |
'===========================================
'$DEBUG
'$DYNAMIC
$NOPREFIX
OPTION EXPLICIT
OPTION BASE 1

CONST FALSE = 0, TRUE = NOT FALSE

TYPE NameListType
    PinYinName AS STRING * 20
    FirstName AS STRING * 20
    MiddleName AS STRING * 20
    LastName AS STRING * 20
    Year AS INTEGER
    Month AS INTEGER
    Day AS INTEGER
    HouseColor AS STRING * 10
    MomName AS STRING * 40
    MomPhone AS STRING * 20 'Saved as string to support symbols and international prefixes
    MomEmail AS STRING * 80
    DadName AS STRING * 40
    DadPhone AS STRING * 20
    DadEmail AS STRING * 80
END TYPE

DIM SHARED AS NameListType NameList(10) 'Student list
DIM SHARED AS LONG ScreenPointer(5), Arial8, Arial12, Arial16 'Screen & font handles
DIM SHARED AS LONG Arial24, Arial32, Arial48, Arial60 'Font handles
DIM SHARED AS LONG Intro, AboutPic, Current, CheckSelect, Report 'Picture handles
DIM SHARED AS LONG NewNameEntry, DisplayData, CurrentLayout, Generic 'Picture handles
DIM SHARED AS INTEGER Counter 'Throw-away counter
DIM SHARED AS INTEGER NumberOfStudents
DIM SHARED AS INTEGER Pointer 'Used for menu selections
DIM SHARED AS BIT SelectFlag 'Used to prevent graphic glitches and/or escape loops



'Loading needed screen space
TITLE "Grade Keeper Alpha Version 0.1"
DISPLAY 'Turn off Auto Display
SCREEN NEWIMAGE(1280, 720, 32)
SCREENMOVE 0, 0

ScreenPointer(1) = DEST 'Main screen

FOR Counter = 2 TO 5 'Screen 5 is exclusive use of CENTERNEWSCREEN text printing
    ScreenPointer(Counter) = NEWIMAGE(1280, 720, 32)
NEXT Counter

'Loading assets
AboutPic = LOADIMAGE("data/assets/about.png", 32)
CheckSelect = LOADIMAGE("data/assets/check.png", 32)
Current = LOADIMAGE("data/assets/current.png", 32)
CurrentLayout = LOADIMAGE("data/assets/cslayout.png", 32)
DisplayData = LOADIMAGE("data/assets/showname.png", 32)
Generic = LOADIMAGE("data/assets/blank.png", 32)
Intro = LOADIMAGE("data/assets/title.png", 32)
NewNameEntry = LOADIMAGE("data/assets/newname.png", 32)
Report = LOADIMAGE("data/assets/reports.png", 32)

'Font sizes
Arial8 = LOADFONT("data/assets/arial.ttf", 8) 'For grades and later use
Arial12 = LOADFONT("data/assets/arial.ttf", 12) 'For grades and later use
Arial16 = LOADFONT("data/assets/arial.ttf", 16) 'For grades and later use
Arial24 = LOADFONT("data/assets/arial.ttf", 24)
Arial32 = LOADFONT("data/assets/arial.ttf", 32)
Arial48 = LOADFONT("data/assets/arial.ttf", 48)
Arial60 = LOADFONT("data/assets/arial.ttf", 60)


DO: MAINMENU: LOOP 'Main program loop

SYSTEM

errorhandle: 'Error handling
DIM AS STRING ErrorCode
ErrorCode = "Error" + STR$(ERR) + " on program file line" + STR$(ERRORLINE) + ". Program will end."
PRINTCENTERNEWSCREEN ErrorCode, 48, 1
SYSTEM

SUB MAINMENU
    Pointer = 0: SelectFlag = FALSE
    PAUSE (.15)
    SCREEN ScreenPointer(1)
    DO
        CLS
        PUTIMAGE (0, 0), Intro
        SELECT CASE Pointer
            CASE 0: PUTIMAGE (375, 221), CheckSelect
            CASE 1: PUTIMAGE (375, 292), CheckSelect
            CASE 2: PUTIMAGE (375, 365), CheckSelect
            CASE 3: PUTIMAGE (375, 437), CheckSelect
            CASE 4: PUTIMAGE (375, 510), CheckSelect
        END SELECT
        DISPLAY
        IF SelectFlag THEN PAUSE (.15) 'Avoid double press delay
        SelectFlag = FALSE
        'Checking for key press (keyboard)
        IF KEYDOWN(CVI(CHR$(0) + "H")) THEN ' up case
            IF Pointer = 0 THEN Pointer = 4 ELSE Pointer = Pointer - 1
            SelectFlag = TRUE
        END IF
        IF KEYDOWN(CVI(CHR$(0) + "P")) THEN 'down case
            IF Pointer = 4 THEN Pointer = 0 ELSE Pointer = Pointer + 1
            SelectFlag = TRUE
        END IF
    LOOP UNTIL KEYDOWN(13) OR KEYDOWN(32) 'Return/Spacebar to select
    SELECT CASE Pointer
        CASE 0: CURRENTCLASS
        CASE 1: 'ARCHIVEDCLASS
        CASE 2: 'OPTIONS
        CASE 3: ABOUT
        CASE 4: SYSTEM
    END SELECT
END SUB

SUB CURRENTCLASS
    PAUSE (.15)
    Pointer = 0
    DO
        DO
            CLS 'Prepare and draw the menu
            PUTIMAGE (0, 0), Current
            SELECT CASE Pointer
                CASE 0: PUTIMAGE (260, 190), CheckSelect
                CASE 1: PUTIMAGE (260, 280), CheckSelect
                CASE 2: PUTIMAGE (260, 380), CheckSelect
            END SELECT
            DISPLAY
            IF SelectFlag THEN PAUSE (.125) 'Avoid double press delay
            SelectFlag = FALSE
            'Checking for key press (keyboard)
            IF KEYDOWN(CVI(CHR$(0) + "H")) THEN ' up case
                IF Pointer = 0 THEN Pointer = 2 ELSE Pointer = Pointer - 1
                SelectFlag = TRUE
            END IF
            IF KEYDOWN(CVI(CHR$(0) + "P")) THEN 'down case
                IF Pointer = 2 THEN Pointer = 0 ELSE Pointer = Pointer + 1
                SelectFlag = TRUE
            END IF
        LOOP UNTIL KEYDOWN(13) OR KEYDOWN(32) 'Return or Space bar to select
        'Execute choice
        SELECT CASE Pointer
            CASE 0: 'LOADGRADES
            CASE 1: LOADNAMES
        END SELECT
    LOOP UNTIL Pointer = 2
END SUB

SUB LOADGRADES 'Future release

END SUB

SUB LOADNAMES
    DIM AS INTEGER Rows, Columns, RowStep, ColumnStep, StartX, StartY
    DIM AS STRING FirstName, LastName
    DIM AS INTEGER Highlight(500000)
    DIM AS BIT Selected, Back

    IF FILEEXISTS("data/current/namelist.gkn") THEN 'Display current list if it exists
        LOADSTUDENTDATA
        FONT Arial32
        Counter = 1: Rows = 3: Columns = 15: RowStep = FONTHEIGHT(Arial32): ColumnStep = 615
        Back = FALSE
        CLS
        PUTIMAGE (0, 0), CurrentLayout 'Simple box layout
        WHILE Counter <= NumberOfStudents 'Prints student names to screen
            FirstName = TRIM$(NameList(Counter).FirstName)
            LastName = TRIM$(NameList(Counter).LastName)
            LOCATE Rows, Columns: PRINT FirstName + " " + LastName
            Counter = Counter + 1
            Rows = Rows + 1
        WEND
        LOCATE Rows, Columns: PRINT "Add student to class"
        LOCATE Rows + 1, Columns: PRINT "Whole class data reports"
        LOCATE Rows + 2, Columns: PRINT "Go back to the prior screen"
        DO 'Keep looping until explicitly told to return to prior menu
            Rows = 3: StartX = 4: StartY = (Rows - 1) * FONTHEIGHT(Arial32)
            Counter = 1: Selected = FALSE
            PAUSE (.15)
            GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
            PUT (StartX, StartY), Highlight(), PRESET
            DO 'GUI student interface selection
                DISPLAY
                IF KEYDOWN(18432) THEN 'up case
                    IF Counter = 1 THEN 'Top of table check
                        'Do nothing, ignore key press
                    ELSE 'Process the change
                        GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
                        PUT (StartX, StartY), Highlight(), PRESET
                        StartY = StartY - RowStep
                        GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
                        PUT (StartX, StartY), Highlight(), PRESET
                        Counter = Counter - 1
                        PAUSE (.15)
                    END IF
                END IF
                IF KEYDOWN(20480) THEN 'down case
                    IF NumberOfStudents + 3 = Counter THEN 'Bottom of table check
                        'Do nothing, ignore key press
                    ELSE 'Process the change
                        GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
                        PUT (StartX, StartY), Highlight(), PRESET
                        StartY = StartY + RowStep
                        GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
                        PUT (StartX, StartY), Highlight(), PRESET
                        Counter = Counter + 1
                        PAUSE (.15)
                    END IF
                END IF
                IF KEYDOWN(13) OR KEYDOWN(32) THEN 'Select a choice and exit the loop
                    Selected = TRUE
                    PAUSE (.15)
                    GET (StartX, StartY)-(619, StartY + RowStep), Highlight()
                    PUT (StartX, StartY), Highlight(), PRESET
                END IF
            LOOP WHILE NOT Selected
            SELECT CASE Counter 'Process selected choice
                CASE 1 TO NumberOfStudents:
                CASE NumberOfStudents + 1:
                CASE NumberOfStudents + 2: STUDENTREPORTS
                CASE NumberOfStudents + 3: Back = TRUE 'Return to prior meny
            END SELECT
        LOOP UNTIL Back
        PAUSE (.15)
    ELSE
        CREATESTUDENTLIST
    END IF

END SUB

SUB STUDENTREPORTS
    DIM Back AS BIT

    SCREEN ScreenPointer(2)
    Counter = 0
    SelectFlag = FALSE: Back = FALSE
    PAUSE (.15)
    DO
        DO
            CLS
            PUTIMAGE (0, 0), Report
            SELECT CASE Counter
                CASE 0: PUTIMAGE (285, 170), CheckSelect
                CASE 1: PUTIMAGE (285, 240), CheckSelect
                CASE 2: PUTIMAGE (285, 310), CheckSelect
                CASE 3: PUTIMAGE (285, 380), CheckSelect
                CASE 4: PUTIMAGE (285, 455), CheckSelect
                CASE 5: PUTIMAGE (285, 525), CheckSelect
            END SELECT
            DISPLAY
            IF SelectFlag THEN PAUSE (.15) 'Avoid double press delay
            SelectFlag = FALSE
            'Checking for key press (keyboard)
            IF KEYDOWN(18432) THEN ' up case
                IF Counter = 0 THEN Counter = 5 ELSE Counter = Counter - 1
                SelectFlag = TRUE
            END IF
            IF KEYDOWN(20480) THEN 'down case
                IF Counter = 5 THEN Counter = 0 ELSE Counter = Counter + 1
                SelectFlag = TRUE
            END IF
        LOOP UNTIL KEYDOWN(13) OR KEYDOWN(32) 'Return of Spacebar to select
        SELECT CASE Counter
            CASE 0:
            CASE 1:
            CASE 2:
            CASE 3:
            CASE 4:
            CASE 5: Back = TRUE
        END SELECT
        PAUSE (.15)
    LOOP UNTIL Back
    SCREEN ScreenPointer(1)
END SUB

SUB ARCHIVEDCLASS 'Prior year record keeping - Future release

END SUB

SUB OPTIONS 'For configuration & archiving/restoring existing classes - Future release

END SUB

SUB ABOUT
    CLS
    PUTIMAGE (0, 0), Generic
    FONT Arial60: LOCATE 2, 1280 / 2 - PRINTWIDTH("Grade Keeper") / 2: PRINT "Grade Keeper"
    FONT Arial32: LOCATE 5, 1280 / 2 - PRINTWIDTH("Alpha Version 0.1") / 2: PRINT "Alpha Version 0.1"
    FONT Arial24: LOCATE 15, 50: PRINT "Public alpha release #1. Built November 27th, 2022. Released as non-commercial and share alike as defined"
    LOCATE 16, 50: PRINT "by the creative commons 4.0. May not apply any additional legal terms nor technological measures that"
    LOCATE 17, 50: PRINT "legally restrict others from doing anything that the license permits. Please contact NasaCow at"
    LOCATE 18, 50: PRINT "NasaCowPro@gmail.com with any questions or feedback. No warranty or guarantee explicitly or implicitly"
    LOCATE 19, 50: PRINT "made with the use of this software."
    LOCATE 28, 50: PRINT "Press any key to go back..."
    DISPLAY
    SLEEP
END SUB

'===========Support Subs/Functions===========
'Used for initial database building of student data
SUB CREATESTUDENTLIST

    DIM AS STRING * 1 AddAnother, Correct
    DIM AS NameListType NewData

    PAUSE (.15)
    FONT Arial24
    OPEN "data/current/namelist.gkn" FOR OUTPUT AS #1 'For writing the master name list data
    Counter = 1
    AUTODISPLAY

    DO 'Gathering data about students
        CLS
        PUTIMAGE (0, 0), NewNameEntry
        LOCATE 7, 140: PRINT Counter 'Built with Arial24
        LOCATE 7, 280: INPUT "", NewData.PinYinName
        DO
            LOCATE 7, 710: PRINT "          "
            LOCATE 7, 710: INPUT "", NewData.Month
        LOOP UNTIL NewData.Month > 0 AND NewData.Month < 13
        DO
            LOCATE 7, 780: PRINT "          "
            LOCATE 7, 780: INPUT "", NewData.Day
        LOOP UNTIL NewData.Day > 0 AND NewData.Day < 32
        DO
            LOCATE 7, 840: PRINT "          "
            LOCATE 7, 840: INPUT "", NewData.Year
        LOOP UNTIL NewData.Year > 1990 AND NewData.Year < 2100
        LOCATE 7, 970: INPUT "", NewData.HouseColor
        LOCATE 12, 55: INPUT "", NewData.FirstName
        LOCATE 12, 400: INPUT "", NewData.MiddleName
        LOCATE 12, 780: INPUT "", NewData.LastName
        LOCATE 17, 55: INPUT "", NewData.MomName
        LOCATE 17, 400: INPUT "", NewData.MomPhone
        LOCATE 17, 780: INPUT "", NewData.MomEmail
        LOCATE 22, 55: INPUT "", NewData.DadName
        LOCATE 22, 400: INPUT "", NewData.DadPhone
        LOCATE 22, 780: INPUT "", NewData.DadEmail
        DO
            LOCATE 27, 430: PRINT "    "
            LOCATE 27, 430: INPUT "", Correct
            Correct = UCASE$(Correct)
        LOOP UNTIL Correct = "Y" OR Correct = "N"
        DO
            LOCATE 27, 690: PRINT "    "
            LOCATE 27, 690: INPUT "", AddAnother
            AddAnother = UCASE$(AddAnother)
        LOOP UNTIL AddAnother = "Y" OR AddAnother = "N"
        IF Correct = "Y" THEN
            WRITE #1, NewData.PinYinName
            WRITE #1, NewData.Month
            WRITE #1, NewData.Day
            WRITE #1, NewData.Year
            WRITE #1, NewData.HouseColor
            WRITE #1, NewData.FirstName
            WRITE #1, NewData.MiddleName
            WRITE #1, NewData.LastName
            WRITE #1, NewData.MomName
            WRITE #1, NewData.MomPhone
            WRITE #1, NewData.MomEmail
            WRITE #1, NewData.DadName
            WRITE #1, NewData.DadPhone
            WRITE #1, NewData.DadEmail
            Counter = Counter + 1
        ELSE
            PRINTCENTERNEWSCREEN "Data not written. Please re-enter data.", 32, 1
            AUTODISPLAY
            FONT Arial24
            AddAnother = "Y"
        END IF
    LOOP UNTIL AddAnother = "N"
    DISPLAY
    CLOSE #1
    PRINTCENTERNEWSCREEN "Data written successfully!", 32, 1
END SUB

'Loads the student data into memory. Ensure file exists before calling
SUB LOADSTUDENTDATA
    NumberOfStudents = 0
    OPEN "data/current/namelist.gkn" FOR INPUT AS #1
    WHILE NOT EOF(1)
        NumberOfStudents = NumberOfStudents + 1
        IF UBOUND(namelist) = NumberOfStudents THEN REDIM PRESERVE NameList(NumberOfStudents + 1) AS NameListType
        INPUT #1, NameList(NumberOfStudents).PinYinName
        INPUT #1, NameList(NumberOfStudents).Month
        INPUT #1, NameList(NumberOfStudents).Day
        INPUT #1, NameList(NumberOfStudents).Year
        INPUT #1, NameList(NumberOfStudents).HouseColor
        INPUT #1, NameList(NumberOfStudents).FirstName
        INPUT #1, NameList(NumberOfStudents).MiddleName
        INPUT #1, NameList(NumberOfStudents).LastName
        INPUT #1, NameList(NumberOfStudents).MomName
        INPUT #1, NameList(NumberOfStudents).MomPhone
        INPUT #1, NameList(NumberOfStudents).MomEmail
        INPUT #1, NameList(NumberOfStudents).DadName
        INPUT #1, NameList(NumberOfStudents).DadPhone
        INPUT #1, NameList(NumberOfStudents).DadEmail
    WEND
    CLOSE #1
END SUB

'Prints a short pop-up message to the user
SUB PRINTCENTERNEWSCREEN (ToPrint AS STRING, FontHandle AS INTEGER, CurrentScreen AS INTEGER)
    DIM AS INTEGER Rows, Columns

    SCREEN ScreenPointer(5) 'Save prior screen
    SELECT CASE FontHandle
        CASE 8: FONT Arial8
        CASE 12: FONT Arial12
        CASE 16: FONT Arial16
        CASE 24: FONT Arial24
        CASE 32: FONT Arial32
        CASE 48: FONT Arial48
        CASE 60: FONT Arial60
        CASE ELSE: BEEP
            EXIT SUB
    END SELECT
    CLS
    PUTIMAGE (0, 0), Generic
    Rows = (HEIGHT / FONTHEIGHT) / 2
    Columns = 1280 / 2 - PRINTWIDTH(ToPrint) / 2
    LOCATE Rows, Columns: PRINT ToPrint
    Columns = 1280 / 2 - PRINTWIDTH("Press any key.") / 2
    LOCATE Rows + 2, Columns: PRINT "Press any key."
    BEEP
    DISPLAY
    SLEEP
    PAUSE .15
    SCREEN ScreenPointer(CurrentScreen) 'Restore prior screen before call
END SUB

'Simple timer delay with keyboard flush - Used to avoid double key presses
SUB PAUSE (Dlay)
    DIM Start AS DOUBLE
    Start = TIMER
    IF Start > TIMER THEN Start = Start - 86400 'Midnight issue
    DO WHILE Start + Dlay >= TIMER: LOOP
    KEYCLEAR 'Clear any key press
END SUB


Attached Files
.zip   Grade Keeper Nov 27.zip (Size: 983.87 KB / Downloads: 39)
Reply


Messages In This Thread
Grade Keeper (and reports) - by NasaCow - 11-27-2022, 11:28 AM
RE: Grade Keeper (and reports) - by mnrvovrfc - 11-27-2022, 11:36 AM
RE: Grade Keeper (and reports) - by NasaCow - 11-27-2022, 11:49 AM
RE: Grade Keeper (and reports) - by bplus - 11-27-2022, 03:25 PM
RE: Grade Keeper (and reports) - by bplus - 11-27-2022, 04:05 PM
RE: Grade Keeper (and reports) - by NasaCow - 12-09-2022, 12:54 PM
RE: Grade Keeper (and reports) - by NasaCow - 04-17-2023, 12:30 PM
RE: Grade Keeper (and reports) - by TempodiBasic - 04-20-2023, 09:59 PM
RE: Grade Keeper (and reports) - by bplus - 04-20-2023, 10:59 PM
RE: Grade Keeper (and reports) - by TempodiBasic - 04-21-2023, 11:56 PM
RE: Grade Keeper (and reports) - by NasaCow - 04-22-2023, 09:32 AM
RE: Grade Keeper (and reports) - by TempodiBasic - 04-25-2023, 10:17 PM
RE: Grade Keeper (and reports) - by NasaCow - 05-01-2023, 03:02 PM
RE: Grade Keeper (and reports) - by NasaCow - 05-14-2023, 03:18 AM
RE: Grade Keeper (and reports) - by TempodiBasic - 05-14-2023, 11:41 PM
RE: Grade Keeper (and reports) - by NasaCow - 05-15-2023, 12:11 AM
RE: Grade Keeper (and reports) - by NasaCow - 05-15-2023, 01:43 PM
RE: Grade Keeper (and reports) - by SMcNeill - 05-15-2023, 02:13 PM
RE: Grade Keeper (and reports) - by NasaCow - 05-15-2023, 02:50 PM
RE: Grade Keeper (and reports) - by TempodiBasic - 05-16-2023, 01:35 PM



Users browsing this thread: 12 Guest(s)