Advertisement
UHaroon

Untitled

Apr 24th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 27.86 KB | None | 0 0
  1. unit UnitAssessmentAndHomeworkEntry;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids,
  8.   Vcl.ExtCtrls, IdMessage, IdTCPConnection, IdTCPClient,
  9.   IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP,
  10.   IdBaseComponent, IdComponent, IdIOHandler, IdIOHandlerSocket,
  11.   IdIOHandlerStack, IdSSL, IdSSLOpenSSL, MmSystem;
  12.  
  13. type
  14.   TfrmAssessmentAndHomeworkEntry = class(TForm)
  15.     lblHomeworkAndAssessmentEntry: TLabel;
  16.     ledtMaxMarkInput: TLabeledEdit;
  17.     ledtAHWMarkAchieved: TLabeledEdit;
  18.     btnCreateBoundary: TButton;
  19.     btnSaveMark: TButton;
  20.     dbgDisplayAssessmentHomeworkTables: TDBGrid;
  21.     cboAHWSelectGroup: TComboBox;
  22.     cboAHWName: TComboBox;
  23.     gboSelectAStudent: TGroupBox;
  24.     cboType: TComboBox;
  25.     btnAHWBackToGroupProfiles: TButton;
  26.     btnAHWSelectGroup: TButton;
  27.     gboAHWSelectGroup: TGroupBox;
  28.     GroupBox1: TGroupBox;
  29.     ledtExamMarkAStar: TLabeledEdit;
  30.     ledtExamMarkA: TLabeledEdit;
  31.     ledtExamMarkB: TLabeledEdit;
  32.     ledtExamMarkC: TLabeledEdit;
  33.     ledtExamMarkD: TLabeledEdit;
  34.     ledtExamMarkE: TLabeledEdit;
  35.     ledtNewBoundaryAStar: TLabeledEdit;
  36.     ledtNewBoundaryA: TLabeledEdit;
  37.     ledtNewBoundaryB: TLabeledEdit;
  38.     ledtNewBoundaryC: TLabeledEdit;
  39.     ledtNewBoundaryD: TLabeledEdit;
  40.     ledtNewBoundaryE: TLabeledEdit;
  41.     gboExamBoardMarksBoundary: TGroupBox;
  42.     GroupBox3: TGroupBox;
  43.     btnSaveMarks: TButton;
  44.     btnAlterMarks: TButton;
  45.     ledtExamBMaxMark: TLabeledEdit;
  46.     ledtNewMaxMark: TLabeledEdit;
  47.     IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  48.     IdSMTP1: TIdSMTP;
  49.     IdMessage1: TIdMessage;
  50.     procedure FormShow(Sender: TObject);
  51.     procedure btnAHWBackToGroupProfilesClick(Sender: TObject);
  52.     procedure btnAHWSelectGroupClick(Sender: TObject);
  53.     procedure btnAlterMarksClick(Sender: TObject);
  54.     procedure btnSaveMarksClick(Sender: TObject);
  55.     procedure btnCreateBoundaryClick(Sender: TObject);
  56.     procedure btnSaveMarkClick(Sender: TObject);
  57.     procedure ledtExamBMaxMarkKeyPress(Sender: TObject; var Key: Char);
  58.     procedure ledtExamMarkAStarKeyPress(Sender: TObject; var Key: Char);
  59.     procedure ledtExamMarkAKeyPress(Sender: TObject; var Key: Char);
  60.     procedure ledtExamMarkBKeyPress(Sender: TObject; var Key: Char);
  61.     procedure ledtExamMarkCKeyPress(Sender: TObject; var Key: Char);
  62.     procedure ledtExamMarkDKeyPress(Sender: TObject; var Key: Char);
  63.     procedure ledtExamMarkEKeyPress(Sender: TObject; var Key: Char);
  64.     procedure ledtAHWMarkAchievedKeyPress(Sender: TObject; var Key: Char);
  65.     procedure ledtMaxMarkInputKeyPress(Sender: TObject; var Key: Char);
  66.   private
  67.     { Private declarations }
  68.   public
  69.     { Public declarations }
  70.   end;
  71.  
  72. var
  73.   frmAssessmentAndHomeworkEntry: TfrmAssessmentAndHomeworkEntry;
  74.   ExamMarksBoundaryFile : TextFile;
  75.   ExamBMarksBoundary : array [0..7] of string;
  76.   NewMarkBoundary : array [0..7,0..1] of string;
  77.  
  78. implementation
  79.  
  80. uses UnitdmDatabaseComponents, UnitGroupProfiles, UnitEmailDetails;
  81.  
  82. {$R *.dfm}
  83.  
  84. procedure ErrorOutputComboBox(ErrorMessage : string; Cbo : TComboBox);
  85. begin
  86.   {  ----------  Highlight the input with an error  ----------  }
  87.   Cbo.Color := clRed;  // Turn the input into a red color
  88.   Cbo.Font.Color := clWhite;  // Turn the text into the input to white
  89.   PlaySound('SYSTEMEXCLAMATION', 0, SND_ASYNC);  //  Play error sound
  90.   Showmessage(ErrorMessage);  //  Output an error message
  91.   {  ----------  Remove the highlight  ----------}
  92.   Cbo.Color := clWhite;  // Make the input white again
  93.   Cbo.Font.Color := clBlack;  //  Make the font black again
  94. end;
  95.  
  96. procedure ErrorOutputLabeledEdit(ErrorMessage : string; Ledt : TLabeledEdit);
  97. begin
  98.   {  ----------  Highlight the input with an error  ----------  }
  99.   Ledt.Color := clRed;  // Turn the input into a red color
  100.   ledt.Font.Color := clWhite;  // Turn the text into the input to white
  101.   PlaySound('SYSTEMEXCLAMATION', 0, SND_ASYNC);  //  Play error sound
  102.   Showmessage(ErrorMessage);  //  Output an error message
  103.   {  ----------  Remove the highlight  ----------}
  104.   Ledt.Color := clWhite;  // Make the input white again
  105.   ledt.Font.Color := clBlack;  //  Make the font black again
  106. end;
  107.  
  108. procedure CorrectKeyPressedNumerical(KeyIn : Char; Field : string);
  109. begin
  110.    if not (KeyIn in ['0'..'9', #8]) then // If a letter pressed
  111.    begin
  112.       PlaySound('SYSTEMEXCLAMATION', 0, SND_ASYNC);  //  Play error sound
  113.       Showmessage('ERROR: '+Field+' must only be numerical');  // Produce an error message
  114.       KeyIn := #0; // Remove the last character
  115.    end; // end if
  116. end;
  117.  
  118. procedure Gmail(username, password, totarget, subject, body: string);
  119. var
  120.   DATA: TIdMessage;
  121.   SMTP: TIdSMTP;
  122.   SSL: TIdSSLIOHandlerSocketOpenSSL;
  123.  
  124. begin
  125.  
  126.   SMTP := TIdSMTP.Create(nil);
  127.   DATA := TIdMessage.Create(nil);
  128.   SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  129.  
  130.   SSL.SSLOptions.Method := sslvTLSv1;
  131.   SSL.SSLOptions.Mode := sslmUnassigned;
  132.   SSL.SSLOptions.VerifyMode := [];
  133.   SSL.SSLOptions.VerifyDepth := 0;
  134.  
  135.   DATA.From.Address := username;
  136.   DATA.Recipients.EMailAddresses := totarget;
  137.   DATA.subject := subject;
  138.   DATA.body.text := body;
  139.  
  140.   SMTP.IOHandler := SSL;
  141.   SMTP.Host := 'smtp.gmail.com';
  142.   SMTP.Port := 587;
  143.   SMTP.username := username;
  144.   SMTP.password := password;
  145.   SMTP.UseTLS := utUseExplicitTLS;
  146.  
  147.   SMTP.Connect;
  148.   SMTP.Send(DATA);
  149.   SMTP.Disconnect;
  150.  
  151.   SMTP.Free;
  152.   DATA.Free;
  153.   SSL.Free;
  154. end;
  155.  
  156. procedure EnableNewMarkBoundary();
  157. begin
  158.   with frmAssessmentAndHomeworkEntry do
  159.   begin
  160.   ledtNewMaxMark.Enabled:=True;
  161.   ledtNewBoundaryAStar.Enabled:=True;
  162.   ledtNewBoundaryA.Enabled:=True;
  163.   ledtNewBoundaryB.Enabled:=True;
  164.   ledtNewBoundaryC.Enabled:=True;
  165.   ledtNewBoundaryD.Enabled:=True;
  166.   ledtNewBoundaryE.Enabled:=True;
  167.   end;
  168. end;
  169.  
  170. procedure DisableNewMarkBoundary();
  171. begin
  172.   with frmAssessmentAndHomeworkEntry do
  173.   begin
  174.   ledtNewMaxMark.Enabled:=False;
  175.   ledtNewBoundaryAStar.Enabled:=False;
  176.   ledtNewBoundaryA.Enabled:=False;
  177.   ledtNewBoundaryB.Enabled:=False;
  178.   ledtNewBoundaryC.Enabled:=False;
  179.   ledtNewBoundaryD.Enabled:=False;
  180.   ledtNewBoundaryE.Enabled:=False;
  181.   end;
  182. end;
  183.  
  184. procedure EnableExamBMarksInput();
  185. begin
  186.   frmAssessmentAndHomeworkEntry.ledtExamBMaxMark.Enabled := True;
  187.   frmAssessmentAndHomeworkEntry.ledtExamMarkAStar.Enabled := True;
  188.   frmAssessmentAndHomeworkEntry.ledtExamMarkA.Enabled := True;
  189.   frmAssessmentAndHomeworkEntry.ledtExamMarkB.Enabled := True;
  190.   frmAssessmentAndHomeworkEntry.ledtExamMarkC.Enabled := True;
  191.   frmAssessmentAndHomeworkEntry.ledtExamMarkD.Enabled := True;
  192.   frmAssessmentAndHomeworkEntry.ledtExamMarkE.Enabled := True;
  193. end;
  194.  
  195. procedure DisableExamBMarksInput();
  196. begin
  197.   frmAssessmentAndHomeworkEntry.ledtExamBMaxMark.Enabled := False;
  198.   frmAssessmentAndHomeworkEntry.ledtExamMarkAStar.Enabled := False;
  199.   frmAssessmentAndHomeworkEntry.ledtExamMarkA.Enabled := False;
  200.   frmAssessmentAndHomeworkEntry.ledtExamMarkB.Enabled := False;
  201.   frmAssessmentAndHomeworkEntry.ledtExamMarkC.Enabled := False;
  202.   frmAssessmentAndHomeworkEntry.ledtExamMarkD.Enabled := False;
  203.   frmAssessmentAndHomeworkEntry.ledtExamMarkE.Enabled := False;
  204. end;
  205.  
  206. procedure TfrmAssessmentAndHomeworkEntry.btnAHWBackToGroupProfilesClick(Sender: TObject);
  207. begin
  208.   frmAssessmentAndHomeworkEntry.Hide;
  209.   frmGroupProfile.Show;
  210. end;
  211.  
  212. procedure TfrmAssessmentAndHomeworkEntry.btnAlterMarksClick(Sender: TObject);
  213. begin
  214.   {  ----------  Disable input of Exam UMS Boundary  ----------  }
  215.   EnableExamBMarksInput;
  216.  
  217.   btnAlterMarks.Enabled := False;
  218.   btnSaveMarks.Enabled := True;
  219. end;
  220.  
  221. procedure TfrmAssessmentAndHomeworkEntry.btnCreateBoundaryClick(
  222.   Sender: TObject);
  223. var
  224.   MarkMultiplier : Real;
  225.   x, Calc: Integer;
  226. begin
  227.   {  ----------  Max Mark validation  ----------  }
  228.   {  ----------  Presence Check  -----------}
  229.   if ledtMaxMarkInput.Text = '' then
  230.   begin
  231.     ErrorOutputLabeledEdit('ERROR: Please enter a max mark', ledtMaxMarkInput);
  232.   end
  233.   else if (StrToInt(ledtMaxMarkInput.Text) > 140) OR (StrToInt(ledtMaxMarkInput.Text) < 0) then
  234.   begin
  235.     Showmessage('ERROR: Max mark is too big');
  236.   end
  237.   else
  238.   begin
  239.     // Allow data to be written to labeled edits of the new grade boundaries
  240.     EnableNewMarkBoundary;
  241.  
  242.     // Calculate the multiplier
  243.     MarkMultiplier := StrToInt(ledtMaxMarkINput.Text) / StrToInt(ledtExamBMaxMark.Text);
  244.  
  245.     // Save the max mark entered as the first data item of the new boundary
  246.     NewMarkBoundary[0,1] := ledtMaxMarkINput.Text;
  247.  
  248.     { ----------  Calculate the new grade boundary  ---------- }
  249.     for x := 1 to 7 do
  250.     begin
  251.       Calc := Round(MarkMultiplier * StrToInt(ExamBMarksBoundary[x]));
  252.       NewMarkBoundary[x,1]:= IntToStr(Calc);
  253.     end;
  254.  
  255.     // Make max mark entered by the user the new max mark
  256.     ledtNewMaxMark.Text := ledtMaxMarkINput.Text;
  257.  
  258.     { ----------  Output the new calculated grade boundaries  ---------- }
  259.     ledtNewBoundaryAStar.Text:= NewMarkBoundary[1,1];  // Output new mark for an A*
  260.     ledtNewBoundaryA.Text:= NewMarkBoundary[2,1]; // Output new mark for an A
  261.     ledtNewBoundaryB.Text:= NewMarkBoundary[3,1]; // Output new mark for a B
  262.     ledtNewBoundaryC.Text:= NewMarkBoundary[4,1]; // Output new mark for a C
  263.     ledtNewBoundaryD.Text:= NewMarkBoundary[5,1]; // Output new mark for a D
  264.     ledtNewBoundaryE.Text:= NewMarkBoundary[6,1]; // Output new mark for an E
  265.  
  266.     { ----------  Set the UMS boundaries for the new grade boundary  ---------- }
  267.     NewMarkBoundary[0,0]:='100';  // UMS for 100%
  268.     NewMarkBoundary[1,0]:='90';  // UMS for an A*
  269.     NewMarkBoundary[2,0]:='80';  // UMS for an A
  270.     NewMarkBoundary[3,0]:='70';  // UMS for a B
  271.     NewMarkBoundary[4,0]:='60';  // UMS for a C
  272.     NewMarkBoundary[5,0]:='50';  // UMS for a D
  273.     NewMarkBoundary[6,0]:='40';  // UMS for an E
  274.     NewMarkBoundary[7,0]:='0';  // UMS for 0 marks
  275.  
  276.     // Prevent the user from altering the newboundary
  277.     DisableNewMarkBoundary;
  278.   end;
  279.  
  280. end;
  281.  
  282. procedure CalcCurrentGrade(HWAssess,  Group, StudentID, HWAssessName, HWAssessMark, HWAssessMaxMark, HWAssessUMS : string; NewAverageUMS: integer);
  283. var
  284.   // Email variables
  285.   EmailSenderUsername, EmailSenderPassword, EmailRecipient, EmailSubject, EmailBody : string;
  286.   AutomatedEmailTextFile : TextFile;
  287.   AutomatedEmailRead : string;
  288.   // Database variables
  289.   CurrentGrade, s, GradeProgression : String;
  290.   CurrentGradeChar, TargetGradeChar : Char;
  291.   Average : Integer;
  292.   PrevOnAlert : Boolean;
  293. begin
  294.   with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  295.   begin
  296.     { -----------  Refresh the DBGrid  ---------- }
  297.     Close;
  298.     SQL.Clear;  //  Initialize the SQL
  299.     //  Set the SQL
  300.     SQL.Text:='SELECT * FROM ['+HWAssess+Group+'] WHERE StudentID = '+StudentID;
  301.     ExecSQL;  //  Execute the SQL
  302.     Open;
  303.     {  ----------  Traverse through the table  ----------  }
  304.     if FieldByName('AverageUMS%').Value = Null then
  305.     begin
  306.       Average := NewAverageUMS;
  307.     end
  308.     else
  309.     begin
  310.       {  ---  Need to refreshh table here --- }
  311.       Average := Round((FieldByName('AverageUMS%').AsInteger + NewAverageUMS)/2);
  312.     end;
  313.   end;
  314.  
  315.   {  ----------  Convert the HW and Assessment Average to a grade  ----------  }
  316.   case Average of
  317.     90..100 : CurrentGrade := 'A*';  // Average UMS between 90-100 then average is A*
  318.     80..89 : CurrentGrade := 'A';  // Average UMS between 80-89 then average is A
  319.     70..79 : CurrentGrade := 'B';  // Average UMS between 70-79 then average is B
  320.     60..69 : CurrentGrade := 'C';  // Average UMS between 60-69 then average is C
  321.     50..59 : CurrentGrade := 'D';  // Average UMS between 50-59 then average is D
  322.     40..49 : CurrentGrade := 'E';  // Average UMS between 40-49 then average is E
  323.      0..39 : CurrentGrade := 'U';  // Average UMS between  0-39 then average is U
  324.   end;
  325.  
  326.   {  ----------  Update Student's Current Grade  ----------  }
  327.   with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  328.   begin
  329.     Close;
  330.     SQL.Clear;  //  Initialize the SQL
  331.     //  Set the SQL
  332.     SQL.Text:='UPDATE [StudentDetails] SET [CurrentGrade] = '+QuotedStr(CurrentGrade)+' WHERE StudentNumber ='+StudentID;
  333.     ExecSQL;  //  Execute the SQL
  334.   end;
  335.  
  336.   with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  337.   begin
  338.     {  ----------  Use group to find the student  ----------  }
  339.     Close;
  340.     SQL.Clear;  //  Initialize the SQL
  341.     //  Set the SQL
  342.     SQL.Text:='SELECT * FROM [StudentDetails] WHERE GroupName = '+QuotedStr(Group);
  343.     ExecSQL;  //  Execute the SQL
  344.     Open;
  345.  
  346.     {  ----------  Previously on Alert  ----------  }
  347.     if FieldByName('Progression').AsString = 'Below' then
  348.     begin
  349.       PrevOnAlert := True;
  350.     end;
  351.  
  352.  
  353.     {  ----------  Traverse through the table  ----------  }
  354.     First;
  355.     while not EoF do
  356.     begin
  357.       if FieldByName('StudentNumber').Value = frmAssessmentAndHomeworkEntry.dbgDisplayAssessmentHomeworkTables.DataSource.DataSet.FieldByName('StudentID').AsInteger then
  358.       begin
  359.         //  if the current grade is less then the target grade then...
  360.         if FieldByName('CurrentGrade').AsString < FieldByName('TargetGrade').AsString then
  361.         //  do this
  362.         begin
  363.           GradeProgression := 'Below';
  364.         end  // end of if statement
  365.         //  if the current grade is less then the target grade then...
  366.         else if FieldByName('CurrentGrade').AsString = FieldByName('TargetGrade').AsString then
  367.         //  do this
  368.         begin
  369.           GradeProgression := 'In Line';
  370.         end  // end of else if statement
  371.         //  if the current grade eqauls target grade then...
  372.         else
  373.         //  do this
  374.         begin
  375.           GradeProgression := 'Above';
  376.         end;  // end of else statement
  377.         Break;  // End the while and move on
  378.       end
  379.       else // if they are not the same
  380.       Next;  // move on to the next record
  381.     end;
  382.   end;
  383.  
  384.   with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  385.   begin
  386.     Close;
  387.     SQL.Clear;
  388.     SQL.Text:='UPDATE StudentDetails SET Progression = '+QuotedStr(GradeProgression)+' WHERE StudentNumber = '+StudentID;
  389.     ExecSQL;
  390.   end;
  391.  
  392.   if GradeProgression = 'Below' then
  393.   begin
  394.     if PrevOnAlert = False then
  395.     begin
  396.       EmailSubject := 'You are currently on Alert';
  397.       // Initialize the email body
  398.       EmailBody := '';
  399.       {  ----------  Read from Automated Email Textfile  ----------  }
  400.       AssignFile(AutomatedEmailTextFile, 'AutomatedEmail.txt');
  401.       Reset(AutomatedEmailTextFile);
  402.       while not Eof(AutomatedEmailTextFile) do
  403.       begin
  404.         Readln(AutomatedEmailTextFile, AutomatedEmailRead);
  405.         EmailBody := EmailBody + sLineBreak + AutomatedEmailRead;
  406.       end;
  407.       Closefile(AutomatedEmailTextFile);
  408.     end
  409.     else
  410.     begin
  411.       EmailSubject := '';
  412.       // Initialize the email body
  413.       EmailSubject := 'You still currently on Alert';
  414.  
  415.       {  ----------  Read from Automated Email Textfile  ----------  }
  416.       AssignFile(AutomatedEmailTextFile, 'AutomatedEmailPrevOnAlert.txt');
  417.       Reset(AutomatedEmailTextFile);
  418.       while not Eof(AutomatedEmailTextFile) do
  419.       begin
  420.         Readln(AutomatedEmailTextFile, AutomatedEmailRead);
  421.         EmailBody := EmailBody + sLineBreak +  AutomatedEmailRead;
  422.       end;
  423.       Closefile(AutomatedEmailTextFile);
  424.     end;
  425.  
  426.     EmailBody := EmailBody+sLineBreak+sLineBreak+'Your last socre:';
  427.  
  428.     EmailBody := EmailBody+sLineBreak+sLineBreak+HWAssessName+': '+HWAssessMark+'/'+HWAssessMaxMark+' ('+HWAssessUMS+' UMS)';
  429.  
  430.     frmEmailDetails.ledtEmailAddress.Enabled := True;
  431.     frmEmailDetails.ledtPassword.Enabled := True;
  432.  
  433.     with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  434.       begin
  435.         Close;
  436.         SQL.Clear;
  437.         SQL.Text:='SELECT StudentEmail FROM StudentDetails WHERE StudentNumber = '+StudentID;
  438.         ExecSQL;
  439.       Open;
  440.     end;
  441.  
  442.     // Set the varialbes
  443.     EmailSenderUsername := frmEmailDetails.ledtEmailAddress.Text;
  444.     EmailSenderPassword := frmEmailDetails.ledtPassword.Text;
  445.     EmailRecipient := dmDatabaseComponents.adoUnitHWAndAssesstEntry.FieldByName('StudentEmail').AsString;
  446.  
  447.     try
  448.       Gmail(EmailSenderUsername, EmailSenderPassword, EmailRecipient, EmailSubject, EmailBody);
  449.     except
  450.     end;
  451.   end;
  452.  
  453. end;
  454.  
  455. procedure TfrmAssessmentAndHomeworkEntry.btnSaveMarkClick(Sender: TObject);
  456. var
  457.   //  Count variables
  458.   x, i : integer;
  459.   MarkMin, UMSMin, ChangeInMarkBoundary, ChangeInUMSBoundary,  UMSValue : Integer;
  460.   // Current grade variables
  461.   AverageUMS : integer;
  462.   SumUMS : integer;
  463.   AverageUMSStr, GroupSelected, StudentNumber : string;
  464.   // Query variables
  465.   AssessOrHW, GroupName, AssessOrHwName : string;
  466.   // Error output variables
  467.   ErrorMessagePram : string;
  468. begin
  469.   //
  470.   ledtNewBoundaryAStar.Enabled := True;
  471.   {  ----------  Mark Achieved Validation  ----------  }
  472.   {  ----------  Presence Check  ----------  }
  473.   if ledtAHWMarkAchieved.Text = '' then
  474.   begin
  475.    Showmessage('ERROR: Please enter a mark achieved');
  476.    // ErrorOutputLabeledEdit('ERROR: Please enter a mark achieved', ledtAHWMarkAchieved);
  477.   end
  478.   {  ----------  Range Check  ----------   }
  479.   else if (StrToInt(ledtAHWMarkAchieved.Text) > 140) OR (StrToInt(ledtAHWMarkAchieved.Text) < 0) then
  480.   begin
  481.     Showmessage('ERROR: Mark achieved is out of range');
  482.   end
  483.   {  ----------  Homework/Assessment Name Validation  ----------  }
  484.   {  ----------  Presence Check  ----------  }
  485.   else if cboAHWName.Text = '' then
  486.   begin
  487.     ErrorOutputComboBox('ERROR: Please select a homework or assessment', cboAHWName);
  488.   end
  489.   {  ----------  Boundary Validation  ----------  }
  490.   {  ----------  Presence Check  ----------  }
  491.   else if ledtNewBoundaryAStar.Text = '' then
  492.   begin
  493.     PlaySound('SYSTEMEXCLAMATION', 0, SND_ASYNC);  //  Play error sound
  494.     Showmessage('ERROR: Please create a boundary first');  // Output error message
  495.     ledtNewBoundaryAStar.Enabled := False;
  496.   end
  497.   {  ----------  Error prevention  ----------  }
  498.   else if StrToInt(ledtAHWMarkAchieved.Text) > StrToInt(ledtMaxMarkInput.Text) then
  499.   begin
  500.     ErrorMessagePram := '';
  501.     ErrorMessagePram := 'ERROR: Mark achieved cannot be greater than the max mark';
  502.     ErrorOutputLabeledEdit(ErrorMessagePram, ledtAHWMarkAchieved)
  503.   end
  504.   else
  505.   begin
  506.     {}
  507.     StudentNumber := dbgDisplayAssessmentHomeworkTables.DataSource.DataSet.FieldByName('StudentID').AsString;
  508.     AssessOrHW := cboType.Items[cboType.ItemIndex];
  509.     GroupName := cboAHWSelectGroup.Items[cboAHWSelectGroup.ItemIndex];
  510.     AssessOrHwName := cboAHWName.Items[cboAHWName.ItemIndex];
  511.  
  512.     EnableNewMarkBoundary;
  513.     // If the student got mull marks
  514.     if ledtAHWMarkAchieved.Text = ledtMaxMarkInput.Text then
  515.     begin
  516.       // Set the UMS to 100
  517.       UMSValue := 100;
  518.     end  //  End if statement
  519.     else
  520.     begin
  521.       {  ----------  Convert Mark to UMS  ----------  }
  522.       for x := 0 to 6 do
  523.       begin
  524.         {Boundaries are real not integer}
  525.         if (StrToInt(ledtAHWMarkAchieved.Text) < StrToInt(NewMarkBoundary[x,1])) AND (StrToInt(ledtAHWMarkAchieved.Text) >= StrToInt(NewMarkBoundary[x+1,1])) then
  526.         begin
  527.           MarkMin := StrToInt(NewMarkBoundary[x+1,1]);
  528.           UMSMin := StrToInt(NewMarkBoundary[x+1,0]);
  529.           ChangeInMarkBoundary := StrToInt(NewMarkBoundary[x,1]) - StrToInt(NewMarkBoundary[x+1,1]);
  530.           ChangeInUMSBoundary := StrToInt(NewMarkBoundary[x,0]) - StrToInt(NewMarkBoundary[x+1,0]);
  531.           Break;  // Once the data has been calculated, break way from the loop
  532.         end;  //  End if statement
  533.       end; //  End of for loop
  534.  
  535.       UMSValue := Round((((ChangeInUMSBoundary/ChangeInMarkBoundary)*(StrToInt(ledtAHWMarkAchieved.Text)-MarkMin))+UMSMin));
  536.     end;  //  End of else statement
  537.  
  538.     {  ----------  Insert Mark Into the database  ----------  }
  539.     with dmdatabaseComponents.adoUnitHWAndAssesstEntry do
  540.     begin
  541.       Close;
  542.       SQL.Clear;  // Initialize SQL
  543.       // Set the SQL
  544.       SQL.Text:='UPDATE ['+AssessOrHW+GroupName+'] SET ['+AssessOrHwName+'] = '+IntToStr(UMSValue)+' WHERE StudentID = '+StudentNumber;
  545.       ExecSQL; // Execute the query
  546.     end;
  547.  
  548.     {  ----------  Calculate the average UMS  ----------  }
  549.     with dmDatabaseComponents.adoUnitHWAndAssesstEntry do
  550.     begin
  551.       Close;
  552.       SQL.Clear;  //  Initialize
  553.       //  Set the SQL
  554.       SQL.Text := 'SELECT * FROM ['+AssessOrHW+GroupName+'] WHERE StudentID = '+QuotedStr(StudentNumber);
  555.       Open;
  556.         //  Loop through all the columns
  557.         for i := 3 to FieldCount-1 do
  558.         begin
  559.           // Find the sum of all UMS marks
  560.           SumUMS := SumUMS + Fields[i].Value;
  561.         end;
  562.         Showmessage('This is Sum UMS '+IntToStr(SumUMS));
  563.         // Calculate the average of the UMS Marks
  564.         AverageUMS := Round((SumUMS / (FieldCount - 3)));
  565.     end;
  566.  
  567.     {  ----------  Update the AverageUMS% for the student  ----------  }
  568.     with dmdatabaseComponents.adoUnitHWAndAssesstEntry do
  569.     begin
  570.       Close;
  571.       SQL.Clear;  // Initialize SQL
  572.       // Set the SQL
  573.       SQL.Text:='UPDATE ['+AssessOrHW+GroupName+'] SET [AverageUMS%] = '+IntToStr(AverageUMS)+' WHERE StudentID = '+StudentNumber;
  574.       ExecSQL;  // Execute query
  575.     end;
  576.  
  577.     GroupSelected := cboAHWSelectGroup.Items[cboAHWSelectGroup.ItemIndex];
  578.  
  579.     if cboType.Items[cboType.ItemIndex] = 'ASSESSMENT' then
  580.     begin
  581.       CalcCurrentGrade('HOMEWORK', GroupName, StudentNumber, AssessOrHWName, ledtAHWMarkAchieved.Text, ledtMaxMarkInput.Text, IntToStr(UMSValue), AverageUMS);
  582.     end
  583.     else
  584.     begin
  585.       CalcCurrentGrade('ASSESSMENT', GroupName, StudentNumber, AssessOrHWName, ledtAHWMarkAchieved.Text, ledtMaxMarkInput.Text, IntToStr(UMSValue), AverageUMS);
  586.     end;
  587.  
  588.     //  Once the entire procedure has been completed disable the inputs to stop the user from altering th grade boundaries
  589.     DisableNewMarkBoundary;
  590.  
  591.     // Clear the mark input
  592.   ledtAHWMarkAchieved.Text := '';
  593.  
  594.   end;
  595. end;
  596.  
  597. procedure TfrmAssessmentAndHomeworkEntry.btnSaveMarksClick(Sender: TObject);
  598. var
  599.   x : integer;
  600.   i : integer;
  601.   GradeBoundaryValid : Boolean;
  602. begin
  603.  
  604.   //  Save values to the correct array items
  605.   ExamBMarksBoundary[0]:=ledtExamBMaxMark.Text;  // Save max mark
  606.   ExamBMarksBoundary[1]:=ledtExamMarkAStar.Text;  // Save mark for A*
  607.   ExamBMarksBoundary[2]:=ledtExamMarkA.Text;  // Save mark for A
  608.   ExamBMarksBoundary[3]:=ledtExamMarkB.Text;  // Save mark for B
  609.   ExamBMarksBoundary[4]:=ledtExamMarkC.Text;  // Save mark for C
  610.   ExamBMarksBoundary[5]:=ledtExamMarkD.Text;  // Save mark for D
  611.   ExamBMarksBoundary[6]:=ledtExamMarkE.Text;  // Save mark for E
  612.   ExamBMarksBoundary[7]:='0';  //  Save the zero mark
  613.  
  614.   for i := 0 to 5 do
  615.   begin
  616.     if (ExamBMarksBoundary[i] < ExamBMarksBoundary[i+1]) OR (ExamBMarksBoundary[i] = '0') OR (ExamBMarksBoundary[i+1] = '0') then
  617.     begin
  618.       Showmessage('Please enter a real set of grade boundaries');
  619.       GradeBoundaryValid := True;
  620.     end
  621.   end;
  622.  
  623.   if GradeBoundaryValid = False then
  624.   begin
  625.     {  ----------  Save the exam grade boundaries  ----------  }
  626.     AssignFile(ExamMarksBoundaryFile,'ExamMarkBoundary.txt');
  627.     //  Delete the existing file
  628.     DeleteFile('ExamMarkBoundary.txt');
  629.     // Open the file for write access
  630.     Rewrite(ExamMarksBoundaryFile);
  631.     //  Go through each data item of the array
  632.     for x := 0 to 7 do
  633.     begin
  634.       // Write the file the contents of the data item at index x
  635.       Writeln(ExamMarksBoundaryFile, ExamBMarksBoundary[x]);
  636.     end;
  637.     // Once saved close the file
  638.     CloseFile(ExamMarksBoundaryFile);
  639.  
  640.     // Prevent the user from pressing the save button again
  641.     btnSaveMarks.Enabled:=False;
  642.     // Allow the user to change marks as soon as current boundaries are saved
  643.     btnAlterMarks.Enabled:=True;
  644.     // Disable the inputs of the exam grade boundaries
  645.     DisableExamBMarksInput;
  646.  
  647.     Showmessage('The grade boundaries were successully saved');
  648.  
  649.   end;
  650. end;
  651.  
  652. procedure TfrmAssessmentAndHomeworkEntry.btnAHWSelectGroupClick(Sender: TObject);
  653. var
  654.   x : integer;
  655. begin
  656.   if cboAHWSelectGroup.Text = '' then
  657.   begin
  658.     ErrorOutputComboBox('ERROR: Please select a group', cboAHWSelectGroup);
  659.   end
  660.   else if cboType.Text ='' then
  661.   begin
  662.     ErrorOutputComboBox('ERROR: Please select a type', cboType);
  663.   end
  664.   else
  665.   begin
  666.     with dmDatabaseComponents.adoAHWDisplayAssessmentHomework do
  667.     begin
  668.       Close;
  669.       SQL.Text:='SELECT * FROM ['+cboType.Items[cboType.ItemIndex]+cboAHWSelectGroup.Items[cboAHWSelectGroup.ItemIndex]+']';
  670.       ExecSQL;
  671.       Open;
  672.     end;
  673.  
  674.     with dbgDisplayAssessmentHomeworkTables do
  675.     begin
  676.       cboAHWName.Clear;
  677.       for x := 3 to FieldCount - 1 do
  678.       cboAHWName.Items.Add(Columns[x].Title.Caption);
  679.     end;
  680.  
  681.     cboAHWName.Enabled := True;
  682.     cboAHWName.Enabled := True;
  683.     ledtAHWMarkAchieved.Enabled :=  True;
  684.     btnSaveMark.Enabled := True;
  685.   end;
  686. end;
  687.  
  688. procedure TfrmAssessmentAndHomeworkEntry.FormShow(Sender: TObject);
  689. var
  690.   x : integer;
  691. begin
  692.    { ----------  Add latest group anmes to the combo box  ---------- }
  693.   cboAHWSelectGroup.Clear; // Initialize the contents of the combo box
  694.  
  695.   with dmDatabaseComponents.adoAHWDisplayGroupNames do
  696.   begin
  697.     First;  // Start at first record
  698.     while not EoF do
  699.     begin
  700.        cboAHWSelectGroup.Items.Add(FieldByName('GroupName').AsString);  // Read the GroupNames record only
  701.        Next;  // Next Record
  702.     end; // End While
  703.   end;
  704.  
  705.   {  ----------  Diplay Saved UMS  ----------  }
  706.   AssignFile(ExamMarksBoundaryFile,'ExamMarkBoundary.txt');
  707.   Reset(ExamMarksBoundaryFile);
  708.   x:=0;
  709.   while not Eof(ExamMarksBoundaryFile) do
  710.   begin
  711.     Readln(ExamMarksBoundaryFile, ExamBMarksBoundary[x]);
  712.     x := x + 1;
  713.   end;
  714.   CloseFile(ExamMarksBoundaryFile);
  715.  
  716.   {  ----------  Output the UMS values  ----------  }
  717.   ledtExamBMaxMark.Text:=ExamBMarksBoundary[0];
  718.   ledtExamMarkAStar.Text:=ExamBMarksBoundary[1];  // Output UMS boundary for A*
  719.   ledtExamMarkA.Text:=ExamBMarksBoundary[2];  // Output UMS boundary for A
  720.   ledtExamMarkB.Text:=ExamBMarksBoundary[3];  // Output UMS boundary for B
  721.   ledtExamMarkC.Text:=ExamBMarksBoundary[4];  // Output UMS boundary for C
  722.   ledtExamMarkD.Text:=ExamBMarksBoundary[5];  // Output UMS boundary for D
  723.   ledtExamMarkE.Text:=ExamBMarksBoundary[6];  // Output UMS boundary for E
  724.  
  725.   {  ----------  Disable input of Exam Mark Boundary and New Mark Boundary  ----------  }
  726.   DisableNewMarkBoundary;
  727.   DisableExamBMarksInput;
  728. end;
  729.  
  730. procedure TfrmAssessmentAndHomeworkEntry.ledtAHWMarkAchievedKeyPress(
  731.   Sender: TObject; var Key: Char);
  732. begin
  733.   CorrectKeyPressedNumerical(Key, 'Mark achieved');
  734. end;
  735.  
  736. procedure TfrmAssessmentAndHomeworkEntry.ledtExamBMaxMarkKeyPress(
  737.   Sender: TObject; var Key: Char);
  738. begin
  739.   CorrectKeyPressedNumerical(Key, 'Exam board max mark');
  740. end;
  741.  
  742. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkAKeyPress(Sender: TObject;
  743.   var Key: Char);
  744. begin
  745.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  746. end;
  747.  
  748. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkAStarKeyPress(
  749.   Sender: TObject; var Key: Char);
  750. begin
  751.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  752. end;
  753.  
  754. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkBKeyPress(Sender: TObject;
  755.   var Key: Char);
  756. begin
  757.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  758. end;
  759.  
  760. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkCKeyPress(Sender: TObject;
  761.   var Key: Char);
  762. begin
  763.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  764. end;
  765.  
  766. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkDKeyPress(Sender: TObject;
  767.   var Key: Char);
  768. begin
  769.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  770. end;
  771.  
  772. procedure TfrmAssessmentAndHomeworkEntry.ledtExamMarkEKeyPress(Sender: TObject;
  773.   var Key: Char);
  774. begin
  775.   CorrectKeyPressedNumerical(Key, 'A grade boundary');
  776. end;
  777.  
  778. procedure TfrmAssessmentAndHomeworkEntry.ledtMaxMarkInputKeyPress(
  779.   Sender: TObject; var Key: Char);
  780. begin
  781.   CorrectKeyPressedNumerical(Key, 'Max mark');
  782. end;
  783.  
  784. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement