📄 usjcq.pas
字号:
unit uSJCQ;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, Buttons, Word2000, OleServer,
StdCtrls, ImgList,StrUtils, ExtCtrls;
type
TfrmSJCQ = class(TForm)
SJ_ADOQ: TADOQuery;
SJT_ADOQ: TADOQuery;
SJ_DS: TDataSource;
SJT_DS: TDataSource;
SJ_WF: TWordFont;
SJ_WD: TWordDocument;
SJ_WA: TWordApplication;
btnPreviewl: TSpeedButton;
XT_ADOQ: TADOQuery;
SJTXX_ADOQ: TADOQuery;
btnPreviewAn: TSpeedButton;
btnDelete: TSpeedButton;
btnCancel: TSpeedButton;
Label1: TLabel;
ZJ_ADOT: TADOTable;
ImageList1: TImageList;
ST_ADOQ: TADOQuery;
ST_DS: TDataSource;
BCSJ_ADOQ: TADOQuery;
Panel3: TPanel;
SJT_DBG: TDBGrid;
SJ_DBG: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure SJ_DBGMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnPreviewlClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnPreviewAnClick(Sender: TObject);
private
{ Private declarations }
procedure init;
public
{ Public declarations }
end;
var
frmSJCQ: TfrmSJCQ;
implementation
uses uData, RateProcess_Form;
{$R *.dfm}
var
STTypeID,STBH,STND,SJDA:TStringList;
SJDH:String;
//----------------------------------------
//抽取试卷模块 初始化工作
procedure TfrmSJCQ.FormCreate(Sender: TObject);
begin
SJ_ADOQ.Connection := dmPer.acPer ;
SJT_ADOQ.Connection := dmPer.acPer ;
SJTXX_ADOQ.Connection := dmPer.acPer;
XT_ADOQ.Connection := dmPer.acPer;
init;
end;
procedure TfrmSJCQ.init;
begin
SJ_ADOQ.Close; //查出现有的试卷
SJ_ADOQ.SQL.Clear;
SJ_ADOQ.SQL.Add('SELECT SJDH AS 试卷代号,CJLS AS 试卷创建者,ND AS 试卷难度 FROM SJ');
SJ_ADOQ.Open;
if not SJ_DBG.Fields[0].IsNull then
SJDH:=SJ_DBG.Fields[0].AsString;
if SJDH<>'' then
begin
SJT_ADOQ.Close;
SJT_ADOQ.SQL.Clear;
SJT_ADOQ.SQL.Add('SELECT SJDH AS 试卷代号,b.TypeName AS 题型,');
SJT_ADOQ.SQL.Add('BH AS 试题编号,FZ AS 试题分值 FROM SJT a,TiXingFen b ');
SJT_ADOQ.SQL.Add('WHERE SJDH=:SJDH AND a.TypeID=b.TypeID');
SJT_ADOQ.Parameters.ParamByName('SJDH').Value:=SJDH;
SJT_ADOQ.Open;
end;
if (SJDA<>nil)and(SJDA.Count>0) then SJDA.Clear; //清掉试卷答案
end;
procedure TfrmSJCQ.SJ_DBGMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
OldSJDH:string;
begin
OldSJDH:=SJDH;
if not SJ_DBG.Fields[0].IsNull then SJDH:=SJ_DBG.Fields[0].AsString;
if (SJDH<>'')and(OldSJDH<>SJDH) then //刷新试题显示
begin
SJT_ADOQ.Close;
SJT_ADOQ.SQL.Clear;
SJT_ADOQ.SQL.Add('SELECT SJDH AS 试卷代号,b.TypeName AS 题型,');
SJT_ADOQ.SQL.Add('BH AS 试题编号,FZ AS 试题分值 FROM SJT a,TiXingFen b ');
SJT_ADOQ.SQL.Add('WHERE SJDH=:SJDH AND a.TypeID=b.TypeID');
SJT_ADOQ.Parameters.ParamByName('SJDH').Value:=SJDH;
SJT_ADOQ.Open;
end;
end;
//-----------------------------
//预览试卷
procedure TfrmSJCQ.btnPreviewlClick(Sender: TObject);
const
BF_Name:array[1..10] of String=('一、','二、','三、','四、','五、','六、','七、',
'八、','九、','十、');
JG:String=' ';
var
ItemIndex:OleVariant;
NewDocument:_Document;
FZ,TL,BF,STH,i,YTS:integer;
temp,AppPath: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;
begin
AppPath:=ExtractFilePath(Application.ExeName); //取得本程序的路径
//显示进度窗口
RateProcess_F.Show;
RateProcess_F.CZ_P.Caption:='正在链接Microsoft Office Word......';
RateProcess_F.Rate_Gauge.MaxValue:=SJT_ADOQ.RecordCount+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;
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:='FoxPro数据库程序设计试卷';//此文档的第一个窗口的标题
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('FoxPro数据库程序设计试卷'+#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 TXuanZe 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 TTianKong 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -