给你们发EMAIL太费力,我比较懒,呵呵,特此粘贴,大家共享
名称:考试系统随机出题
procedure TdmTest.RandomGetQuestion;
var
iQuestionID:integer;
cQuestionID:string;
i, j, m:integer;
QuestionRate:integer;
QuestionType:string;
QuestionCount:integer;
IsRepeat:boolean;
Buffer1:array [0..99] of integer;
//100道题目
Buffer2:integer;
begin
//以下为在题库中随机取100道题
dmTest.tblST.Open;
//打开试题库
dmTest.tblTK.Open;
//打开考试题库
Buffer2:=0;
dmSystem.vtbCTBL.First ;
//出题的题型数据表打开移动到第一条记录
for i:=1 to dmSystem.vtbCTBL.RecordCount do
//针对每种题型进行循环
begin
QuestionType:=dmsystem.vtbCTBL.FieldByName('c_TX').AsString;
//取得题型
QuestionRate:=dmsystem.vtbCTBL.FieldByName('N_BL').AsInteger;
//取得该题型比例
tblTK.Filtered:=false;
tblTK.Filter:='C_TX='''+QuestionType+'''';
tblTK.Filtered:=true;
//按照题型过滤题库
QuestionCount:=dmTest.tblTK.RecordCount;
//过滤后题库的题目数量
for j:=1 to QuestionRate do
//按照比例数量生成题号
begin
//取随机数
Repeat
IsRepeat:=false;
iQuestionID:=RandomRange(1,QuestionCount);
cQuestionID:=IntToStr(iQuestionID);
Buffer1[j]:=iQuestionID;
for m:=1 to j-1 do
begin
if Buffer1[m]=Buffer1[j] then
begin
IsRepeat:=true;
Break;
end ;
end;
until
IsRepeat=false;
//查找和随机数对应的题号的试题
tblTK.locate('n_th;c_tx;n_yy',VarArrayOf([iQuestionID,QuestionType,I_LANGUAGE]),[]);
//写进本地考试试题表
with tblST do
begin
Append;
FieldByName('N_YY').AsInteger:=I_LANGUAGE;
//语种
FieldByName('N_XH').AsInteger:=Buffer2+j;
//考试题目序号(1--100)
FieldByName('N_TH').AsInteger:=iQuestionID;
//题库中号码
FieldByName('C_TX').AsString:=QuestionType;
//题目类型
.......
Post;
end;
end;
dmSystem.vtbCTBL.Next;
//下一题型
Buffer2:=Buffer2+QuestionRate;
//考试题库指针位置改变,下一题目从该位置开始
end;
tblST.Close ;
tblTK.Close ;
end;
说明:
1 该考试系统为100道题目,每种题型所占百分比为1---100之间的整数,保存在题型的比例表中
2 tblst 为考试试题库,每次动态产生100题,下次考试重新刷新
3 tbltk 为试题题库,每次试题从这个库中提取
4 dmSystem.vtbCTBL 为一个数据集合,存储各种题型的名称和所占比例