Vous êtes sur la page 1sur 21

frmInstructor

Dim testHasChanged As Boolean


Dim createCancel As Boolean
Dim questNum As Integer

Private Sub cmdAddToBank_Click()


'bring up the form to add a new question to question bank
Load frmAddToBank
End Sub

Private Sub cmdAddToTest_Click()


'check for more than 100 questions
If questNum > 100 Then
MsgBox "You have already reached the maximum limit of 100. " & _
"Remove an existing question if you want to add a new one." , , "Warning!"
Exit Sub
End If

'check template for blank values


If (optMultiple.Value = False And optTrueFalse = False) Or _
(opt1template.Value = False And opt2Template.Value = False _
And opt3Template = False And opt4Template.Value = False) Or _
(txtQuestTemplate.Text = "") Then

MsgBox "One of your fields is blank!", , "Warning!"


Exit Sub
End If

'check to see if a current test is already in use, if not create a new one

If currentTest = "" Then


Call createTest
questNum = 0
lblCurTest.Caption = "Current Test: " & currentTest
End If

testHasChanged = True

'add question to list box and question test array


lisTestQuests.AddItem txtQuestTemplate

With questTest(lisTestQuests.ListCount)
.quest = txtQuestTemplate
.answerA = txtOption1
.answerB = txtOption2
.answerC = txtOption3
.answerD = txtOption4
If optMultiple Then
.theType = "M"
Else
.theType = "T"
End If

If opt1template Then
.correctAns = "A"
Else
If opt2Template Then
.correctAns = "B"
Else
If opt3Template Then
.correctAns = "C"
Else
.correctAns = "D"
End If
End If
End If

End With

End Sub
Private Sub SaveTest()
Dim recordNum As Integer
'make sure all files are closed
Close
'double check to see if there is at least 1 question
If lisTestQuests.ListCount > 0 Then
'select file for output
Open currentTest For Output As #1
'write array to file
For recordNum = 1 To lisTestQuests.ListCount
Write #1, questTest(recordNum).quest
Write #1, questTest(recordNum).answerA
Write #1, questTest(recordNum).answerB
Write #1, questTest(recordNum).answerC
Write #1, questTest(recordNum).answerD
Write #1, questTest(recordNum).correctAns
Write #1, questTest(recordNum).theType
Next recordNum
Close #1

'open file for test layout


Open Left(currentTest, Len(currentTest) - 3) & "lyt" For Output As #1
'write the layout options

Close #1
'reset test has changed to false
testHasChanged = False
End If

End Sub
Private Sub createTest()

Dim foundTest As Boolean


Dim i As Integer
Dim userResponse As Integer

On Error GoTo dlgError

'if test had changed then ask to save current test before creating a new one
If testHasChanged Then
userResponse = MsgBox("The current test has changed since you last saved it. " & _
"Do you want to save it before you create a new one?", _
vbYesNoCancel, "Warning!")
If userResponse = vbYes Then
Call SaveTest
Else
If userResponse = vbCancel Then
Exit Sub
End If
End If
End If

'get name for new test


With dlgFile
.CancelError = True
.FileName = ""
.DialogTitle = "Choose A Name For The Test"
.Flags = 2
.Filter = "Test Files| *.tst"
.ShowSave

If Dir(.FileName) <> "" Then


Kill .FileName
End If

currentTest = .FileName
lblCurTest.Caption = "Current Test: " & currentTest
mnuSave.Enabled = True
mnuSaveAs.Enabled = True
cmdReviewQuestion.Enabled = True
cmdRemoveTestQuest.Enabled = True
cmdUp.Enabled = True
cmdDown.Enabled = True
cmdSaveTest.Enabled = True
testHasChanged = False

End With

'add test name to test table in login database


foundTest = False
datLogin.RecordSource = "Test"
datLogin.Refresh
With datLogin.Recordset
.MoveFirst
Do Until .EOF Or foundTest
If currentTest = RTrim(.Fields("TestName").Value) Then
foundTest = True
End If
.MoveNext
Loop
If Not foundTest Then
.AddNew
.Fields("TestName").Value = currentTest
.Update
End If
End With

'clear the list box and question test array


