📄 usjsc.~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 + -