⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usjcq.pas

📁 智能试卷生成系统 Delphi----试卷生成系统代码 用户名:sa 密码:sa
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -