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

📄 main_form.pas

📁 软件实现了以下主要功能:1.手动生成试卷;2.自动生成试卷;3.抽取现有试卷;4.用户管理;5.数据库管理。
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  if SDZJ_CT.Selected.Level<>0 then     //按小节查
    begin
      ZJID:=SDZJ_CT.Selected.Text;
      ZJID:=Trim(ZJID);
      if XZT_FRBtn.Checked then  ShowXJ(0,ZJID);              //查出选择题
      if TKT_FRBtn.Checked then  ShowXJ(1,ZJID);              //查出填空题
      if JDT_FRBtn.Checked then  ShowXJ(2,ZJID);              //查出简答题
      if YLLST_FRBtn.Checked then  ShowXJ(3,ZJID);            //查出原理论述题
      if XTSJT_FRBtn.Checked then  ShowXJ(4,ZJID);            //查出系统设计题
      if XTCZT_FRBtn.Checked then  ShowXJ(5,ZJID);            //查出系统操作题
    end
    else begin           //按章查
      ZJID:=GetMidStr(SDZJ_CT.Selected.Text,'',' ');             //公共函数
      ZJID:=Trim(ZJID);
      if XZT_FRBtn.Checked then  ShowZZ(0,ZJID);              //查出选择题
      if TKT_FRBtn.Checked then  ShowZZ(1,ZJID);              //查出填空题
      if JDT_FRBtn.Checked then  ShowZZ(2,ZJID);              //查出简答题
      if YLLST_FRBtn.Checked then  ShowZZ(3,ZJID);            //查出原理论述题
      if XTSJT_FRBtn.Checked then  ShowZZ(4,ZJID);            //查出系统设计题
      if XTCZT_FRBtn.Checked then  ShowZZ(5,ZJID);            //查出系统操作题
    end;
end;
//****************************************************************************************
procedure TMain_F.ST_DBGDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (Column.Field.DataType=ftMemo) then       //如果是为备注字段的处理
    begin
      ST_DBG.Canvas.TextRect(Rect,Rect.Left,Rect.Top,Column.Field.AsString);
    end
    else ST_DBG.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
//****************************************************************************************
procedure TMain_F.SDZJ_CTMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var                                                    //单击章节树
  ClickNode:integer;
begin
  ClickNode:=SDZJ_CT.Selected.StateIndex;
  if TCheckCheckState(ClickNode)=csChecked then ShowST;
end;
//****************************************************************************************
procedure TMain_F.SDZJ_CTStateChange(Sender: TObject; Node: TTreeNode;
  NewState: TCheckCheckState);                         //节点状态改变时
begin
  if (SDZJ_CT.Selected=Node)and(Node<>nil)then
    begin
      if NewState=csChecked then ShowST;
      if NewState=csUnChecked then
        begin
          ST_ADOQ.Close;                //只是把显示清空
          ST_ADOQ.SQL.Clear;
          ST_ADOQ.SQL.Add('SELECT BH AS 编号,TypeID as 类型,TM as 题目,CZ AS 出自章节,');
          ST_ADOQ.SQL.Add('NY AS 难易度 FROM XuanZeTi WHERE CZ=''1''');
          ST_ADOQ.Open;
        end;
    end;
end;
//****************************************************************************************
procedure TMain_F.XZT_FRBtnClick(Sender: TObject);      //点选择题
begin
  if SDZJ_CT.ItemState[SDZJ_CT.Selected]=csChecked then ShowST;
end;
//****************************************************************************************
procedure TMain_F.JRSJ_FBtnClick(Sender: TObject);    //加入试卷
var
  LX,BH,i:integer;
  //ExistTypeID,ExistBH:boolean;
begin
  if ST_DBG.Fields[0].IsNull then
    begin
      MessageBox(handle,'没有试题不能加入!','加入错误',MB_OK or MB_ICONERROR);
      exit;
    end;
  LX:=ST_DBG.Fields[1].AsInteger;
  BH:=ST_DBG.Fields[0].AsInteger;
  for i:=0 to STTypeID.Count-1 do
    begin
      if (StrToInt(STTypeID.Strings[i])=LX)and(StrToInt(STBH.Strings[i])=BH) then
        begin
          MessageBox(handle,'要加入的试题已经存在了!','加入错误',MB_OK or MB_ICONERROR);
          exit;
        end;
    end;
  {ExistTypeID:=STTypeID.Find(IntToStr(LX),index);
  ExistBH:=STBH.Find(IntToStr(BH),index1);
  //注意下句的条件
  if ExistTypeID and ExistBH and(index=index1)then
    begin
      MessageBox(handle,'要加入的试题已经存在了!','加入错误',MB_OK or MB_ICONERROR);
      exit;
    end;}
  STTypeID.Add(IntToStr(LX));   //记下试题类型
  STBH.Add(IntToStr(BH));       //记下试题编号
  STND.Add(ST_DBG.Fields[4].AsString);   //记下试题难度

  if XZT_FRBtn.Checked then  XZTSL_FSE.Value:=XZTSL_FSE.Value+1;       //增加选择题数量
  if TKT_FRBtn.Checked then  TKTSL_FSE.Value:=TKTSL_FSE.Value+1;       //增加填空题数量
  if JDT_FRBtn.Checked then  JDTSL_FSE.Value:=JDTSL_FSE.Value+1;        //增加简答题数量
  if YLLST_FRBtn.Checked then  YLLSTSL_FSE.Value:=YLLSTSL_FSE.Value+1;   //增加原理论述题数量
  if XTSJT_FRBtn.Checked then  XTSJTSL_FSE.Value:=XTSJTSL_FSE.Value+1;   //增加系统设计题数量
  if XTCZT_FRBtn.Checked then  XTCZTSL_FSE.Value:=XTCZTSL_FSE.Value+1;  //增加系统操作题数量

  MessageBox(handle,'这道试题已经成功添加!','添加成功',MB_OK or MB_ICONINFORMATION);
  ST_ADOQ.Next;
  
  BCSJ_P.Enabled:=true;
end;
//****************************************************************************************
function TMain_F.CheckFZ:boolean;
var
  AllFZ:integer;
