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

📄 main_form.pas

📁 软件实现了以下主要功能:1.手动生成试卷;2.自动生成试卷;3.抽取现有试卷;4.用户管理;5.数据库管理。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    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 + -