Автор работы: Пользователь скрыл имя, 04 Сентября 2013 в 05:38, дипломная работа
Все эти проблемы позволяет решить разработанная мною система тестирования. Основное преимущество трёхзвенной структуры заключается в превосходной степени защиты (к базе данных нет прямого доступа из интернета, многоуровневая защита с различными алгоритмами шифрования).
Для проектирования и разработки базы данных использовались источники [1, 5, 6], для создания приложения тестирования [2, 3], а для обеспечения защиты данных [4, 7].
Введение 5
1 Теоретические основы 6
1.1 Постановка задачи6
1.2 Проектирование баз данных10
1.3 Среда Firebird как средство разработки СУБД14
1.4 Разработка интерфейса пользователя18
1.5 Выбор средств защиты информации22
2 Разработка и апробация проекта 26
Заключение 39
Список использованных источников 40
Приложение А (обязательное) Код программы 41
SetWPtoNull(nom);
ShowWorkPlases(-1);
end;
procedure TFmExamServer.
begin
FinishExamAtAll(StringGrid1.
end;
procedure TFmExamServer.
begin
FmSettings.ShowModal;
end;
procedure TFmExamServer.
var nom:integer;
begin
if length(WorkPlaces)=0 then
begin
if speaker then MessageDlg('Нет подключенных рабочих станций.'+#13+
'Нечего отменять.', mtinformation, [mbOk], 0);
exit;
end;
nom:=FindNomberByTag(strtoint(
if nom=-1 then
BEGIN
if speaker then MessageDlg('Компьютер не доступен.'+#13+
'Нельзя отменить экзамен на недоступном компьютере.', mtinformation, [mbOk], 0);
exit;
end;
if nom>=0 then
if WorkPlaces[nom].ExamTeoryPK=0 then
BEGIN
if speaker then MessageDlg('На указанном компьютере не назначен экзамен.'+#13+
'Нельзя отменить экзамен,
exit;
end;
WorkPlaces[nom].ClientSocket.
IBDsetEXAMTRwrite.Close;
IBDsetEXAMTRwrite.SelectSQL.
IBDsetEXAMTRwrite.SelectSQL.
IBDsetEXAMTRwrite.Open;
IBDsetEXAMTRwrite.Edit;
IBDsetEXAMTRwrite.FieldByName(
IBDsetEXAMTRwrite.Post;
IBDsetEXAMTRwrite.Close;
WriteIBTransaction.Commit;
SetWPtoNull(nom);
end;
procedure TFmExamServer.
begin
EmercyFinishExam (StringGrid1.Row,true);
end;
function TFmExamServer.
var
buffer: array[0..255] of char;
size: dword;
begin
size := 256;
if GetComputerName(buffer, size) then
Result := buffer
else
Result := ''
end;
procedure TFmExamServer.ShowWorkPlases(
const defRows=5 ;
var i,j,tmpTag:integer;
NEWstatus:integer;
pref:string;
function GetShortName(inpName:string):
var Sp,d,i:integer;
surOK,secOK:boolean;
begin
result:='';
Sp:=0;
d:=0;
surOK:=false;
secOK:=false;
for i:=1 to length(inpname) do
begin
if inpname[i]=' ' then Sp:=Sp+1
else
begin
if Sp=0 then result:=result+inpname[i];
if (Sp=1) and (not surok) then
begin
surok:=true;
result:=result+' '+inpname[i]+'.';
end;
if (Sp=2) and (not secok) then
begin
secok:=true;
result:=result+inpname[i]+'. ';
end;
end;
if inpname[i]='[' then
begin
d:=d+1;
result:=result+inpname[i];
end
else if d=1 then result:=result+inpname[i];
if inpname[i]=']' then d:=0;
end;
end;
begin
IBDataSetEXAMtr.Close;
IBDataSetEXAMtr.Open;
IBDataSetEXAMtr.FetchAll;
IBDataSetEXAMtr.First;
StringGrid1.ColCount:=defRows+
if length(WorkPlaces)=0 then StringGrid1.RowCount:=2
else StringGrid1.RowCount:=1+
for i := 0 to StringGrid1.RowCount - 1 do StringGrid1.Rows[i].Clear();
StringGrid1.Cells[0,0]:= '№';
StringGrid1.Cells[1,0]:= 'Компьютер';
StringGrid1.Cells[2,0]:= 'Cтатус процесса';
StringGrid1.Cells[3,0]:= 'Экзаменуемый';
StringGrid1.Cells[4,0]:= 'Время';
for j:=1 to 10 do
begin
StringGrid1.Cells[j+defRows-1,
StringGrid1.ColWidths[j+
end;
for i:=0 to length(WorkPlaces)-1 do
begin
tmpTag:=WorkPlaces[i].
StringGrid1.Cells[0,i+1]:= inttostr(abs(tmpTag));
//if tmpTag<=0 then pref:= '{of ';
//if tmpTag>0 then pref:= '{on ';
if WorkPlaces[i].ClientSocket.
StringGrid1.Cells[1,i+1]:=
if IBDataSetEXAMtr.Locate('PK', WorkPlaces[i].ExamTeoryPK , [loCaseInsensitive]) then
begin
NEWstatus:=IBDataSetEXAMtr.
WorkPlaces[i].Status:=
StringGrid1.Cells[2,i+1]:= Stat[WorkPlaces[i].Status];
if (NEWstatus=7) or (NEWstatus=4) or (NEWstatus=5) then
begin
WorkPlaces[i].Resultat:= IBDataSetEXAMtr.FieldByName('
if WorkPlaces[i].Resultat= 1 then StringGrid1.Cells[2,i+1]:= 'Экзамен сдан' else StringGrid1.Cells[2,i+1]:= 'Экзамен НЕ сдан';
end;
StringGrid1.Cells[3,i+1]:=
if i = InitiativeStantion then WorkPlaces[i].Time:=
StringGrid1.Cells[4,i+1]:=
for j:=1 to VOPR do StringGrid1.Cells[j+defRows-1,
end;
end;
end;
procedure TFmExamServer.
Rect: TRect; State: TGridDrawState);
const
clPaleGreen = TColor($AAFFAA);
clPaleRed = TColor($AAAAFF);
begin
with (Sender as TStringGrid) do
with Canvas do
begin
if StringGrid1.Cells[2,Arow]='
begin
if Acol=2 then FONT.Style:=[fsBold];
if (gdSelected in State) then
begin
Brush.color := clGreen;
FONT.color := clWhite ;
end
else
begin
Brush.Color := clPaleGreen ;
FONT.color := clblack ;
end;
FillRect(Rect);
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
end;
if StringGrid1.Cells[2,Arow]='
begin
if Acol=2 then FONT.Style:=[fsBold];
if (gdSelected in State) then
begin
Brush.color := clMaroon;
FONT.color := clWhite ;
end
else
begin
Brush.Color := clPaleRed;
FONT.color := clblack ;
end;
FillRect(Rect);
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
end;
if copy(StringGrid1.Cells[Acol,
begin
Draw(Rect.Left, Rect.Top, Image4.Picture.Graphic);
end;
if copy(StringGrid1.Cells[Acol,
if StringGrid1.Cells[Acol,Arow]='
begin
FONT.color := Brush.Color;
TextOut(Rect.Left+2, Rect.Top+2,StringGrid1.Cells[
Draw(Rect.Left+((Rect.right - Rect.Left) div 2)-(Image6.Picture.Graphic.
end;
if StringGrid1.Cells[Acol,Arow]='
begin
FONT.color := Brush.Color;
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
Draw(Rect.Left+((Rect.right
- Rect.Left) div 2)-(Image1.Picture.Graphic.
end;
if StringGrid1.Cells[Acol,Arow]='
begin
FONT.color := Brush.Color;
TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
Draw(Rect.Left+((Rect.right
- Rect.Left) div 2)-(Image2.Picture.Graphic.
end;
end;
end;
procedure TFmExamServer.Timer1Timer(
var i:integer;
begin
if Timer1.Tag = 0 then
begin
Timer1.Tag:=1;
StringGrid1.Refresh;
end;
for i:=0 to length(WorkPlaces)-1 do
begin
if WorkPlaces[i].Status=3 then
begin
WorkPlaces[i].Time:=
StringGrid1.Cells[4,i+1]:=
end;
end;
end;
procedure TFmExamServer.
begin
StartNewExam(StringGrid1.Row,
end;
function TFmExamServer.FindNomberByTag(
var i:integer;
begin
result:=-1;
for i:=0 to length(WorkPlaces)-1 do
begin
if WorkPlaces[i].ClientSocket.Tag = tag then
begin
result:=i;
exit;
end;
end;
end;
procedure TFmExamServer.
Socket: TCustomWinSocket);
var i:integer;
begin
i:=FindNomberByTag((Sender as TClientSocket).tag);
WorkPlaces[i].ClientSocket.
ShowWorkPlases(-1);
end;
procedure TFmExamServer.
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
errorcode := 0;
with Sender as TClientSocket do
begin
tag:=-tag;
end;
ShowWorkPlases(-1);
end;
procedure TFmExamServer.
Socket: TCustomWinSocket);
begin
with Sender as TClientSocket do
begin
tag:=-tag;
Active:=false;
end;
ShowWorkPlases(-1);
end;
procedure TFmExamServer.
Socket: TCustomWinSocket);
begin
Some(Socket.ReceiveText);
end;
procedure TFmExamServer.SetWPtoNull(nom:
begin
WorkPlaces[nom].ClientManName:
WorkPlaces[nom].ExamTeoryPK:=
WorkPlaces[nom].Time:=600;
WorkPlaces[nom].Resultat:=0;
WorkPlaces[nom].Status:=0;
end;
procedure TFmExamServer.AddAnAWorkPlace(
var i,j:integer;
a:TServerExam;
CltCpuName,tmpname,FName:
F:TextFile;
procedure writeToWP;
begin
WorkPlaces[i].ClientManName:='
WorkPlaces[i].ExamTeoryPK:=0;
WorkPlaces[i].Time:=0;
WorkPlaces[i].Resultat:=0;
WorkPlaces[i].Status:=0;
end;
begin
FName:=(ExtractFilePath(
If FileExists(FName) then
begin
AssignFile(F,FName);
reset(F);
j:=1;
CltCpuName:='';
while not Eof(F) do
begin
tmpname:='';
readln(F,tmpname);
if j=StantionNomber then CltCpuName:=tmpname;
j:=j+1;
end;
CloseFile(F);
if CltCpuName='' then
begin
MessageDlg('В файле настроек сервера не найдено
имя компьютера для станции '+inttostr(StantionNomber)+#
exit;
end;
end
else
begin
MessageDlg('Не найден файл настроек программы.'+#13+'Приложение будет закрыто.', mtError, [mbOk], 0);
Application.Terminate
end;
if Re < 0 then
begin
setlength(WorkPlaces,length(
i:=length(WorkPlaces)-1;
end
else i:=Re;
if WorkPlaces[i].ExamTeoryPK=0 then writeToWP;
WorkPlaces[i].
if Re <0 then
begin
WorkPlaces[i].ClientSocket:=
WorkPlaces[i].ClientSocket.
end;
with WorkPlaces[i].ClientSocket do
begin
Tag:=StantionNomber;
Host:=WorkPlaces[i].
Port:=1300+StantionNomber;
OnConnect:=
OnError:=ClientSocket1Error;
OnDisconnect:=
Active:=true;
end;
end;
procedure TFmExamServer.Some(RecText:
var Stantion,Re, msg:integer;
begin
msg:=strtoint(RecText);
if Msg>0 then
begin
Stantion:=msg;
ShowWorkPlases(
end;
if msg<0 then
begin
Re:=-1;
Stantion:=abs(msg);
if FindNomberByTag(Stantion)<>-1 then
begin
MessageDlg('Отказано в подключении рабочей станции с № '+inttostr(Stantion)+' '+#13+
'Рабочая станция № '+inttostr(Stantion)+' уже подключена к серверу.'+#13+
'Измените конфигурационный файл рабочей станции.', mtError, [mbOk], 0);
exit;
end;
if FindNomberByTag(-Stantion)<>-1 then
begin
Re:=FindNomberByTag(-Stantion)
end;
AddAnAWorkPlace(Re,Stantion);
ShowWorkPlases(-1);
end;
end;
procedure TFmExamServer.
var nom:integer;
begin
if length(WorkPlaces)=0 then
begin
MessageDlg('Нет подключенных рабочих станций.'+#13+
'Нельзя распечатать экзаменационный лист пока нет подключенных станций.', mtinformation, [mbOk], 0);
exit;
end;
nom:=FindNomberByTag(strtoint(
if nom=-1 then nom:=FindNomberByTag(-
if (WorkPlaces[nom].Status<>7) and (WorkPlaces[nom].Status<>4) and (WorkPlaces[nom].Status<>5) then
BEGIN
MessageDlg('Экзамен не завершен, либо не был назначен.'+#13+
'Нельзя распечатать экзаменационный лист для не завершенного, либо не назначенного экзамена.', mtinformation, [mbOk], 0);
exit;
end;
RptExamList.PrintList(
end;
procedure TFmExamServer.
begin
Form7.ShowModal;
end;
end.