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