begin
  result:=false;
  if (XZTSL_FSE.Value<>0)and(XZTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置选择题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  if (TKTSL_FSE.Value<>0)and(TKTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置填空题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  if (JDTSL_FSE.Value<>0)and(JDTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置简答题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  if (YLLSTSL_FSE.Value<>0)and(YLLSTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置原理论述题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  if (XTSJTSL_FSE.Value<>0)and(XTSJTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置系统设计题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  if (XTCZTSL_FSE.Value<>0)and(XTCZTFZ_FSE.Value=0) then
    begin
      MessageBox(handle,'请设置系统操作题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

  AllFZ:=0;                 //计算总分
  AllFZ:=AllFZ+XZTSL_FSE.Value*XZTFZ_FSE.Value;
  AllFZ:=AllFZ+TKTSL_FSE.Value*TKTFZ_FSE.Value;
  AllFZ:=AllFZ+JDTSL_FSE.Value*JDTFZ_FSE.Value;
  AllFZ:=AllFZ+YLLSTSL_FSE.Value*YLLSTFZ_FSE.Value;
  AllFZ:=AllFZ+XTSJTSL_FSE.Value*XTSJTFZ_FSE.Value;
  AllFZ:=AllFZ+XTCZTSL_FSE.Value*XTCZTFZ_FSE.Value;
  if AllFZ<>ZF_FSE.Value then
    begin
      MessageBox(handle,'试题总分不对,请重新设置!','总分有误',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;
end;
//****************************************************************************************
procedure TMain_F.BCSJ_FBtnClick(Sender: TObject);    //保存试卷
var
  i,RY_FZ,ZD_FZ,Nan_FZ,temp:integer;
  ARG:Double;
  NDPG,SJDH:string;
begin
  if CheckFZ then exit;
  RY_FZ:=0;
  ZD_FZ:=0;
  Nan_FZ:=0;
  temp:=0;
  for i:=0 to STTypeID.Count-1 do              //评估试卷难度
    begin
      if StrToInt(STTypeID.Strings[i])=XZT_FRBtn.tag then temp:=XZTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=TKT_FRBtn.tag then temp:=TKTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=JDT_FRBtn.tag then temp:=JDTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=XTSJT_FRBtn.tag then temp:=XTSJTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=YLLST_FRBtn.tag then temp:=YLLSTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=XTCZT_FRBtn.tag then temp:=XTCZTFZ_FSE.Value;

      if STND.Strings[i]='容易' then  RY_FZ:=RY_FZ+temp;
      if STND.Strings[i]='中等' then  ZD_FZ:=ZD_FZ+temp;
      if STND.Strings[i]='难' then  Nan_FZ:=Nan_FZ+temp;
    end;
  ARG:=(RY_FZ*1+ZD_FZ*2+Nan_FZ*3)/100;    //用加权的平均来评估难度系数
  if ARG>1.9 then NDPG:='难'
  else begin
    if ARG>1.1 then NDPG:='中等'
    else NDPG:='容易';
  end;
  //开始保存试卷
  SJDH:=DateTimeToStr(now);
  BCSJ_ADOQ.Close;
  BCSJ_ADOQ.SQL.Clear;
  BCSJ_ADOQ.SQL.Add('SELECT * FROM SJ');
  BCSJ_ADOQ.Open;
  BCSJ_ADOQ.Append;
  BCSJ_ADOQ.FieldByName('SJDH').AsString:=SJDH;
  BCSJ_ADOQ.FieldByName('CJLS').AsString:=YH;
  BCSJ_ADOQ.FieldByName('ND').AsString:=NDPG;
  try
    BCSJ_ADOQ.Post;
  except
    MessageBox(handle,'保存试卷时发生未知错误,提交数据库失败!','提交失败',MB_OK or MB_ICONERROR);
    BCSJ_ADOQ.Cancel;
    exit;
  end;

  BCSJ_ADOQ.Close;
  BCSJ_ADOQ.SQL.Clear;
  BCSJ_ADOQ.SQL.Add('SELECT * FROM SJT');
  BCSJ_ADOQ.Open;
  for i:=0 to STTypeID.Count-1 do       //保存试题
    begin
      BCSJ_ADOQ.Append;
      BCSJ_ADOQ.FieldByName('SJDH').AsString:=SJDH;
      BCSJ_ADOQ.FieldByName('TypeID').AsInteger:=StrToInt(STTypeID.Strings[i]);
      BCSJ_ADOQ.FieldByName('BH').AsInteger:=StrToInt(STBH.Strings[i]);

      if StrToInt(STTypeID.Strings[i])=XZT_FRBtn.tag then temp:=XZTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=TKT_FRBtn.tag then temp:=TKTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=JDT_FRBtn.tag then temp:=JDTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=XTSJT_FRBtn.tag then temp:=XTSJTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=YLLST_FRBtn.tag then temp:=YLLSTFZ_FSE.Value;
      if StrToInt(STTypeID.Strings[i])=XTCZT_FRBtn.tag then temp:=XTCZTFZ_FSE.Value;

      BCSJ_ADOQ.FieldByName('FZ').AsInteger:=temp;
      try
        BCSJ_ADOQ.Post;
      except
        MessageBox(handle,'保存试卷时发生未知错误,提交数据库失败!','提交失败',MB_OK or MB_ICONERROR);
        BCSJ_ADOQ.Cancel;

        BCSJ_ADOQ.Close;            //删除已经提交的试题
        BCSJ_ADOQ.SQL.Clear;
        BCSJ_ADOQ.SQL.Add('DELETE FROM SJT WHERE SJDH=:SJDH');
        BCSJ_ADOQ.Parameters.ParamByName('SJDH').Value:=SJDH;
        BCSJ_ADOQ.ExecSQL;

        BCSJ_ADOQ.Close;            //删除已经提交的试卷
        BCSJ_ADOQ.SQL.Clear;
        BCSJ_ADOQ.SQL.Add('DELETE FROM SJ WHERE SJDH=:SJDH');
        BCSJ_ADOQ.Parameters.ParamByName('SJDH').Value:=SJDH;
        BCSJ_ADOQ.ExecSQL;
      end;
    end;
  MessageBox(handle,'试卷已经成功保存!','保存',MB_OK or MB_ICONINFORMATION);
  SDSJ_FBtnClick(SDSJ_FBtn);    //调用函数清除数据
  SDZJ_CT.SetAllNodes(csUnChecked);    //把章节树的选中状态全部去掉
end;
//****************************************************************************************
procedure TMain_F.SCSJ_FBtnClick(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:=BYSJ_DM.TiKu_ADOC;

      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);
      XYSJ_FBtnClick(XYSJ_FBtn);              //重新初始化数据显示
    end;
end;
//****************************************************************************************
procedure TMain_F.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 试卷代号,Type.TypeName AS 题型,');
      SJT_ADOQ.SQL.Add('BH AS 试题编号,FZ AS 试题分值 FROM SJT,Type ');
      SJT_ADOQ.SQL.Add('WHERE SJDH=:SJDH AND SJT.TypeID=Type.TypeID');
      SJT_ADOQ.Parameters.ParamByName('SJDH').Value:=SJDH;
      SJT_ADOQ.Open;
    end;
end;
//****************************************************************************************
procedure TMain_F.YLSJ_FBtnClick(Sender: TObject);            //预览试卷
const
  BF_Name:array[1..10] of String=('一、','二、','三、','四、','五、','六、','七、',
  '八、','九、','十、');
  JG:String='   ';
var
  //Template,NewTemplate,ItemIndex,Doc_Type,Doc_Visible:OleVariant;
  ItemIndex:OleVariant;
  NewDocument:_Document;
  FZ,TL,BF,STH,i,WTS,YTS:integer;
  temp,AppPath,BGName: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

⌨️ 快捷键说明

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