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

📄 main_form.pas

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

  //SJ_WA.Visible := False;
  //SJ_WA.Caption := '题库系统与试卷生成'; //Word应用程序的标题包含的所有文档标题都被修改
  //建立一个新文档
  {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(NewDocument);  //链接到刚在上面建立的新文档
  SJ_WD.Windows.Item(ItemIndex).Caption:='数据库原理与应用期末试卷答案';//此文档的第一个窗口的标题
  {ItemIndex1:=2;        //ItemIndex1定义为OleVariant类型
  SJ_WA.Documents.Item(ItemIndex1).Windows.Item(ItemIndex).Caption:='kkkkkkkkkk';
  //从这个测试可以看出调用SJ_WA.Documents.Add后新建的文档的index为1
  }

  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_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);
  Wait(1000);
  RateProcess_F.Close;           //关闭进度窗口
  SJ_WA.Visible:=true;
  SJ_WA.Disconnect;           //断开链接
  SJ_WD.Disconnect;
end;
//****************************************************************************************
procedure TMain_F.About_FBtnClick(Sender: TObject);  //关于窗口
begin
  with TAbout_F.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
end;
//****************************************************************************************
procedure TMain_F.TKLR_FBtnClick(Sender: TObject);  //题库录入
begin
  XYSJ_FBtn.ColorBorder:=clMoneyGreen;
  ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
  SDSJ_FBtn.ColorBorder:=clMoneyGreen;
  TKLR_FBtn.ColorBorder:=clBlue;
  TKWH_FBtn.ColorBorder:=clMoneyGreen;
  XXSZ_FBtn.ColorBorder:=clMoneyGreen;
  XYSJ_FBtn.ColorHighLight:=clWhite;
  XYSJ_FBtn.ColorShadow:=clBlack;
  ZDSJ_FBtn.ColorHighLight:=clWhite;
  ZDSJ_FBtn.ColorShadow:=clBlack;
  SDSJ_FBtn.ColorHighLight:=clWhite;
  SDSJ_FBtn.ColorShadow:=clBlack;
  TKLR_FBtn.ColorHighLight:=clBlue;
  TKLR_FBtn.ColorShadow:=clBlue;
  TKWH_FBtn.ColorHighLight:=clWhite;
  TKWH_FBtn.ColorShadow:=clBlack;
  XXSZ_FBtn.ColorHighLight:=clWhite;
  XXSZ_FBtn.ColorShadow:=clBlack;

  with TTIMuLuRu.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
end;
//****************************************************************************************
procedure TMain_F.TKWH_FBtnClick(Sender: TObject);   //题库维护
begin
  XYSJ_FBtn.ColorBorder:=clMoneyGreen;
  ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
  SDSJ_FBtn.ColorBorder:=clMoneyGreen;
  TKLR_FBtn.ColorBorder:=clMoneyGreen;
  TKWH_FBtn.ColorBorder:=clBlue;
  XXSZ_FBtn.ColorBorder:=clMoneyGreen;
  XYSJ_FBtn.ColorHighLight:=clWhite;
  XYSJ_FBtn.ColorShadow:=clBlack;
  ZDSJ_FBtn.ColorHighLight:=clWhite;
  ZDSJ_FBtn.ColorShadow:=clBlack;
  SDSJ_FBtn.ColorHighLight:=clWhite;
  SDSJ_FBtn.ColorShadow:=clBlack;
  TKLR_FBtn.ColorHighLight:=clWhite;
  TKLR_FBtn.ColorShadow:=clBlack;
  TKWH_FBtn.ColorHighLight:=clBlue;
  TKWH_FBtn.ColorShadow:=clBlue;
  XXSZ_FBtn.ColorHighLight:=clWhite;
  XXSZ_FBtn.ColorShadow:=clBlack;

  with TForm1.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
