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

📄 usjcq.pas

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

  SJTXX_ADOQ.Close;               //关闭ADOQuery以减少资源占用
  RateProcess_F.Close;           //关闭进度窗口
  SJ_WA.Visible:=true;
  SJ_WA.Disconnect;           //断开链接
  SJ_WD.Disconnect;
end;

procedure TfrmSJCQ.FormShow(Sender: TObject);
begin
  STTypeID:=TStringList.Create;    //用于保存试题类型
  STBH:=TStringList.Create;        //用于保存试题编号
  STND:=TStringList.Create;        //用于保存试题难度
  SJDA:=TStringList.Create;

  init;
end;

//-----------------------------
//退出抽取试卷模块
procedure TfrmSJCQ.btnCancelClick(Sender: TObject);
begin
  close;
end;

//-----------------------------
//删除试卷
procedure TfrmSJCQ.btnDeleteClick(Sender: TObject);
var
  Flag:integer;
  Del_ADOQ:TADOQuery;
begin
  Flag:=MessageBox(handle,'警告:删除是不可恢复的,确认删除吗?','删除确认',MB_OKCANCEL or MB_ICONWARNING);
  if Flag=IDCANCEL then exit;

  if not SJ_DBG.Fields[0].IsNull then SJDH:=SJ_DBG.Fields[0].AsString;

  if SJDH<>'' then
    begin
      Del_ADOQ:=TADOQuery.Create(nil);
      Del_ADOQ.Connection:=dmPer.acPer;

      Del_ADOQ.Close;                         //删除试卷
      Del_ADOQ.SQL.Clear;
      Del_ADOQ.SQL.Add('DELETE FROM SJ WHERE SJDH=:DH');
      Del_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
      try
        Del_ADOQ.ExecSQL;
      except
        MessageBox(handle,'删除试卷时发生未知错误!','删除失败',MB_OK or MB_ICONERROR);
        Del_ADOQ.Close;
        FreeAndNil(Del_ADOQ);
        exit;
      end;

      Del_ADOQ.Close;                         //删除试卷的试题
      Del_ADOQ.SQL.Clear;
      Del_ADOQ.SQL.Add('DELETE FROM SJT WHERE SJDH=:DH');
      Del_ADOQ.Parameters.ParamByName('DH').Value:=SJDH;
      try
        Del_ADOQ.ExecSQL;
      except
        MessageBox(handle,'删除试题时发生未知错误!','删除失败',MB_OK or MB_ICONERROR);
        Del_ADOQ.Close;
        FreeAndNil(Del_ADOQ);
        exit;
      end;

      MessageBox(handle,'试卷和相应的试题已经成功删除!','删除成功',MB_OK or MB_ICONINFORMATION);
      Del_ADOQ.Close;
      FreeAndNil(Del_ADOQ);
    end;

    init;
end;
//-------------------------------
//答案预览
procedure TfrmSJCQ.btnPreviewAnClick(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;
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;

  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_WD.Range.InsertAfter('FoxPro数据库程序设计试卷答案'+#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);
  RateProcess_F.Close;           //关闭进度窗口
  SJ_WA.Visible:=true;
  SJ_WA.Disconnect;           //断开链接
  SJ_WD.Disconnect;

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -