📄 main_form.pas
字号:
begin
if (SJDA=nil)or(SJDA.Count=0) then
begin
MessageBox(handle,'答案还没生成,请先预览试卷!','没有答案',MB_OK or MB_ICONERROR);
exit;
end;
AppPath:=ExtractFilePath(Application.ExeName); //取得本程序的路径
//显示进度窗口
RateProcess_F.Show;
RateProcess_F.CZ_P.Caption:='正在链接Microsoft Office Word......';
RateProcess_F.Rate_Gauge.MaxValue:=SJDA.Count+25;
RateProcess_F.Repaint; //重绘窗口,否则显示不出新设置的控件属性
try
SJ_WA.Connect;
except
MessageBox(handle,'无法连接,也许没有安装Word','连接出错', MB_Ok or MB_ICONERROR);
RateProcess_F.Close;
Abort;
end;
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+10;
//SJ_WA.Visible := False;
//SJ_WA.Caption := '题库系统与试卷生成'; //Word应用程序的标题包含的所有文档标题都被修改
//建立一个新文档
{Template := EmptyParam;
NewTemplate := false;}
ItemIndex :=1;
NewDocument:=SJ_WA.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
RateProcess_F.CZ_P.Caption:='正在新建Microsoft Office Word 文档......';
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+5;
RateProcess_F.Repaint;
//建立WordDocument连接
SJ_WD.ConnectTo(NewDocument); //链接到刚在上面建立的新文档
SJ_WD.Windows.Item(ItemIndex).Caption:='数据库原理与应用期末试卷答案';//此文档的第一个窗口的标题
{ItemIndex1:=2; //ItemIndex1定义为OleVariant类型
SJ_WA.Documents.Item(ItemIndex1).Windows.Item(ItemIndex).Caption:='kkkkkkkkkk';
//从这个测试可以看出调用SJ_WA.Documents.Add后新建的文档的index为1
}
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+5;
RateProcess_F.Repaint;
//因为Word进行拼写检查需要很多时间,所以首先关闭检查
SJ_WA.Options.CheckSpellingAsYouType := False;
SJ_WA.Options.CheckGrammarAsYouType := False;
//设置Word的字体
SetFont(1,0,0,22);
//设置段落对齐方式
//SJ_WA.Documents.Item(ItemIndex).Paragraphs.Alignment :=wdAlignParagraphCenter;
SJ_WD.Range.InsertAfter('数据库原理与应用期末试卷答案'+#13);
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+5;
RateProcess_F.Repaint;
SJ_WD.Range.InsertAfter(' '+#13);
SetFont(0,0,0,10);
//准备循环输出答案
i:=0;
j:=0; //j为每一部分的小题序号
k:=1; //k为小题里的分问题的序号
repeat
temp:=SJDA.Strings[i];
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;//显示进度
RateProcess_F.Repaint;
if temp[1]='#' then //新的部分开始
begin
SJ_WD.Sentences.Last.InsertAfter(#13);
SJ_WD.Sentences.Last.InsertAfter(AnsiReplaceStr(temp,'#','')+#13);
j:=0;
i:=i+1;
continue;
end;
if pos(UpperCase('.doc'),UpperCase(temp))>0 then //答案里有word文档
begin
SJ_WD.Sentences.Last.InsertAfter(' '+#13);
SJ_WD.Sentences.Last.InsertFile(AppPath+'doc\'+temp,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
SJ_WD.Sentences.Last.InsertAfter(#13+#13+#13+#13+#13+#13);
i:=i+1;
continue;
end;
if temp='*' then //这一题里有小题
begin
k:=1;
i:=i+1;
continue;
end;
if temp[1]<>'!' then //内无小题的题目的答案
begin
j:=j+1; //题号加1
DAStr:=IntToStr(j)+'、'+temp;
SJ_WD.Sentences.Last.InsertAfter(DAStr+#13);
end
else begin
if k=1 then
begin
j:=j+1; //题号加1
DAStr:=IntToStr(j)+'、';
SJ_WD.Sentences.Last.InsertAfter(DAStr+#13);
end;
DAStr:=' '+IntToStr(k)+'.'+AnsiReplaceStr(SJDA.Strings[i],'!','');
SJ_WD.Sentences.Last.InsertAfter(DAStr+#13+#13);
k:=k+1;
end;
i:=i+1;
until (i>SJDA.Count-1);
Wait(1000);
RateProcess_F.Close; //关闭进度窗口
SJ_WA.Visible:=true;
SJ_WA.Disconnect; //断开链接
SJ_WD.Disconnect;
end;
//****************************************************************************************
procedure TMain_F.About_FBtnClick(Sender: TObject); //关于窗口
begin
with TAbout_F.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
//****************************************************************************************
procedure TMain_F.TKLR_FBtnClick(Sender: TObject); //题库录入
begin
XYSJ_FBtn.ColorBorder:=clMoneyGreen;
ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
SDSJ_FBtn.ColorBorder:=clMoneyGreen;
TKLR_FBtn.ColorBorder:=clBlue;
TKWH_FBtn.ColorBorder:=clMoneyGreen;
XXSZ_FBtn.ColorBorder:=clMoneyGreen;
XYSJ_FBtn.ColorHighLight:=clWhite;
XYSJ_FBtn.ColorShadow:=clBlack;
ZDSJ_FBtn.ColorHighLight:=clWhite;
ZDSJ_FBtn.ColorShadow:=clBlack;
SDSJ_FBtn.ColorHighLight:=clWhite;
SDSJ_FBtn.ColorShadow:=clBlack;
TKLR_FBtn.ColorHighLight:=clBlue;
TKLR_FBtn.ColorShadow:=clBlue;
TKWH_FBtn.ColorHighLight:=clWhite;
TKWH_FBtn.ColorShadow:=clBlack;
XXSZ_FBtn.ColorHighLight:=clWhite;
XXSZ_FBtn.ColorShadow:=clBlack;
with TTIMuLuRu.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
//****************************************************************************************
procedure TMain_F.TKWH_FBtnClick(Sender: TObject); //题库维护
begin
XYSJ_FBtn.ColorBorder:=clMoneyGreen;
ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
SDSJ_FBtn.ColorBorder:=clMoneyGreen;
TKLR_FBtn.ColorBorder:=clMoneyGreen;
TKWH_FBtn.ColorBorder:=clBlue;
XXSZ_FBtn.ColorBorder:=clMoneyGreen;
XYSJ_FBtn.ColorHighLight:=clWhite;
XYSJ_FBtn.ColorShadow:=clBlack;
ZDSJ_FBtn.ColorHighLight:=clWhite;
ZDSJ_FBtn.ColorShadow:=clBlack;
SDSJ_FBtn.ColorHighLight:=clWhite;
SDSJ_FBtn.ColorShadow:=clBlack;
TKLR_FBtn.ColorHighLight:=clWhite;
TKLR_FBtn.ColorShadow:=clBlack;
TKWH_FBtn.ColorHighLight:=clBlue;
TKWH_FBtn.ColorShadow:=clBlue;
XXSZ_FBtn.ColorHighLight:=clWhite;
XXSZ_FBtn.ColorShadow:=clBlack;
with TForm1.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
//****************************************************************************************
procedure TMain_F.XXSZ_FBtnClick(Sender: TObject); //选项设置窗口
begin
XYSJ_FBtn.ColorBorder:=clMoneyGreen;
ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
SDSJ_FBtn.ColorBorder:=clMoneyGreen;
TKLR_FBtn.ColorBorder:=clMoneyGreen;
TKWH_FBtn.ColorBorder:=clMoneyGreen;
XXSZ_FBtn.ColorBorder:=clBlue;
XYSJ_FBtn.ColorHighLight:=clWhite;
XYSJ_FBtn.ColorShadow:=clBlack;
ZDSJ_FBtn.ColorHighLight:=clWhite;
ZDSJ_FBtn.ColorShadow:=clBlack;
SDSJ_FBtn.ColorHighLight:=clWhite;
SDSJ_FBtn.ColorShadow:=clBlack;
TKLR_FBtn.ColorHighLight:=clWhite;
TKLR_FBtn.ColorShadow:=clBlack;
TKWH_FBtn.ColorHighLight:=clWhite;
TKWH_FBtn.ColorShadow:=clBlack;
XXSZ_FBtn.ColorHighLight:=clBlue;
XXSZ_FBtn.ColorShadow:=clBlue;
with TSet_F.Create(nil) do
try
ShowModal;
finally
Free;
end;
end;
//****************************************************************************************
procedure TMain_F.ZDSC_FBtnClick(Sender: TObject); // 自动生成试卷
type
ZJInfo=record //章节信息
Name:string;
Flag:boolean;
end;
var
ZhangJie:array of ZJInfo; //存放章节信息
XTH:array of integer; //存放随机选题号
ZJNum,i,XZTRY,XZTZD,XZTN,XZTFZ,TKTRY,TKTZD,TKTN,TKTFZ,JDTRY,JDTZD,JDTN,JDTFZ,YLLSTRY,
YLLSTZD,YLLSTN,YLLSTFZ,XTSJTRY,XTSJTZD,XTSJTN,XTSJTFZ,XTCZTRY,XTCZTZD,XTCZTN,XTCZTFZ,
XZTZF,TKTZF,JDTZF,YLLSTZF,XTSJTZF,XTCZTZF,ZF,num,XZTSL,TKTSL,JDTSL,YLLSTSL,XTSJTSL,
XTCZTSL,MaxBH,MinBH,j,temp,RY,ZD,Nan,YXTS,ZTL:integer;
Flag:boolean;
begin
ZJNum:=0;
YXTS:=0; //已经抽取的题的数量
ZDST:=nil;
for i:=0 to ZDZJ_CT.Items.Count-1 do
if (ZDZJ_CT.Items[i].Level=1)and(ZDZJ_CT.Items[i].StateIndex=2) then ZJNum:=ZJNum+1;
SetLength(ZhangJie,ZJNum);
j:=0;
for i:=0 to ZDZJ_CT.Items.Count-1 do //记录下要出试题的章节
if (ZDZJ_CT.Items[i].Level=1)and(ZDZJ_CT.Items[i].StateIndex=2) then
begin
ZhangJie[j].Name:=ZDZJ_CT.Items[i].Text;
ZhangJie[j].Flag:=false;
j:=j+1;
end;
XZTRY:=XZTRY_FSE.Value;
XZTZD:=XZTZD_FSE.Value;
XZTN:=XZTN_FSE.Value;
XZTFZ:=XZTZDFZ_FSE.Value;
XZTSL:=XZTRY+XZTZD+XZTN;
XZTZF:=XZTSL*XZTFZ;
TKTRY:=TKTRY_FSE.Value;
TKTZD:=TKTZD_FSE.Value;
TKTN:=TKTN_FSE.Value;
TKTFZ:=TKTZDFZ_FSE.Value;
TKTSL:=TKTRY+TKTZD+TKTN;
TKTZF:=TKTSL*TKTFZ;
JDTRY:=JDTRY_FSE.Value;
JDTZD:=JDTZD_FSE.Value;
JDTN:=JDTN_FSE.Value;
JDTFZ:=JDTZDFZ_FSE.Value;
JDTSL:=JDTRY+JDTZD+JDTN;
JDTZF:=JDTSL*JDTFZ;
YLLSTRY:=YLLSTRY_FSE.Value;
YLLSTZD:=YLLSTZD_FSE.Value;
YLLSTN:=YLLSTN_FSE.Value;
YLLSTFZ:=YLLSTZDFZ_FSE.Value;
YLLSTSL:=YLLSTRY+YLLSTZD+YLLSTN;
YLLSTZF:=YLLSTSL*YLLSTFZ;
XTSJTRY:=XTSJTRY_FSE.Value;
XTSJTZD:=XTSJTZD_FSE.Value;
XTSJTN:=XTSJTN_FSE.Value;
XTSJTFZ:=XTSJTZDFZ_FSE.Value;
XTSJTSL:=XTSJTRY+XTSJTZD+XTSJTN;
XTSJTZF:=XTSJTSL*XTSJTFZ;
XTCZTRY:=XTCZTRY_FSE.Value;
XTCZTZD:=XTCZTZD_FSE.Value;
XTCZTN:=XTCZTN_FSE.Value;
XTCZTFZ:=XTCZTZDFZ_FSE.Value;
XTCZTSL:=XTCZTRY+XTCZTZD+XTCZTN;
XTCZTZF:=XTCZTSL*XTCZTFZ;
ZTL:=XZTSL+TKTSL+JDTSL+YLLSTSL+XTSJTSL+XTCZTSL; //总题量
SetLength(ZDST,ZTL); //设置动态数组的长度为题量
RateProcess_F.Show; //显示进度窗口
RateProcess_F.CZ_P.Caption:='正在初始化参数......';
RateProcess_F.Rate_Gauge.MaxValue:=ZTL;
RateProcess_F.Repaint;
ZF:=XZTZF+TKTZF+JDTZF+YLLSTZF+XTSJTZF+XTCZTZF; //各总分题分数的和
if ZF<>ZDZF_FSE.Value then
begin
MessageBox(handle,'分数合与总分不相等,请重新设置分数!' ,'总分不对',MB_OK or MB_ICONERROR);
ZhangJie:=nil;
ZDST:=nil;
Exit;
end;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if XZTSL>0 then // 抽取选择题
begin
RateProcess_F.CZ_P.Caption:='在不重复知识点的情况下抽取选择题.....';
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT MIN(BH) AS MinBH,MAX(BH) AS MaxBH FROM XuanZeTi');
SJTXX_ADOQ.Open;
if SJTXX_ADOQ.RecordCount>0 then
begin
MinBH:=SJTXX_ADOQ.FieldValues['MinBH'];
MaxBH:=SJTXX_ADOQ.FieldValues['MaxBH'];
end;
num:=MaxBH-MinBH+1;
if num>0 then //开始初始化
begin
SetLength(XTH,num);
for i:=0 to num-1 do
XTH[i]:=MinBH+i; //给动态数组设初值
Randomize; //初始化随机数生成器
for i:=0 to num-1 do
begin
j:=random(num);
temp:=XTH[i];
XTH[i]:=XTH[j];
XTH[j]:=temp;
end;
end;
RY:=0;
ZD:=0;
Nan:=0;
temp:=0; //用来记录成功抽取符合条件的题目数量
for i:=0 to num-1 do
begin
if temp=XZTSL then break;
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM XuanZeTi WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=XTH[i];
XT_ADOQ.Open;
if XT_ADOQ.RecordCount>0 then
begin
if XT_ADOQ.FieldByName('NY').AsInteger=12 then //容易题
begin
if RY=XZTRY then continue;
Flag:=false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -