📄 main_form.pas
字号:
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 := '题库系统与试卷生成';
//建立一个新文档
{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(SJ_WA.Documents.Item(ItemIndex));
SJ_WD.ConnectTo(NewDocument);
SJ_WD.Windows.Item(ItemIndex).Caption:='数据库原理与应用期末试卷';//此文档的第一个窗口的标题
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_WA.Documents.Item(ItemIndex).Paragraphs.Alignment:=wdAlignParagraphLeft;
SJ_WD.Range.InsertAfter('学校___________ 班级________ 姓名___________ 得分_____ ' +#13);
SetFont(0,0,0,14);
RateProcess_F.CZ_P.Caption:='正在输出选择题......'; //试卷题信息-----选择题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=1');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
SJ_WD.Range.InsertAfter(' '+#13);
SetFont(0,0,0,10);
BF:=1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
temp:=Format('%s单选题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM XuanZeTi WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%d. %s',[STH,XT_ADOQ.FieldValues['TM']]); //输出选择题题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
temp:=Format('%sA. %s',[JG,XT_ADOQ.FieldValues['A']]); //依次输出四个选项
SJ_WD.Range.InsertAfter(temp+#13);
temp:=Format('%sB. %s',[JG,XT_ADOQ.FieldValues['B']]); //依次输出四个选项
SJ_WD.Range.InsertAfter(temp+#13);
temp:=XT_ADOQ.FieldValues['C']; //有的题没有C,D选项
if trim(temp)<>'' then
begin
temp:=Format('%sC. %s',[JG,temp]); //依次输出四个选项
SJ_WD.Range.InsertAfter(temp+#13);
end;
temp:=XT_ADOQ.FieldValues['D']; //有的题没有C,D选项
if trim(temp)<>'' then
begin
temp:=Format('%sD. %s',[JG,temp]); //依次输出四个选项
SJ_WD.Range.InsertAfter(temp+#13);
end;
SJDA.Add(XT_ADOQ.FieldValues['DA']); //记下每一小题的答案
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
RateProcess_F.CZ_P.Caption:='正在输出填空题......';//试卷题信息--------填空题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=2');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
BF:=BF+1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
SJ_WD.Range.InsertAfter(#13);
temp:=Format('%s填空题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM TianKong WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%s%d. %s',[JG,STH,XT_ADOQ.FieldValues['TM']]); //输出填空题题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
temp:='';
YTS:=XT_ADOQ.FieldValues['YTS'];
for i:=1 to YTS do //组合每个空的答案
if not XT_ADOQ.FieldByName('K'+IntToStr(i)).IsNull then
begin
if i<>YTS then temp:=temp+XT_ADOQ.FieldValues['K'+IntToStr(i)]+','
else temp:=temp+XT_ADOQ.FieldValues['K'+IntToStr(i)]+'。';
end
else break;
SJDA.Add(temp); //填空题答案
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
RateProcess_F.CZ_P.Caption:='正在输出简答题......';//试卷题信息--------简答题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=3');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
BF:=BF+1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
SJ_WD.Range.InsertAfter(#13);
temp:=Format('%s简答题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM JianDaTi WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%s%d. %s',[JG,STH,XT_ADOQ.FieldValues['TM']]); //输出简答题题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJ_WD.Range.InsertAfter(#13+#13+#13+#13+#13);
SJDA.Add(XT_ADOQ.FieldValues['DA']); //记下简答题答案
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
RateProcess_F.CZ_P.Caption:='正在输出原理论述题......';//试卷题信息----原理论述题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=5');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
BF:=BF+1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
SJ_WD.Range.InsertAfter(#13);
temp:=Format('%s原理论述题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM YuanLiLunShu WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%s%d. %s',[JG,STH,XT_ADOQ.FieldValues['TM']]); //输出原理论述题题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJ_WD.Range.InsertAfter(#13+#13+#13+#13+#13+#13+#13);
SJDA.Add(XT_ADOQ.FieldValues['DA']); //记下简答题答案
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
RateProcess_F.CZ_P.Caption:='正在输出系统设计题......';//试卷题信息----系统设计题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=4');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
BF:=BF+1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
SJ_WD.Range.InsertAfter(#13);
temp:=Format('%s系统设计题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM XiTongSheJi WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%s%d. %s',[JG,STH,XT_ADOQ.FieldValues['TM']]); //输出系统设计题题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
BGName:=XT_ADOQ.FieldValues['TMBG'];
if trim(BGName)<>'' then
begin
SJ_WD.Sentences.Last.InsertAfter(' '+#13);
SJ_WD.Sentences.Last.InsertFile(AppPath+'doc\'+BGName,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
end;
{if not XT_ADOQ.FieldByName('TMBG').IsNull then
begin
BGName:=XT_ADOQ.FieldValues['TMBG'];
//一定要有下句,要不题目会被下面的图覆盖
SJ_WD.Sentences.Last.InsertAfter(' '+#13);
SJ_WD.Sentences.Last.InsertFile(AppPath+'doc\'+BGName,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
end;}
SJ_WD.Range.InsertAfter(#13+#13+#13+#13+#13);
SJDA.Add(XT_ADOQ.FieldValues['DA']); //记下系统设计题的答案
BGName:=XT_ADOQ.FieldValues['DABG'];
if trim(BGName)<>'' then SJDA.Add(BGName);
{if not XT_ADOQ.FieldByName('DABG').IsNull then
SJDA.Add(XT_ADOQ.FieldValues['DABG']);//记下系统设计题的答案表格}
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
RateProcess_F.CZ_P.Caption:='正在输出系统操作题......';//试卷题信息----系统操作题部分
RateProcess_F.Repaint;
SJTXX_ADOQ.Close;
SJTXX_ADOQ.SQL.Clear;
SJTXX_ADOQ.SQL.Add('SELECT * FROM SJT WHERE SJDH=:DH AND TypeID=6');
SJTXX_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
SJTXX_ADOQ.Open;
BF:=BF+1; //题型在试卷中属于哪一部分
STH:=1; //每种题型开始的题号
TL:=SJTXX_ADOQ.RecordCount;
if TL>0 then
begin
SJTXX_ADOQ.First;
FZ:=SJTXX_ADOQ.FieldValues['FZ'];
SJ_WD.Range.InsertAfter(#13);
temp:=Format('%s系统操作题( 共%d小题每题%d分, 小计%d分 )',[BF_Name[BF],TL,FZ,TL*FZ]);
SJ_WD.Range.InsertAfter(temp+#13+#13);
SJDA.Add('#'+temp); //为答案记下部分说明
SJTXX_ADOQ.First;
while not SJTXX_ADOQ.Eof do
begin
XT_ADOQ.Close;
XT_ADOQ.SQL.Clear;
XT_ADOQ.SQL.Add('SELECT * FROM XiTongCZ WHERE BH=:BH');
XT_ADOQ.Parameters.ParamByName('BH').Value:=SJTXX_ADOQ.FieldValues['BH'];
XT_ADOQ.Open;
temp:=Format('%s%d. %s',[JG,STH,XT_ADOQ.FieldValues['TM']]); //输出系统操作题目
SJ_WD.Range.InsertAfter(temp+#13+#13);
BGName:=XT_ADOQ.FieldValues['TMBG'];
if trim(BGName)<>'' then
begin
SJ_WD.Sentences.Last.InsertAfter(' '+#13);
SJ_WD.Sentences.Last.InsertFile(AppPath+'doc\'+BGName,EmptyParam,
EmptyParam,EmptyParam,EmptyParam);
end;
SJ_WD.Range.InsertAfter(#13+#13+#13+#13+#13+#13+#13+#13+#13+#13);
WTS:=XT_ADOQ.FieldValues['WTS'];
SJDA.Add('*');
for i:=1 to WTS do //循环输出系统操作题的每一个小问题的答案
begin
temp:=XT_ADOQ.FieldValues['W'+IntToStr(i)+'DA'];
SJDA.Add('!'+temp);
BGName:=XT_ADOQ.FieldValues['W'+IntToStr(i)+'DABG'];
if Trim(BGName)<>'' then SJDA.Add(BGName);
end;
RateProcess_F.Rate_Gauge.Progress:=RateProcess_F.Rate_Gauge.Progress+1;
RateProcess_F.Repaint;
STH:=STH+1;
SJTXX_ADOQ.Next;
end;
end;
SJTXX_ADOQ.Close; //关闭ADOQuery以减少资源占用
Wait(1000);
RateProcess_F.Close; //关闭进度窗口
SJ_WA.Visible:=true;
SJ_WA.Disconnect; //断开链接
SJ_WD.Disconnect;
end;
//****************************************************************************************
procedure TMain_F.BCDA_FBtnClick(Sender: TObject); //保存试卷答案
var
//Template,NewTemplate,ItemIndex,Doc_Type,Doc_Visible:OleVariant;
ItemIndex:OleVariant;
NewDocument:_Document;
i,j,k:integer;
temp,AppPath,DAStr:string;
procedure SetFont(aBold,aItalic,aShadow,aSize:integer);
begin
SJ_WF.ConnectTo(SJ_WD.Sentences.Get_Last.Font);
SJ_WF.Name:='宋体';
SJ_WF.Bold := aBold;
SJ_WF.Italic := aItalic;
SJ_WF.Shadow := aShadow;
SJ_WF.Size := aSize;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -