⑺ 编写“考试类型”对象ComboBoxAchievementType的OnChange事件,用于输入不同考试类型的成绩。除正常考试外,其他的考试类型(如补考、重修等)必须是上一种考试类型不及格的学生。每个学生动态创建5个TEdit对象,前两个用于显示学生学号和姓名,中间的三个用于每位学生平时、期中和期末成绩的输入,最后一个用于显示计算得到的总评成绩。计算成绩的工作由这些TEdit对象的OnChange事件完成,但程序设计时无法知道到底要动态创建多少个TEdit对象,因此无法在设计时为这些TEdit对象一一设计OnChange事件,所以必须在程序中为每个输入对象动态设置OnChange事件,相关代码如下:
procedure TFormAchievement.ComboBoxAchievementTypeChange(Sender: TObject);
var
iPos, iAchievementTypeID, j : Integer;
begin
// 若成绩占比部和不足100,则退出
if Not CalculatePercent then Exit;
// 释放为输入前一班级学生成绩所创建输入框所占用的内存
FreeEditAchievement();
// 计算考试类型的ID值
iPos := pos(' ', ComboBoxAchievementType.Text);
AchievementTypeID := Copy(ComboBoxAchievementType.Text,1,iPos-1);
iAchievementTypeID := StrToInt(AchievementTypeID);
with DMServerDB do begin
ADODataSetStudent.Close;
// 过滤出该班的学生
case iAchievementTypeID of
1: Begin // 正常考试
strSQL:='Select StudentID, StudentName from Student Where ClassID=''';
strSQL:=strSQL+TreeList[SelectNode.Parent.AbsoluteIndex]+'''';
strSQL:=strSQL+' Order By StudentID';
End;
else Begin // 补考等
strSQL:='Select A.StudentID, StudentName';
strSQL:=strSQL+' FROM Achievement A INNER JOIN';
strSQL:=strSQL+' Student Stu ON A.StudentID = Stu.StudentID';
strSQL:=strSQL+' Where PlanCourseOrder='+TreeList[SelectNode.AbsoluteIndex];
strSQL:=strSQL+' And Achievement<60 And AchievementTypeID='+IntToStr(iAchievementTypeID);
strSQL:=strSQL+' And Stu.ClassID='''+TreeList[SelectNode.Parent.AbsoluteIndex]+'''';
strSQL:=strSQL+' Order By A.StudentID';
End;
end;
ADODataSetStudent.CommandText := strSQL;
ADODataSetStudent.Open;
// 学生的个数
StatusBar.Panels[3].Text:=IntToStr(ADODataSetStudent.RecordCount);
// 根据学生人数设置EditAchievement动态数据的大小
SetLength(EditAchievement, ADODataSetStudent.RecordCount);
// 从课程成绩表Achievement中取出该课程的学生成绩
ADODataSetAchievement.Close;
strSQL:='SELECT * FROM Achievement Where PlanCourseOrder='+TreeList[SelectNode.AbsoluteIndex];
strSQL:=strSQL+' And AchievementTypeID='+AchievementTypeID+' And StudentID IN';
|