end;
//****************************************************************************************
procedure TMain_F.XXSZ_FBtnClick(Sender: TObject);   //选项设置窗口
begin
  XYSJ_FBtn.ColorBorder:=clMoneyGreen;
  ZDSJ_FBtn.ColorBorder:=clMoneyGreen;
  SDSJ_FBtn.ColorBorder:=clMoneyGreen;
  TKLR_FBtn.ColorBorder:=clMoneyGreen;
  TKWH_FBtn.ColorBorder:=clMoneyGreen;
  XXSZ_FBtn.ColorBorder:=clBlue;
  XYSJ_FBtn.ColorHighLight:=clWhite;
  XYSJ_FBtn.ColorShadow:=clBlack;
  ZDSJ_FBtn.ColorHighLight:=clWhite;
  ZDSJ_FBtn.ColorShadow:=clBlack;
  SDSJ_FBtn.ColorHighLight:=clWhite;
  SDSJ_FBtn.ColorShadow:=clBlack;
  TKLR_FBtn.ColorHighLight:=clWhite;
  TKLR_FBtn.ColorShadow:=clBlack;
  TKWH_FBtn.ColorHighLight:=clWhite;
  TKWH_FBtn.ColorShadow:=clBlack;
  XXSZ_FBtn.ColorHighLight:=clBlue;
  XXSZ_FBtn.ColorShadow:=clBlue;

  with TSet_F.Create(nil) do
    try
      ShowModal;
    finally
      Free;
    end;
end;
//****************************************************************************************
procedure TMain_F.ZDSC_FBtnClick(Sender: TObject);  // 自动生成试卷
type
  ZJInfo=record         //章节信息
    Name:string;
    Flag:boolean;
  end;
var
  ZhangJie:array of ZJInfo;        //存放章节信息
  XTH:array of integer;            //存放随机选题号
  ZJNum,i,XZTRY,XZTZD,XZTN,XZTFZ,TKTRY,TKTZD,TKTN,TKTFZ,JDTRY,JDTZD,JDTN,JDTFZ,YLLSTRY,
  YLLSTZD,YLLSTN,YLLSTFZ,XTSJTRY,XTSJTZD,XTSJTN,XTSJTFZ,XTCZTRY,XTCZTZD,XTCZTN,XTCZTFZ,
  XZTZF,TKTZF,JDTZF,YLLSTZF,XTSJTZF,XTCZTZF,ZF,num,XZTSL,TKTSL,JDTSL,YLLSTSL,XTSJTSL,
  XTCZTSL,MaxBH,MinBH,j,temp,RY,ZD,Nan,YXTS,ZTL:integer;
  Flag:boolean;
begin
  ZJNum:=0;
  YXTS:=0;        //已经抽取的题的数量
  ZDST:=nil;
  for i:=0 to ZDZJ_CT.Items.Count-1 do
    if (ZDZJ_CT.Items[i].Level=1)and(ZDZJ_CT.Items[i].StateIndex=2) then ZJNum:=ZJNum+1;
  SetLength(ZhangJie,ZJNum);

  j:=0;
  for i:=0 to ZDZJ_CT.Items.Count-1 do     //记录下要出试题的章节
    if (ZDZJ_CT.Items[i].Level=1)and(ZDZJ_CT.Items[i].StateIndex=2) then
      begin
        ZhangJie[j].Name:=ZDZJ_CT.Items[i].Text;
        ZhangJie[j].Flag:=false;
        j:=j+1;
      end;
  XZTRY:=XZTRY_FSE.Value;
  XZTZD:=XZTZD_FSE.Value;
  XZTN:=XZTN_FSE.Value;
  XZTFZ:=XZTZDFZ_FSE.Value;
  XZTSL:=XZTRY+XZTZD+XZTN;
  XZTZF:=XZTSL*XZTFZ;



  TKTRY:=TKTRY_FSE.Value;
  TKTZD:=TKTZD_FSE.Value;
  TKTN:=TKTN_FSE.Value;
  TKTFZ:=TKTZDFZ_FSE.Value;
  TKTSL:=TKTRY+TKTZD+TKTN;
  TKTZF:=TKTSL*TKTFZ;

  JDTRY:=JDTRY_FSE.Value;
  JDTZD:=JDTZD_FSE.Value;
  JDTN:=JDTN_FSE.Value;
  JDTFZ:=JDTZDFZ_FSE.Value;
  JDTSL:=JDTRY+JDTZD+JDTN;
  JDTZF:=JDTSL*JDTFZ;

  YLLSTRY:=YLLSTRY_FSE.Value;
  YLLSTZD:=YLLSTZD_FSE.Value;
  YLLSTN:=YLLSTN_FSE.Value;
  YLLSTFZ:=YLLSTZDFZ_FSE.Value;
  YLLSTSL:=YLLSTRY+YLLSTZD+YLLSTN;
  YLLSTZF:=YLLSTSL*YLLSTFZ;

  XTSJTRY:=XTSJTRY_FSE.Value;
  XTSJTZD:=XTSJTZD_FSE.Value;
  XTSJTN:=XTSJTN_FSE.Value;
  XTSJTFZ:=XTSJTZDFZ_FSE.Value;
  XTSJTSL:=XTSJTRY+XTSJTZD+XTSJTN;
  XTSJTZF:=XTSJTSL*XTSJTFZ;

  XTCZTRY:=XTCZTRY_FSE.Value;
  XTCZTZD:=XTCZTZD_FSE.Value;
  XTCZTN:=XTCZTN_FSE.Value;
  XTCZTFZ:=XTCZTZDFZ_FSE.Value;
  XTCZTSL:=XTCZTRY+XTCZTZD+XTCZTN;
  XTCZTZF:=XTCZTSL*XTCZTFZ;

  ZTL:=XZTSL+TKTSL+JDTSL+YLLSTSL+XTSJTSL+XTCZTSL;       //总题量
  SetLength(ZDST,ZTL);         //设置动态数组的长度为题量

  RateProcess_F.Show;          //显示进度窗口
  RateProcess_F.CZ_P.Caption:='正在初始化参数......';
  RateProcess_F.Rate_Gauge.MaxValue:=ZTL;
  RateProcess_F.Repaint;



  ZF:=XZTZF+TKTZF+JDTZF+YLLSTZF+XTSJTZF+XTCZTZF;  //各总分题分数的和
  if ZF<>ZDZF_FSE.Value then
    begin
      MessageBox(handle,'分数合与总分不相等,请重新设置分数!' ,'总分不对',MB_OK or MB_ICONERROR);
      ZhangJie:=nil;
      ZDST:=nil;
      Exit;
    end;
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  if XZTSL>0 then           //  抽取选择题
    begin
      RateProcess_F.CZ_P.Caption:='在不重复知识点的情况下抽取选择题.....';
      RateProcess_F.Repaint;

      SJTXX_ADOQ.Close;
      SJTXX_ADOQ.SQL.Clear;
      SJTXX_ADOQ.SQL.Add('SELECT MIN(BH) AS MinBH,MAX(BH) AS MaxBH FROM XuanZeTi');
      SJTXX_ADOQ.Open;
      if SJTXX_ADOQ.RecordCount>0 then
        begin
          MinBH:=SJTXX_ADOQ.FieldValues['MinBH'];
          MaxBH:=SJTXX_ADOQ.FieldValues['MaxBH'];
        end;

      num:=MaxBH-MinBH+1;
      if num>0 then          //开始初始化
        begin
          SetLength(XTH,num);
          for i:=0 to num-1 do
            XTH[i]:=MinBH+i;   //给动态数组设初值
          Randomize;   //初始化随机数生成器
          for i:=0 to num-1 do
            begin
              j:=random(num);
              temp:=XTH[i];
              XTH[i]:=XTH[j];
              XTH[j]:=temp;
            end;
        end;
      RY:=0;
      ZD:=0;
      Nan:=0;
      temp:=0;   //用来记录成功抽取符合条件的题目数量
      for i:=0 to num-1 do
        begin
          if temp=XZTSL then break;
          XT_ADOQ.Close;
          XT_ADOQ.SQL.Clear;
          XT_ADOQ.SQL.Add('SELECT * FROM XuanZeTi WHERE BH=:BH');
          XT_ADOQ.Parameters.ParamByName('BH').Value:=XTH[i];
          XT_ADOQ.Open;
          if XT_ADOQ.RecordCount>0 then
            begin
              if XT_ADOQ.FieldByName('NY').AsInteger=12 then //容易题
                begin
                  if RY=XZTRY then continue;
                  Flag:=false;
     

⌨️ 快捷键说明

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