lisTestQuests.Clear
For i = 1 To 100
questTest(i).answerA = ""
questTest(i).answerB = ""
questTest(i).answerC = ""
questTest(i).answerD = ""
questTest(i).correctAns = ""
questTest(i).quest = ""
questTest(i).theType = ""
Next i

'set defaults for new test


chkTimed.Value = False
txtMinutes.Text = ""
chkAllowGoBack.Value = False
optGrey = True

dlgError:

On Error GoTo 0
Exit Sub

End Sub
Private Sub cmdClearTemplate_Click()
'clear all controls in template
optMultiple.Value = False
optTrueFalse.Value = False
opt1template.Value = False
opt2Template.Value = False
opt3Template.Value = False
opt4Template.Value = False
txtQuestTemplate.Text = ""
txtOption1.Text = ""
txtOption2.Text = ""
txtOption3.Text = ""
txtOption4.Text = ""
End Sub

Private Sub cmdDown_Click()


Dim questTemp As questionSet
Dim i As Integer
Dim listEntries As Integer
Dim curListSpot As Integer

'make sure question is selected


If lisTestQuests.Text = "" Then
MsgBox "Click on a question first.", , "Attention"
Else
'make sure selection is not already in the lowest position
If lisTestQuests.ListIndex = lisTestQuests.ListCount - 1 Then
Exit Sub
End If

'testhaschanged needs to be set to true


testHasChanged = True

'switch question in array with the one below it


questTemp = questTest(lisTestQuests.ListIndex + 1)
questTest(lisTestQuests.ListIndex + 1) = questTest(lisTestQuests.ListIndex + 2)
questTest(lisTestQuests.ListIndex + 2) = questTemp

'clear listbox and reload it


listEntries = lisTestQuests.ListCount
curListSpot = lisTestQuests.ListIndex
lisTestQuests.Clear
For i = 1 To listEntries
lisTestQuests.AddItem questTest(i).quest
Next i
'select the question that was moved
lisTestQuests.ListIndex = curListSpot + 1
End If

End Sub
Private Sub cmdEditBank_Click()

Dim i As Integer
'make sure question is selected
If lisTestBank.Text <> "" Then
With datBank.Recordset
.MoveFirst
'move to current question in database
If lisTestBank.ListIndex > 0 Then
For i = 1 To lisTestBank.ListIndex
.MoveNext
Next i
End If
'load question to be edited into edit form
frmEdit.txtQuestion = RTrim(.Fields("question").Value)
If .Fields("type").Value = "M" Then
frmEdit.optMultiple = True
Else
frmEdit.optTrueFalse = True
End If
frmEdit.txtOptA.Text = RTrim(.Fields("opt1"))
frmEdit.txtOptB.Text = RTrim(.Fields("opt2"))
frmEdit.txtOptC.Text = RTrim(.Fields("opt3"))
frmEdit.txtOptD.Text = RTrim(.Fields("opt4"))
If RTrim(.Fields("answer").Value) = "A" Then
frmEdit.optA = True
Else
If RTrim(.Fields("answer")) = "B" Then
frmEdit.optB = True
Else
If RTrim(.Fields("answer")) = "C" Then
frmEdit.optC = True
Else
frmEdit.optD = True
End If
End If
End If
End With

Load frmEdit

Else

MsgBox "Select a question to edit", , "Warning!"

End If

End Sub
Private Sub cmdMoveQuestion_Click()

'check to see if a question from bank is clicked on, if so move question, question type, options,
and correct answer to template

If lisTestBank.Text = "" Then


MsgBox "Click on a question first.", , "Attention"
Else
With questHold(lisTestBank.ListIndex + 1)
txtQuestTemplate.Text = .quest
txtOption1.Text = .answerA
txtOption2.Text = .answerB
txtOption3.Text = .answerC
txtOption4.Text = .answerD
If .correctAns = "A" Then
opt1template.Value = True
opt2Template.Value = False
opt3Template.Value = False
opt4Template.Value = False
Else
If .correctAns = "B" Then
opt2Template.Value = True
opt1template.Value = False
opt3Template.Value = False
opt4Template.Value = False
Else
If .correctAns = "C" Then
opt3Template.Value = True
opt1template.Value = False
opt2Template.Value = False
opt4Template.Value = False
Else
opt4Template.Value = True
opt1template.Value = False
opt2Template.Value = False
opt3Template.Value = False
End If
End If
End If
If .theType = "M" Then
optMultiple.Value = True
Else
optTrueFalse.Value = True
txtOption3.Text = ""
txtOption4.Text = ""
opt3Template.Value = False
opt4Template.Value = False
End If
End With
End If

End Sub

Private Sub cmdRemoveFromBank_Click()


Dim questRem As String

'check to see if the question to be removed from the bank has been clicked on
If lisTestBank.Text = "" Then
MsgBox "You have not selected a question to remove.", , "Warning!"
Else

'remove question from database


questRem = questHold(lisTestBank.ListIndex + 1).quest
With datBank.Recordset
.MoveFirst
.FindFirst ("question = '" & questRem & "'")
.Delete
.MoveFirst
End With

'remove question from bank list


lisTestBank.RemoveItem lisTestBank.ListIndex

End If

End Sub

Private Sub cmdRemoveTestQuest_Click()

Dim i As Integer

'make sure question is selected


If lisTestQuests.Text = "" Then
MsgBox "Click on a question first.", , "Attention"
Else
'delete current question from array
testHasChanged = True
For i = lisTestQuests.ListIndex + 1 To lisTestQuests.ListCount - 1
questTest(i) = questTest(i + 1)
Next i
'remove question from listbox
lisTestQuests.RemoveItem lisTestQuests.ListIndex
End If

End Sub
Private Sub cmdReviewQuestion_Click()

'make sure a question is selected


If lisTestQuests.Text = "" Then
MsgBox "Click on a question first.", , "Attention"
Else
'load question into template section
With questTest(lisTestQuests.ListIndex + 1)
txtQuestTemplate.Text = .quest
txtOption1.Text = .answerA
txtOption2.Text = .answerB
txtOption3.Text = .answerC
txtOption4.Text = .answerD
If .correctAns = "A" Then
opt1template.Value = True
opt2Template.Value = False
opt3Template.Value = False
opt4Template.Value = False
Else
If .correctAns = "B" Then
opt2Template.Value = True
opt1template.Value = False
opt3Template.Value = False
opt4Template.Value = False
Else
If .correctAns = "C" Then
opt3Template.Value = True
opt1template.Value = False
opt2Template.Value = False
opt4Template.Value = False
Else
opt4Template.Value = True
opt1template.Value = False
opt2Template.Value = False
opt3Template.Value = False
End If
End If
End If
If .theType = "M" Then
optMultiple.Value = True
Else
optTrueFalse.Value = True
txtOption3.Text = ""
txtOption4.Text = ""
opt3Template.Value = False
opt4Template.Value = False
End If
End With

End If
End Sub

Private Sub cmdSaveTest_Click()

'make sure test has changed and there is at least 1 question


If testHasChanged And lisTestQuests.ListCount > 0 Then
Call SaveTest
End If

End Sub

Private Sub cmdUp_Click()

Dim questTemp As questionSet


Dim i As Integer
Dim listEntries As Integer
Dim curListSpot As Integer

'make sure a question has been selected


If lisTestQuests.Text = "" Then
MsgBox "Click on a question first.", , "Attention"
Else
'don't perform sub if the selected question is already at the top position
If lisTestQuests.ListIndex = 0 Then
Exit Sub
End If

'set testHasChanged to true since it has changed


testHasChanged = True

'switch question position in arrray with the 1 above it


questTemp = questTest(lisTestQuests.ListIndex)
questTest(lisTestQuests.ListIndex) = questTest(lisTestQuests.ListIndex + 1)
questTest(lisTestQuests.ListIndex + 1) = questTemp

'clear and reload list box


listEntries = lisTestQuests.ListCount
curListSpot = lisTestQuests.ListIndex
lisTestQuests.Clear
For i = 1 To listEntries
lisTestQuests.AddItem questTest(i).quest
Next i
'highlight the moved question
lisTestQuests.ListIndex = curListSpot - 1
End If

End Sub
Private Sub Form_Load()

'make form visible and unload login form


Show
Unload frmLogin

With datLogin
.DatabaseName = App.Path & "\login.mdb"
.RecordSource = "Login"
.Refresh
End With

'set caption of form to include user ID


Caption = Caption & " - User ID : " & userCode

'if logged in with default system password disable menu option to edit password
If UCase(userCode) = "SYSTEM999" Then
mnuEditPassword.Enabled = False
End If

mnuSave.Enabled = False
mnuSaveAs.Enabled = False

'disable Add to bank, remove from bank, and edit from bank command buttons
cmdAddToBank.Enabled = False
cmdRemoveFromBank.Enabled = False
cmdEditBank.Enabled = False

'reset newDb to false


newDB = False

'reset test has changed to false


testHasChanged = False

End Sub

Private Sub lisTestBank_Click()

'load question from bank list to large question display


txtQuestDisp.Text = lisTestBank.Text

'set the label to display correct question type


Select Case questHold(lisTestBank.ListIndex + 1).theType
Case "M"
lblQuestType.Caption = "Question Type: " & "Multiple Choice"
Case "T"
lblQuestType.Caption = "Question Type: " & "True/False"
End Select

End Sub
Private Sub mnuCreate_Click()

Call createTest

End Sub

Private Sub mnuCreateBank_Click()

Dim NewBank As Database, MyWS As Workspace


Dim T1 As TableDef
Dim T1Flds(1 To 7) As Field
Dim T1Idx As Index
Dim myRec As Recordset
Dim checkDIR As String

On Error GoTo DialogError

'open save dialog


With dlgFile
.CancelError = True
.DialogTitle = "Choose A Name For The Test Bank"
.Flags = cdlOFNOverwritePrompt
.Filter = "Question Bank Files|*.mdb"
.ShowSave

datBank.Database.Close

'delete the file chosen if it exists


If Dir(.FileName) <> "" Then
Kill .FileName
End If

'set currentBank with file name


currentBank = .FileName

'set test bank label with file name


lblTestBank.Caption = "Test Bank: '" & .FileName & "'"

'set Add to bank, remove from bank, and edit from bank command buttons
cmdAddToBank.Enabled = True
cmdRemoveFromBank.Enabled = True
cmdEditBank.Enabled = True

'create new question bank database


Set MyWS = DBEngine.Workspaces(0)
Set NewBank = MyWS.CreateDatabase(.FileName, dbLangGeneral)

Set T1 = NewBank.CreateTableDef("bank")
Set T1Flds(1) = T1.CreateField("question", dbText, 250)
Set T1Flds(2) = T1.CreateField("type", dbText, 1)
Set T1Flds(3) = T1.CreateField("opt1", dbText, 50)
Set T1Flds(4) = T1.CreateField("opt2", dbText, 50)
Set T1Flds(5) = T1.CreateField("opt3", dbText, 50)
Set T1Flds(6) = T1.CreateField("opt4", dbText, 50)
Set T1Flds(7) = T1.CreateField("answer", dbText, 50)

T1.Fields.Append T1Flds(1)
T1.Fields.Append T1Flds(2)
T1.Fields.Append T1Flds(3)
T1.Fields.Append T1Flds(4)
T1.Fields.Append T1Flds(5)
T1.Fields.Append T1Flds(6)
T1.Fields.Append T1Flds(7)

Set T1Idx = T1.CreateIndex("question")


T1Idx.Primary = True
T1Idx.Unique = True
T1Idx.Required = True
Set T1Flds(1) = T1Idx.CreateField("question")
T1Idx.Fields.Append T1Flds(1)
T1.Indexes.Append T1Idx
NewBank.TableDefs.Append T1

'add a dummy record to prevent any db errors


Set myRec = T1.OpenRecordset
myRec.AddNew
myRec("question") = "dummy"
myRec("type") = "D"
myRec("opt1") = "dummy"
myRec("opt2") = "dummy"
myRec("opt3") = "dummy"
myRec("opt4") = "dummy"
myRec("answer") = "d"
myRec.Update
myRec.Close

'close new database


NewBank.Close

'open new database with data control


datBank.DatabaseName = .FileName
datBank.RecordSource = "bank"
datBank.Refresh

'reset questHold array to null


For x = 1 To 200
questHold(x).answerA = ""
questHold(x).answerB = ""
questHold(x).answerC = ""
questHold(x).answerD = ""
questHold(x).correctAns = ""
questHold(x).quest = ""
questHold(x).theType = ""
Next x

'set newDB flag to true


newDB = True

'clear test bank list box


lisTestBank.Clear

'clear large question display


txtQuestDisp.Text = ""

'load form to add questions to bank


Load frmAddToBank

End With

DialogError:
On Error GoTo 0
Exit Sub

End Sub

Private Sub mnuCreateStudent_Click()

'load form and set caption to student


Load frmAccount
frmAccount.Caption = "Student"

End Sub

Private Sub mnuCreateTeacher_Click()

'load form and set caption to teacher


Load frmAccount
frmAccount.Caption = "Teacher"

End Sub

Private Sub mnuEditPassword_Click()

'edit currently logged on user's password


Load frmTeachPass
'search for user in database and display current(old) password
With frmInstructor.datLogin.Recordset
.MoveFirst
Do Until .EOF
If loggedUser = .Fields("UserID").Value Then
frmTeachPass.picOutput.Cls
frmTeachPass.picOutput.Print "Old Password: "; .Fields("Password").Value
Exit Do
End If
.MoveNext
Loop
End With

End Sub

Private Sub mnuEditStudent_Click()

Load frmStudPass

End Sub

Private Sub mnuExit_Click()

Dim response As Integer

'before exiting check to see if test has changed and give user option to save or not or cancel exit
If testHasChanged Then
response = MsgBox("Test has changed, do you want to save before exiting program?",
vbYesNoCancel _
, "Warning!")
If response = vbYes Then
Call SaveTest
Else
If response = vbCancel Then
Exit Sub
End If
End If
End If

'stop application
End

End Sub

Private Sub mnuOpen_Click()

Dim i As Integer
Dim userResponse As Integer
Dim timed As String
Dim minutes As Integer
Dim goBack As String
Dim theColor As String

On Error GoTo dlgError

'if test has changed check to see if user wants to save current test before opening new one
If testHasChanged Then
userResponse = MsgBox("The current test has changed since you last saved it. " & _
"Do you want to save it before you open another one?", _
vbYesNoCancel, "Warning!")
If userResponse = vbYes Then
Call SaveTest
Else
If userResponse = vbCancel Then
Exit Sub
End If
End If
End If

'select filename to open


With dlgFile
.CancelError = True
.DialogTitle = "Choose Test To Open"
.Filter = "Test Files|*.tst"
.Flags = 2
.ShowOpen

Open .FileName For Input As #1


currentTest = .FileName
lblCurTest.Caption = "Current Test: " & currentTest
mnuSave.Enabled = True
mnuSaveAs.Enabled = True
cmdReviewQuestion.Enabled = True
cmdRemoveTestQuest.Enabled = True
cmdUp.Enabled = True
cmdDown.Enabled = True
cmdSaveTest.Enabled = True

lisTestQuests.Clear

'load test question array from test file


Do Until EOF(1)
i=i+1
Input #1, questTest(i).quest
Input #1, questTest(i).answerA
Input #1, questTest(i).answerB
Input #1, questTest(i).answerC
Input #1, questTest(i).answerD
Input #1, questTest(i).correctAns
Input #1, questTest(i).theType
lisTestQuests.AddItem questTest(i).quest
Loop
Close #1

'load test options


Open Left(.FileName, Len(.FileName) - 3) & "lyt" For Input As #1

Close

End With

'reset test has changed to false


testHasChanged = False

dlgError:
On Error GoTo 0
Exit Sub

End Sub

Private Sub mnuOpenBank_Click()

Dim i As Integer
Dim x As Integer

On Error GoTo DialogError

'open the open dialog


With dlgFile
.CancelError = True
.DialogTitle = "Choose The Name Of The Test Bank"
.Flags = 2
.Filter = "Database Files|*.mdb"
.ShowOpen

'set database,label, and currentBank with file name


datBank.DatabaseName = .FileName
lblTestBank.Caption = "Test Bank: '" & .FileName & "'"
currentBank = .FileName
End With

'enable add to bank, romove from bank, and edit bank command buttons
cmdAddToBank.Enabled = True
cmdRemoveFromBank.Enabled = True
cmdEditBank.Enabled = True

'clear big question display and test bank list box


txtQuestDisp.Text = ""
lisTestBank.Clear
'open database
datBank.RecordSource = "bank"
datBank.Refresh
datBank.Recordset.MoveFirst

'clear questHold array with null


For x = 1 To 200
questHold(x).answerA = ""
questHold(x).answerB = ""
questHold(x).answerC = ""
questHold(x).answerD = ""
questHold(x).correctAns = ""
questHold(x).quest = ""
questHold(x).theType = ""
Next x

'load questHold array with test bank database data


Do Until datBank.Recordset.EOF
i=i+1
With questHold(i)
.quest = datBank.Recordset.Fields("question").Value
.theType = datBank.Recordset.Fields("type").Value
.answerA = datBank.Recordset.Fields("opt1").Value
.answerB = datBank.Recordset.Fields("opt2").Value
.answerC = datBank.Recordset.Fields("opt3").Value
.answerD = datBank.Recordset.Fields("opt4").Value
.correctAns = datBank.Recordset.Fields("answer").Value
lisTestBank.AddItem (.quest)
End With
datBank.Recordset.MoveNext
Loop

If i = 1 And RTrim(datBank.Recordset.Fields("question").Value) = "dummy" Then


newDB = True
End If

'set question type label


lblQuestType.Caption = "Question Type:"

DialogError:
On Error GoTo 0
Exit Sub

End Sub

Private Sub mnuPrint_Click()

Dim i As Integer
Dim linecount As Integer
'print the current test with font size 12
Printer.FontSize = 12
For i = 1 To 5
Printer.Print
Next i
Printer.Print Space(80 - (Len(currentTest) / 2)); currentTest
Printer.Print

'print questions
For i = 1 To lisTestQuests.ListCount
Printer.FontSize = 10
Printer.Print i & "." & questTest(i).quest
Printer.Print
linecount = linecount + 2
If questTest(i).theType = "T" Then
Printer.Print "A. " & questTest(i).answerA
Printer.Print "B. " & questTest(i).answerB
linecount = linecount + 3
Else
Printer.Print "A. " & questTest(i).answerA
Printer.Print "B. " & questTest(i).answerB
Printer.Print "C. " & questTest(i).answerC
Printer.Print "D. " & questTest(i).answerD
linecount = linecount + 5
End If
Printer.Print
If linecount > 55 Then
Printer.NewPage
Printer.FontSize = 12
Printer.Print: Printer.Print: Printer.Print: Printer.Print
Printer.Print: Printer.Print: Printer.Print
Printer.FontSize = 10
linecount = 0
End If
Next i

'print test key


Printer.NewPage
Printer.Print: Printer.Print
Printer.Print currentTest & " - Test Key"
For i = 1 To lisTestQuests.ListCount
Printer.Print
Printer.Print i & ": " & questTest(i).correctAns
Next i

Printer.EndDoc

End Sub

Private Sub mnuPrintScores_Click()


Load frmTestScores

End Sub

Private Sub mnuSave_Click()

'make sure test has changed and that there is at least 1 question in the test
If testHasChanged And lisTestQuests.ListCount > 0 Then
Call SaveTest
End If

End Sub

Private Sub mnuSaveAs_Click()

'make sure there are questions in the test


If lisTestQuests.ListCount > 0 Then

'select filename to save as


With dlgFile
.CancelError = True
.FileName = ""
.DialogTitle = "Choose A Name For The Test"
.Flags = 2
.Filter = "Test Files| *.tst"
.ShowSave

'if file did exist, delete it


If Dir(.FileName) <> "" Then
Kill .FileName
End If

'set currentTest to the filename selected enable save and saves menu selections
currentTest = .FileName
mnuSave.Enabled = True
mnuSaveAs.Enabled = True

End With

'call sub to actually save the test


Call SaveTest
End If

dlgError:
On Error GoTo 0
Exit Sub
End Sub

Private Sub optMultiple_Click()


'enable options 3 and 4 if option multiple choice is choosen
opt3Template.Enabled = True
opt4Template.Enabled = True

End Sub

Private Sub optTrueFalse_Click()

'disable and clear options 3 and 4 if true/false choice is choosen


txtOption1.Text = "True"
txtOption2.Text = "False"
txtOption3.Text = ""
txtOption4.Text = ""
opt3Template.Value = False
opt4Template.Value = False
opt3Template.Enabled = False
opt4Template.Enabled = False

End Sub

Vous aimerez peut-être aussi