⑿ 编写FormAchievement的OnClose事件,释放创建的用于存放树型结构中间数据的列表和用于输入成绩的TEdit对象,关闭数据集并将成绩占比数据保存到文件中,相关代码如下:
procedure TFormAchievement.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TreeList.Free;
DMServerDB.ADODataSetAchievement.Filter := '';
DMServerDB.ADODataSetAchievement.Close;
DMServerDB.ADODataSetStudent.Close;
IniFile.WriteString('ScorePer', 'Achievement1', Edit1.Text);
IniFile.WriteString('ScorePer', 'Achievement2', Edit2.Text);
IniFile.WriteString('ScorePer', 'Achievement3', Edit3.Text);
FreeEditAchievement();
end;
⒀ 下面是在图6的成绩输出报表界面中编程计算出各档成绩的人数。先在打印报表前将各档成绩的人数清零,因此需要定义报表对象的BeforePrint事件,相关代码如下:
procedure TFormPrintAchievement.QuickRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
Var
i : Integer;
begin
for i:= 0 to 5 do Scope[i]:=0; // 六档成绩人数清零
NumCount := 0; // 总人数清零
end;
⒁ 每输出一个学生,按学生成绩将相应档成绩的人数加1、总人数加1,因此需要定义细节带对象的BeforePrint事件,相关代码如下:
procedure TFormPrintAchievement.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
AchievementScope : SmallInt;
begin
with DMServerDB do begin
// 定位学生,在报表中显示学生名
ADODataSetStudent.Locate('StudentID',ADODataSetAchievement.FieldValues['StudentID'], []);
// 将成绩转化为0,1,2...,10各档
AchievementScope:=Round(ADODataSetAchievement.FieldValues['Achievement']) Div 10;
Case AchievementScope of
0..5: Inc(Scope[0]); // 不及格人数加1
else Inc(Scope[AchievementScope-5]); // 其它相应档人数加1
end;
end;
Inc( NumCount ); // 总人数加1
end;
⒂ 在汇总带中显示出各档成绩的人数和百分比,因此需要定义汇总带对象的BeforePrint事件,相关代码如下:
procedure TFormPrintAchievement.SummaryBand1BeforePrint(
Sender: TQRCustomBand; var PrintBand: Boolean);
begin
QRLabelScope1.Caption := IntToStr(Scope[4]+Scope[5])+'人,'+
Format('%.1f',[(Scope[4]+Scope[5])*100.0/NumCount])+'%'; // 优秀的人数及百分比
|