随着网络的发展,办公自动化等现代信息技术在学校中的成功应用,学院的教务管理系统也应该实现信息自动化管理。现在学院有很多的考试,如高校计算机一级考试,英语等级考试等。为了加强考试管理工作、严肃考风考纪,杜绝使用假证件舞弊之风,确保考试的公平,同时对考生、监考老师、考场管理,减少监考老师核对身份的时间,我们开发了一个简单的准考证管理系统。
一、系统要求
通过调查,要求系统需要有以下功能:有良好的人机界面;采集考生的相片,并进行相应的管理;支持多种方式的考生信息的录入,也支持外部数据的导入;方便的数据查询,支持多条件查询;进行考生考场和座位管理,数据稳定性好;数据计算自动完成,尽量减少人工干预;支持具有相片的准考证的打印和进行监考人员的管理
二、设计内容
准考证管理系统是一个典型的数据库应用程序,由考生基本信息维护、准考证信息维护、准考证的打印、考场的管理、考生的查询与分析、准考证号的生成、考生相片采集等模块组成,其程序流程如图1所示。由于本系统是一个简单的应用系统,因此,在选择数据库时,应考虑数据库应用的特点及适用范围,本系统选用的数据库语言为ACCESS2003。

图1 程序流程图
三、关健技术
1.信息录入
由于每一个考生在入学时就已经在学院的学籍管理系统有考生的信息,只要在考试时导入就可以了,方便了学院考务的管理。也可以通过手工的方式进行录入。在本系统中也支持ACCESS和EXCEL的数据导入。
2.相片采集
在以前的考务管理系统中,准考证上是没有相片的。为了防止使用假证件舞弊,就需要将考生的相片打印到准考证上,在这个系统中,主要是通过系统的API函数直接地调用了外部的数据相机,如果对相片的要求不是非常高的话,也可以考虑用摄像头,在本系统中,采用了130万像素的摄像头。其实现的核心代码如下:
procedure TForm1.bntDCClick(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',WS_CHILD or WS_VISIBLE ,0,0,Panel1.Width,Panel1.Height,Panel1.Handle,0);
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
end;
end;
3.相片存储
在一般的管理系统中,图片、视频文件都存储在数据库中,对于文件比较多的情况,数据库运行就会比较慢。这里直接将摄像头传过来的图片直接存放在一个文件中,在数据库中只保留相应的文件名。这样数据库小,系统运行快。
其主要的源代码如下。
procedure TForm1.bntphotoClick(Sender: TObject);
var
filename,classname,photodir:String;
begin
if hWndC <> 0 then
begin
//保存时的目标文件名
FileName:=ADOTable1.FieldByName('姓名').AsString+ADOTable1.FieldByName('学号')
.AsString+'.bmp';
ClassName:=ADOTable1.FieldByName('班级').AsString;
photodir:=PChar(ExtractFilePath(ParamStr(0))+'\photo\'+classname);
//检查是否存在该班级的目录
if not DirectoryExists(photodir) then
begin
ForceDirectories(photodir);
end;
ADOTable1.Edit;
SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(photodir+'\'+filename));
ADOTable1['相片']:=FileName;
adotable1.Post;
end;
end;
4.报表打印
相片存放在外面的文件夹里,如何将考生的信息及相片打印出来呢?如果直接用Delphi的控件来生成报表,比较麻烦,而且生成后,用户无法修改报表。
其做法是将考生的信息和相片导出存放在Excel中,这样报表生成后,用户还可以根据自己的要求做些相应的修改。
本系统将准考证直接导出到Microsoft Excel文件中,这样有利于准考证格式的修改和打印。核心代码如下:
procedure TForm1.btnPrintZhuanKaoZhengClick(Sender: TObject);
const
CardWidth:Integer=6;{每张准考证占用的横向单元格数}
CardHeight:Integer=17;{每张准考证占用的纵向单元格数}
var
xlsApp,xlsBook,xlsSheet:oleVariant;
cRec:TBookMark;
i,j:Integer;
startR,endR,Photo:String;//选择范围的起始、结束单元格
xlsFileName:String;
isContinue:Boolean;
begin
if sgZhuanKaoZheng.Execute then
begin
xlsFileName:=sgZhuanKaoZheng.FileName;
{if FileExists(xlsFileName) then
begin
if Application.MessageBox(PChar('文件'+xlsFileName+'已经存在,是否覆盖?'),'用户信息',MB_YESNO)=IDYES then
begin
isContinue:=True
end
else
isContinue:=False;
end;
}
isContinue:=True;
if isContinue then
begin
//连接到Excel应用程序
xlsApp:=CreateOleObject('Excel.Application');
//xlsApp.Visible:=True;
xlsBook:=xlsApp.WorkBooks.Add(Null);
xlsSheet:=xlsBook.WorkSheets[1];
with self.ADOTable1 do
begin
//记录准考证原来的位置
cRec:=GetBookmark;
DisableControls;
first;
i:=1;
while not eof do
begin
j:=1;//每行两人
while not eof and (j<=2) do
begin
xlsSheet.Cells[(i-1)*CardHeight+1,(j-1)*CardWidth+1]:='学号';
xlsSheet.Cells[(i-1)*CardHeight+2,(j-1)*CardWidth+1]:='姓名';
xlsSheet.Cells[(i-1)*CardHeight+3,(j-1)*CardWidth+1]:='性别';
xlsSheet.Cells[(i-1)*CardHeight+4,(j-1)*CardWidth+1]:='院系';
xlsSheet.Cells[(i-1)*CardHeight+5,(j-1)*CardWidth+1]:='考场';
xlsSheet.Cells[(i-1)*CardHeight+6,(j-1)*CardWidth+1]:='座位';
xlsSheet.Cells[(i-1)*CardHeight+7,(j-1)*CardWidth+1]:='考试等级';
xlsSheet.Cells[(i-1)*CardHeight+8,(j-1)*CardWidth+1]:='考试时间';
xlsSheet.Cells[(i-1)*CardHeight+9,(j-1)*CardWidth+1]:='考试须知';
xlsSheet.Cells[(i-1)*CardHeight+1,(j-1)*CardWidth+2]:=FieldByName('学号')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+2,(j-1)*CardWidth+2]:=FieldByName('姓名')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+3,(j-1)*CardWidth+2]:=FieldByName('性别')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+4,(j-1)*CardWidth+2]:=FieldByName('院系')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+5,(j-1)*CardWidth+2]:=FieldByName('考场')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+6,(j-1)*CardWidth+2]:=FieldByName('座位')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+7,(j-1)*CardWidth+2]:=FieldByName('考试类型')
.AsString;
xlsSheet.Cells[(i-1)*CardHeight+8,(j-1)*CardWidth+2]:=FieldByName('考试时间').
AsString;
startR:=Chr(ord('D')+(j-1)*CardWidth)+IntToStr((i-1)*CardHeight+1);
endR:=Chr(ord('E')+(j-1)*CardWidth)+IntToStr((i-1)*CardHeight+7);
xlsSheet.Range[startR,endR].Merge;
xlsSheet.Cells[(i-1)*CardHeight+1,(j-1)*CardWidth+4].Select;
Photo:=ExtractFilePath(ParamStr(0))+'photo\'+FieldByName('班级').
AsString+'\'+FieldByName('相片').AsString;
if FileExists(Photo) then
xlsSheet.Shapes.AddPicture(Photo,False,True,
xlsSheet.Range[startR,endR].Left,xlsSheet.Range[startR,endR].Top,
xlsSheet.Range[startR,endR].Width,xlsSheet.Range[startR,endR].Height);
xlsSheet.Range[Chr(ord('A')+(j-1)*CardWidth)+IntToStr((i-1)*CardHeight+10),Chr(ord('E')+(j-1)*CardWidth)+IntToStr((i-1)*CardHeight+16)].Merge;
xlsSheet.Cells[(i-1)*CardHeight+10,(j-1)*CardWidth+1].Font.Size:=7;
xlsSheet.Cells[(i-1)*CardHeight+10,(j-1)*CardWidth+1]:=self.ADOTable4.FieldByName('考试须知').AsString;
Inc(j);
Next;
end;
Inc(i);
end;
GotoBookMark(cRec);
EnableControls;
FreeBookmark(cRec);
end;
xlsBook.SaveAs(sgZhuanKaoZheng.FileName);
xlsApp.Quit;
xlsSheet:=null;
xlsBook:=null;
xlsApp:=null;
end;
end;
end;
5.系统用户管理
每一个用户都有唯一的用户名称和口令,分别记为UserID和Password。为了增加用户口令的安全性,限制口令的长度为6-14位的字母和数字的混合。用户登录时,必须提供正确的用户名和密码,并可以根据用户的权限给予相关的功能。
6.数据库的安全
由于ACCESS数据容易被人直接修改,在ACCESS的数据库设定相应的密码,用来防止用户直接修改数据库里的信息。在Delphi的数据连接时,直接由控件提供相应的连接密码。
四、系统主界面
本系统登录后的界面如图2所示,可以很方便对考生基本信息维护、准考证信息维护、准考证的打印、考场的管理、考试者的查询与分析、准考证号的生成、考生相片采集等模块进行操作。

图2 系统运行界面
五、结论
本系统是结合学院的计算机一级考试的要求进行开发的,整个系统具有良好的实用性和扩展性、可靠性和稳定性。本系统已经在学院的计算机一级考试中应用,能满足考试的管理要求。使用系统后可以减少学校有关部门和相关工作人员的劳动强度,并增加工作效率,提高了学校管理信息化水平,使学院的考务管理水平上了一个新的台阶。系统具有较好的通用性和推广利用的价值。
|