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

📄 usjsc.~pas

📁 智能试卷生成系统 Delphi----试卷生成系统代码 用户名:sa 密码:sa
💻 ~PAS
字号:
unit uSJSC;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, Grids, DBGrids, ImgList, ADODB, DB, ComCtrls,
  ExtCtrls;

type
  TfrmSJSC = class(TForm)
    btnADD: TSpeedButton;
    btnCancel: TSpeedButton;
    Panel3: TPanel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Bevel2: TBevel;
    Label8: TLabel;
    Label9: TLabel;
    JS_L: TLabel;
    Label10: TLabel;
    ST_DBG: TDBGrid;
    XZT_FRBtn: TRadioButton;
    TKT_FRBtn: TRadioButton;
    JDT_FRBtn: TRadioButton;
    YLLST_FRBtn: TRadioButton;
    XZTSL_FSE: TEdit;
    XZTFZ_FSE: TEdit;
    TKTSL_FSE: TEdit;
    TKTFZ_FSE: TEdit;
    JDTSL_FSE: TEdit;
    JDTFZ_FSE: TEdit;
    CXSJTSL_FSE: TEdit;
    CXSJTFZ_FSE: TEdit;
    ZF_FSE: TEdit;
    cmbZhangJie: TComboBox;
    SJ_DS: TDataSource;
    SJ_ADOQ: TADOQuery;
    SJT_ADOQ: TADOQuery;
    SJT_DS: TDataSource;
    SJTXX_ADOQ: TADOQuery;
    ZJ_ADOT: TADOTable;
    ImageList1: TImageList;
    ST_ADOQ: TADOQuery;
    ST_DS: TDataSource;
    BCSJ_ADOQ: TADOQuery;
    Label1: TLabel;
    btnSave: TSpeedButton;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure XZT_FRBtnClick(Sender: TObject);
    procedure ST_DBGDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure btnADDClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure cmbZhangJieChange(Sender: TObject);
  private
    { Private declarations }
    procedure init;
    procedure ShowST;       //用于显示试题
    function  CheckFZ:boolean;
    procedure ShowXJ(TypeID:integer;XiaoJie:string);  //用于指定小节的试题, 由ShowST调用
  public
    { Public declarations }
  end;

var
  frmSJSC: TfrmSJSC;

implementation

uses uData, Main;

{$R *.dfm}

type                      //章节类型:存放章节编号和章节信息
  ZJ=record
    ZJID:double;
    ZJName:string;
  end;

var
  STTypeID,STBH,STND,SJDA:TStringList;
  HaveZJ:array of ZJ;              //存放章节编号和章节信息,
  
procedure TfrmSJSC.FormShow(Sender: TObject);

var
  i:integer;
begin

  cmbZhangJie.Clear ;

  ZJ_ADOT.close;
  ZJ_ADOT.TableName:='ZhangJieJG';
  ZJ_ADOT.Open;
  i:=0;
  if ZJ_ADOT.RecordCount>0 then SetLength(HaveZJ,ZJ_ADOT.RecordCount);


  while not ZJ_ADOT.Eof do
    begin
      //取出章节号,和章节名称放入数组HaveZJ中
      HaveZJ[i].ZJID:=StrToFloat(ZJ_ADOT.FieldValues['ZJ']);
      HaveZJ[i].ZJName:=ZJ_ADOT.FieldValues['ZJName'];

      //同时把章节内容放入组合框中
      cmbZhangJie.AddItem(ZJ_ADOT.FieldValues['ZJ']+'  ' +HaveZJ[i].ZJName,Sender);

      i:=i+1;
      ZJ_ADOT.Next;
    end;

    cmbZhangJie.ItemIndex :=0;
    cmbZhangJieChange(Sender);

    JS_L.Caption:='教师: '+frmmain.UserName;
end;

procedure TfrmSJSC.FormCreate(Sender: TObject);
begin
  SJ_ADOQ.Connection := dmPer.acPer ;
  SJT_ADOQ.Connection := dmPer.acPer ;
  ZJ_ADOT.Connection := dmPer.acPer;
  ST_ADOQ.Connection := dmPer.acPer;
  BCSJ_ADOQ.Connection := dmPer.acPer;

  STTypeID:=TStringList.Create;    //用于保存试题类型
  STBH:=TStringList.Create;        //用于保存试题编号
  STND:=TStringList.Create;        //用于保存试题难度
  SJDA:=TStringList.Create;

  init;
end;

procedure TfrmSJSC.init;
var
  temp:string;
begin

  STTypeID.Clear;;    //清除数据

  STBH.Clear;
  STND.Clear;
  XZTSL_FSE.text:='0';       //设置选择题数量为0
  TKTSL_FSE.text:='0';
  JDTSL_FSE.text:='0';
  CXSJTSL_FSE.text:='0';


  XZTFZ_FSE.text:='0';       //设置选择题分值为0
  TKTFZ_FSE.text:='0';
  JDTFZ_FSE.text:='0';
  CXSJTFZ_FSE.text:='0';

  ZF_FSE.text:='100';
  btnSave.Enabled:=false;


  //题型ID与题型按钮对应
  ST_ADOQ.Close;
  ST_ADOQ.SQL.Clear;
  ST_ADOQ.SQL.Add('SELECT * FROM TiXingFen');
  ST_ADOQ.Open;
  while not ST_ADOQ.Eof do
    begin
      temp:=ST_ADOQ.FieldValues['TypeName'];
      if temp='选择题' then XZT_FRBtn.Tag:=ST_ADOQ.FieldValues['TypeID'];
      if temp='填空题' then TKT_FRBtn.Tag:=ST_ADOQ.FieldValues['TypeID'];
      if temp='简答题' then JDT_FRBtn.Tag:=ST_ADOQ.FieldValues['TypeID'];
      if temp='程序设计题' then YLLST_FRBtn.Tag:=ST_ADOQ.FieldValues['TypeID'];
      
      ST_ADOQ.Next;
    end;

  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 TXuanZe WHERE CZ=''1''');
  ST_ADOQ.Open;

end;

procedure TfrmSJSC.btnCancelClick(Sender: TObject);
begin
  close;
end;

procedure TfrmSJSC.XZT_FRBtnClick(Sender: TObject);
begin
  ShowST;
end;

//------------------------
//所选章节内容改变时,该章节对应的题库也同时显示
procedure TfrmSJSC.cmbZhangJieChange(Sender: TObject);
begin
  ShowST;
end;

procedure TfrmSJSC.ShowST;                 //自定义的函数用于显示试题
var
  ZJID:string;
begin

      ZJID:=cmbZhangjie.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);            //查出程序设计题
end;

//--------------------------------------------------
//----用于指定章节的试题
procedure TfrmSJSC.ShowXJ(TypeID:integer;XiaoJie:string);
var
  TableName:string;
begin
  case TypeID of
    0: TableName:='TXuanZe';
    1: TableName:='TTianKong';
    2: TableName:='TJianDa';
    3: TableName:='TChengxu';
  end;
  ST_ADOQ.Close;
  ST_ADOQ.SQL.Clear;
  ST_ADOQ.SQL.Add('SELECT A.BH AS 编号,TypeID as 类型,TM as 题目,CZ AS 出自章节,');
  ST_ADOQ.SQL.Add('B.NYD AS 难易度 FROM '+TableName+' AS A,NanYiDj AS B');
  ST_ADOQ.SQL.Add('WHERE TRIM(CZ)=:char AND A.NY=B.BH');
  ST_ADOQ.Parameters.ParamByName('char').Value:=XiaoJie;
  ST_ADOQ.Open;
end;

procedure TfrmSJSC.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 TfrmSJSC.btnADDClick(Sender: TObject);
var
  LX,BH,i:integer;
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;

  STTypeID.Add(IntToStr(LX));   //记下试题类型
  STBH.Add(IntToStr(BH));       //记下试题编号
  STND.Add(ST_DBG.Fields[4].AsString);   //记下试题难度

  if XZT_FRBtn.Checked then  XZTSL_FSE.text:=inttostr(strtoint(XZTSL_FSE.text)+1);       //增加选择题数量
  if TKT_FRBtn.Checked then  TKTSL_FSE.text:=inttostr(strtoint(TKTSL_FSE.text)+1);       //增加填空题数量
  if JDT_FRBtn.Checked then  JDTSL_FSE.text:=inttostr(strtoint(JDTSL_FSE.text)+1);        //增加简答题数量
  if YLLST_FRBtn.Checked then  CXSJTSL_FSE.text:=inttostr(strtoint(CXSJTSL_FSE.text)+1);   //增加原理论述题数量
 
  MessageBox(handle,'这道试题已经成功添加!','添加成功',MB_OK or MB_ICONINFORMATION);
  ST_ADOQ.Next;

  btnSave.Enabled:=true;

end;

//-------------------------
//保存试卷
procedure TfrmSJSC.btnSaveClick(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:=strtoint(XZTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=TKT_FRBtn.tag then temp:=strtoint(TKTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=JDT_FRBtn.tag then temp:=strtoint(JDTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=YLLST_FRBtn.tag then temp:=strtoint(CXSJTFZ_FSE.text);

      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:=frmMain.UserName;     //当前用户作为出卷老师
  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:=strtoint(XZTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=TKT_FRBtn.tag then temp:=strtoint(TKTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=JDT_FRBtn.tag then temp:=strtoint(JDTFZ_FSE.text);
      if StrToInt(STTypeID.Strings[i])=YLLST_FRBtn.tag then temp:=strtoint(CXSJTFZ_FSE.text);

      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);
  init;
end;

function TfrmSJSC.CheckFZ:boolean;
var
  AllFZ:integer;
begin
  result:=false;
  if (XZTSL_FSE.text<>'0')and(XZTFZ_FSE.text='0') then
    begin
      MessageBox(handle,'请设置选择题分值!','没有输入分值',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;

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

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

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

  AllFZ:=0;                 //计算总分
  AllFZ:=AllFZ+strtoint(XZTSL_FSE.text)*strtoint(XZTFZ_FSE.text);
  AllFZ:=AllFZ+strtoint(TKTSL_FSE.text)*strtoint(TKTFZ_FSE.text);
  AllFZ:=AllFZ+strtoint(JDTSL_FSE.text)*strtoint(JDTFZ_FSE.text);
  AllFZ:=AllFZ+strtoint(CXSJTSL_FSE.text)*strtoint(CXSJTFZ_FSE.text);

  if AllFZ<>strtoint(ZF_FSE.text) then
    begin
      MessageBox(handle,'试题总分不对,请重新设置!','总分有误',MB_OK or MB_ICONERROR);
      result:=true;
      exit;
    end;
end;

end.

⌨️ 快捷键说明

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