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

📄 main.~pas

📁 局域网考试系统 局域网考试系统
💻 ~PAS
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls,Jpeg, StdCtrls, Buttons,Zlib, DB, ADODB,
  ScktComp, Sockets, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, Gauges, NMUDP;

type
  CHECKMASK=set of 'A'..'E';
  TStudentInf=record
                IDD:String[16];
                Name:String[20];
                Num:String[20];
                end;

  TMainForm = class(TForm)
    StatusBar1: TStatusBar;
    SB1: TScrollBox;
    NextButton: TSpeedButton;
    QuesQuery: TADOQuery;
    P1: TPanel;
    CB11: TCheckBox;
    CB12: TCheckBox;
    CB13: TCheckBox;
    CB14: TCheckBox;
    CB15: TCheckBox;
    Ques1: TImage;
    P2: TPanel;
    CB21: TCheckBox;
    CB22: TCheckBox;
    CB23: TCheckBox;
    CB24: TCheckBox;
    CB25: TCheckBox;
    Ques2: TImage;
    Ques3: TImage;
    P3: TPanel;
    CB31: TCheckBox;
    CB32: TCheckBox;
    CB33: TCheckBox;
    CB34: TCheckBox;
    CB35: TCheckBox;
    P4: TPanel;
    CB41: TCheckBox;
    CB42: TCheckBox;
    CB43: TCheckBox;
    CB44: TCheckBox;
    CB45: TCheckBox;
    Ques4: TImage;
    Ques5: TImage;
    P5: TPanel;
    CB51: TCheckBox;
    CB52: TCheckBox;
    CB53: TCheckBox;
    CB54: TCheckBox;
    CB55: TCheckBox;
    ST1: TStaticText;
    ST2: TStaticText;
    ST3: TStaticText;
    ST4: TStaticText;
    ST5: TStaticText;
    PreButton: TSpeedButton;
    Time1: TLabel;
    Time2: TLabel;
    HandButton: TSpeedButton;
    HandAnsUdp: TNMUDP;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure NextButtonClick(Sender: TObject);
    procedure PreButtonClick(Sender: TObject);
    procedure Ques1Click(Sender: TObject);
    procedure SB1MouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure CB11Click(Sender: TObject);
    procedure HandButtonClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     FieldStream,DecStream:TMemoryStream;
     Bitmap:TBitmap;
     PaperType,TeacherIP:String;
     StuInfo:TStudentInf;
     PaperFileName:String;
     Answers:array[1..250] of CHECKMASK;
     NumberOfQues:Integer;
     ScoreOfQues:Real;
     PerScore:Real;
     CountQues:Integer;
     SecondCount,TimeCount:Integer;

    procedure HandlePaper;
    procedure ReadBlobField(Field: TBlobField; Stream: TStream);
    procedure DrawQuestion(QuesCount:Integer);
    procedure DeCompressStream(SourceStream, DeskStream: TStream);
    procedure ImageLoadFromBlobField(Image: TImage;
  BlobField: TBlobField);
    procedure InitQues;
    procedure InitRef;
    procedure NextQues;
    procedure PreQues;
    procedure ShowYesNo(YN:Boolean;Index:Integer);
    procedure SetLastTime(MText,SText:String);
  end;

var
     MainForm: TMainForm;
     HostIP:String[25];
implementation

{$R *.dfm}
procedure TMainForm.ReadBlobField(Field: TBlobField; Stream: TStream);
var
     ADOBlobField:TADOBlobStream;
begin
     ADOBlobField:=TADOBlobStream.Create(Field,bmRead);
     Stream.Position:=0;
     ADOBlobField.SaveToStream(Stream);
     Stream.Position:=0;
     ADOBlobField.Free;
end;
procedure TMainForm.DeCompressStream(SourceStream, DeskStream: TStream);
const
     SixK=$ffff;
var
     DeCompStream:TDecompressionStream;
     Data:array[1..SixK] of Char;
     Count:Integer;
begin
     SourceStream.Position:=0;
     DeCompStream:=TDecompressionStream.Create(SourceStream);
     DeskStream.Position :=0;
     try
     repeat
     Count:=DeCompStream.Read(Data,SixK);
     if Count>0 then  DeskStream.Write(Data,Count);
     until Count=0;
     finally
     DeCompStream.Free;
     end;
     DeskStream.Position :=0;
end;

procedure TMainForm.ImageLoadFromBlobField(Image: TImage;
  BlobField: TBlobField);
begin
     ReadBlobField(BlobField,FieldStream);
     DeCompressStream(FieldStream,DecStream);
     Bitmap.LoadFromStream(DecStream);
     Image.Picture.Assign(Bitmap);
     Bitmap.FreeImage;
     DecStream.Clear;
     FieldStream.Clear;
end;



{ TMainForm }

procedure TMainForm.DrawQuestion(QuesCount:Integer);
var
     i:Integer;
     QuesImage:TImage;
begin
     for i:=1 to Quescount do
     begin
          QuesImage:=TImage(Self.FindComponent('Ques'+IntToStr(i)));
          ImageLoadFromBlobField(QuesImage,TBlobField(QuesQuery.FieldByName(PaperType)));
          ShowYesNo(True,i);
          QuesQuery.Next;
     end;
     for i:=Quescount+1 to 5 do
     begin
          ShowYesNo(False,i);
     end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
     PaperType:='题目';
     PaperFileName:=ExtractFilePath(Application.ExeName)+'Paper1.QI';
     FieldStream:=TMemoryStream.Create;
     DecStream:=TMemoryStream.Create;
     Bitmap:=TBitmap.Create;
end;

procedure TMainForm.InitQues;
begin
     with QuesQuery do
     begin
          Close;
          LoadFromFile(PaperFileName);
          Open;
          NumberOfQues:=RecordCount;
          NextButtonClick(NextButton);
     end;
          PerScore:=100 / NumberOfQues;
          Dec(TimeCount);
          SecondCount:=60;
          Timer.Enabled :=True;
end;

procedure TMainForm.NextButtonClick(Sender: TObject);
begin
     NextQues;
     if QuesQuery.RecNo>6 then PreButton.Enabled :=True;
     if QuesQuery.Eof then NextButton.Enabled :=False
        else
        if Not NextButton.Enabled then NextButton.Enabled :=True;
end;

procedure TMainForm.NextQues;
begin
     CountQues:=QuesQuery.RecordCount-QuesQuery.RecNo+1;
     if CountQues>=5 then CountQues:=5;
     DrawQuestion(CountQues);
end;

procedure TMainForm.PreQues;
begin
          if QuesQuery.Eof then
          begin
               QuesQuery.MoveBy(-(CountQues+4));
               NextQues;
          end
          else
          if QuesQuery.RecNo>10 then
          begin
               QuesQuery.MoveBy(-10);
               NextQues;
          end;
end;

procedure TMainForm.PreButtonClick(Sender: TObject);
begin
     PreQues;
     if (QuesQuery.RecNo=6) or (QuesQuery.RecordCount<=5)  then PreButton.Enabled:=False;
     if Not QuesQuery.Eof then NextButton.Enabled :=True;
end;

procedure TMainForm.ShowYesNo(YN: Boolean;Index:Integer);
var
    ST:TStaticText;
    Ques:TImage;
    P:TPanel;
    j:Integer;
begin
     ST:=TStaticText(Self.FindComponent('ST'+IntToStr(Index)));
     ST.Visible:=YN;
     Ques:=TImage(Self.FindComponent('Ques'+IntToStr(Index)));
     Ques.Visible:=YN;
     P:=TPanel(Self.FindComponent('P'+IntToStr(Index)));
     P.Visible:=YN;
     if YN then
     begin
          for j:=1 to 5 do
          begin
               with TCheckBox(Self.FindComponent('CB'+IntToStr(Index)+IntToStr(j))) do
               begin
                    Tag:=QuesQuery.RecNo;
                    Checked:=(Chr(64+j) in Answers[QuesQuery.RecNo]);
               end;
          end;
          ST.Caption :='第'+IntToStr(QuesQuery.RecNo)+'题';
          if Index>1 then
          begin
               with TPanel(Self.FindComponent('P'+IntToStr(Index-1))) do
               begin
                    ST.Top :=Top+Height;
               end;
               Ques.Top :=ST.Top+ST.Height;
               P.Top :=Ques.Top+Ques.Height;
          end;
     end;
end;

procedure TMainForm.Ques1Click(Sender: TObject);
begin
     SB1.SetFocus;
end;

procedure TMainForm.SB1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
     SB1.VertScrollBar.Position :=SB1.VertScrollBar.Position-WheelDelta Div 10;
end;

procedure TMainForm.SetLastTime(MText,SText: String);
begin
     Time1.Caption :='剩余时间为'+MText+'分'+SText+'秒';
     Time2.Caption :='剩余时间为'+MText+'分'+SText+'秒';
end;

procedure TMainForm.CB11Click(Sender: TObject);
var
     QuesIndex:Integer;
     QuesCheck:TCheckBox;
     CheckLeter:String;
begin
     QuesCheck:=TCheckBox(Sender);
     CheckLeter:=QuesCheck.Caption;
     QuesIndex:=QuesCheck.Tag;
     if QuesCheck.Checked then
     begin
          Answers[QuesIndex]:=Answers[QuesIndex] + [CheckLeter[1]];
     end
     else
     begin
          Answers[QuesIndex]:=Answers[QuesIndex] - [CheckLeter[1]];
     end
end;

procedure TMainForm.HandButtonClick(Sender: TObject);
begin
     HandlePaper;
               Timer.Enabled :=False;
               if MessageBox(Handle,'你已经交卷!^_^'#13#10'是否要观看参考?','警告',MB_YESNO or MB_ICONWARNING)<>IDYES then
               begin
                    Application.Terminate;
               end
               else
               begin
                    InitRef;
               end;
end;

procedure TMainForm.TimerTimer(Sender: TObject);
begin
     Dec(SecondCount);
     if SecondCount<=0 then
     begin
          Dec(TimeCount);
          if TimeCount=5 then MessageBeep(1000);
          if TimeCount<=0 then
          begin
               Timer.Enabled :=False;
               HandButtonClick(Sender);
               if MessageBox(Handle,'时间到,已经帮你交卷!^_^'#13#10'是否要观看参考?','警告',MB_YESNO or MB_ICONWARNING)<>IDYES then
               begin
                    Application.Terminate;
               end
               else
               begin
                    InitRef;
               end;
          end;
     end;
     SetLastTime(IntToStr(TimeCount),IntToStr(SecondCount));
end;

procedure TMainForm.InitRef;
begin
     with QuesQuery do
     begin
          Close;
          LoadFromFile(PaperFileName);
          Open;
          PaperType:='主观答案';
          NextButtonClick(NextButton);
     end;
end;

procedure TMainForm.HandlePaper;
var
i:Integer;
j:Char;
AnswerLeter:String;
ScoreStr:array[0..20] of Char;
begin
ScoreOfQues:=0;
QuesQuery.First;
for i:=1 to NumberOfQues do
begin
     AnswerLeter:='';
     for j:='A' to 'E' do
     begin
          if j in Answers[i] then
          begin
               AnswerLeter:=AnswerLeter+j;
          end;
     end;
     if QuesQuery.FieldByName('客观答案').AsString =AnswerLeter then
     begin
          ScoreOfQues:=ScoreOfQues+PerScore;
     end;
     QuesQuery.Next;
end;
ShowMessage('你考了'+IntToStr(Round(ScoreOfQues))+'分!');
HandAnsUdp.RemoteHost :=HostIP;
StrCopy(@ScoreStr,PChar(IntToStr(Round(ScoreOfQues))));
HandAnsUdp.SendBuffer(ScoreStr,Length(ScoreStr));
HandButton.Enabled :=False;
end;

end.

⌨️ 快捷键说明

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