Автоматизация проверки знаний и навыков студентов в области прикладной математики и информатики
Разработка и реализация программного комплекса для обеспечения возможности проведения тестирования в образовательной среде. Разработка структура системы, базы данных, алгоритмов, интерфейса пользователя. Технико-экономическое обоснование проекта.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 03.09.2012 |
Размер файла | 3,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
DataModule1.tabelTests.Open;
end;
procedure TteacherForm.answerNavigatorClick(Sender: TObject;
Button: TNavigateBtn);
begin
if Button = nbInsert then
begin
if ((teacherForm.questionTypeCB.ItemIndex = 4) and (DataModule1.tabelAnswers.RecordCount = 1)) then
begin
MessageBox(teacherForm.Handle,'На вопрос типа "Свободный ввод" разрешен только один ответ','Добавление ответа невозможно',MB_OK or MB_ICONASTERISK);
DataModule1.tabelAnswers.First;
answerDBCtrlGrid.Refresh;
exit;
end;
DataModule1.tabelAnswers.Append;
if questionTypeCB.ItemIndex in [2, 3, 4] then
begin
answerIsRightCheck.DataSource.DataSet.FieldByName('Answer_is_right').AsBoolean := true;
answerDBCtrlGrid.Refresh;
end;
end;
end;
procedure TteacherForm.fontsComboBoxChange(Sender: TObject);
begin
CurrText.Name := fontsComboBox.FontName;
end;
procedure TteacherForm.fontSizeComboBoxChange(Sender: TObject);
begin
CurrText.Size := StrToInt(fontSizeComboBox.Text);
end;
procedure TteacherForm.ToolButton11Click(Sender: TObject);
begin
if ColorDialog1.Execute then
CurrText.Color := ColorDialog1.Color;
end;
procedure TteacherForm.btnTestCancelClick(Sender: TObject);
begin
DataModule1.tabelTests.Cancel;
end;
procedure TteacherForm.btnQuestAcceptClick(Sender: TObject);
begin
try
with DataModule1.tabelQuestions do
begin
Edit;
FieldByName('Question_Type').AsInteger := questionTypeCB.ItemIndex;
FieldByName('Question_time').AsString := questionTimLimitEdit.Text;
Post;
Refresh;
end;
except
end;
end;
procedure TteacherForm.btnQuestCancelClick(Sender: TObject);
begin
DataModule1.tabelQuestions.Cancel;
end;
procedure TteacherForm.questionTextEditEnter(Sender: TObject);
begin
DataModule1.tabelQuestions.Edit
end;
procedure TteacherForm.tbBoldClick(Sender: TObject);
begin
if fsBold in CurrText.Style then
begin
tbBold.Down := false;
CurrText.Style := CurrText.Style - [fsBold]
end
else
begin
tbBold.Down := true;
CurrText.Style := CurrText.Style + [fsBold];
end;
end;
procedure TteacherForm.tbItalicClick(Sender: TObject);
begin
if fsItalic in CurrText.Style then
begin
tbItalic.Down := false;
CurrText.Style := CurrText.Style - [fsItalic]
end
else
begin
tbItalic.Down := true;
CurrText.Style := CurrText.Style + [fsItalic];
end;
end;
procedure TteacherForm.tbUnderlineClick(Sender: TObject);
begin
if fsUnderline in CurrText.Style then
begin
tbUnderline.Down := false;
CurrText.Style := CurrText.Style - [fsUnderline]
end
else
begin
tbUnderline.Down := true;
CurrText.Style := CurrText.Style + [fsUnderline];
end;
end;
procedure TteacherForm.questionTextEditSelectionChange(Sender: TObject);
begin
if fsBold in CurrText.Style then
tbBold.Down := true
else
tbBold.Down := false;
if fsItalic in CurrText.Style then
tbItalic.Down := true
else
tbItalic.Down := false;
if fsUnderline in CurrText.Style then
tbUnderline.Down := true
else
tbUnderline.Down := false;
end;
procedure TteacherForm.tbLeftClick(Sender: TObject);
begin
// questionTextEdit.Alignment;
end;
procedure TteacherForm.tbCenterClick(Sender: TObject);
begin
questionTextEdit.Alignment := taCenter;
end;
procedure TteacherForm.tbInsertObjectClick(Sender: TObject);
begin
if questionTextEdit.InsertObjectDialog = true then
DataModule1.tabelQuestions.Edit;
end;
procedure TteacherForm.questionNavigatorClick(Sender: TObject;
Button: TNavigateBtn);
begin
if Button = nbInsert then
DataModule1.tabelQuestions.Append;
end;
procedure TteacherForm.FormActivate(Sender: TObject);
begin
DataModule1.ADOConnection.Close;
DataModule1.tabelSections.Close;
DataModule1.tabelTests.Close;
DataModule1.tabelQuestions.Close;
DataModule1.tabelAnswers.Close;
autentificationForm.ShowModal;
end;
end.
Модуль администрирования
unit uEditorAutentification;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TautentificationForm = class(TForm)
loginEdit: TEdit;
passwordEdit: TEdit;
loginLabel: TLabel;
passwordLabel: TLabel;
btnOK: TBitBtn;
btnCancel: TBitBtn;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
autentificationForm: TautentificationForm;
implementation
uses uEditorDataModule, uEditorMain;
{$R *.dfm}
procedure TautentificationForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
sqlStr : string;
begin
if (Sender as TautentificationForm).ModalResult = mrOk then
begin
if ((loginEdit.Text = '') and (passwordEdit.Text = '')) then
begin
MessageBox(Handle,'Введите имя учетной записи и пароль','Ошибка!!!',MB_OK or MB_ICONERROR);
CanClose := false;
end
else
begin
DataModule1.ADOConnection.Open;
sqlStr := 'SELECT * from Users Where (User_group_id=1 or User_group_id=2)' +
' and (User_name=''' + loginEdit.Text + ''' and User_password=''' +
passwordEdit.Text + ''')';
//ShowMessage(sqlStr);
try
DataModule1.ADOConnection.Open;
DataModule1.groupQuery.Open;
DataModule1.userQuery.Close;
DataModule1.userQuery.SQL.Text := sqlStr;
DataModule1.userQuery.Open;
except
end;
if DataModule1.userQuery.RecordCount = 1 then
begin
DataModule1.tabelSections.Open;
DataModule1.tabelTests.Open;
DataModule1.tabelQuestions.Open;
DataModule1.tabelAnswers.Open;
end
else
begin
MessageBox(Handle,'Доступ запрещен!!!','Ошибка!!!',MB_OK or MB_ICONERROR);
teacherForm.Close;
end;
end;
end
else
begin
teacherForm.Close;
end;
end;
end.
unit uDataModule;
interface
uses
SysUtils, Classes, DB, ADODB;
type
TDataModule1 = class(TDataModule)
ADOConnection: TADOConnection;
usersTable: TADOTable;
groupsTable: TADOTable;
groupSectionTable: TADOTable;
groupsDS: TDataSource;
usersDS: TDataSource;
groupSectionDS: TDataSource;
sectionsTable: TADOTable;
sectionsDS: TDataSource;
sectionsQuery: TADOQuery;
procedure groupsDSDataChange(Sender: TObject; Field: TField);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{$R *.dfm}
procedure TDataModule1.groupsDSDataChange(Sender: TObject; Field: TField);
var
sqlStr : string;
begin
sqlStr := 'Select * from Sections,Group_sections where Group_sections.Gs_group_id=' +
groupsTable.FieldByName('Group_id').AsString +
' AND Group_sections.Gs_section_id = Sections.Section_ID';
sectionsQuery.Close;
sectionsQuery.SQL.Text := sqlStr;
sectionsQuery.Open;
end;
end.
Модуль тестирования
unit uClinetLogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DBCtrls, ExtCtrls, Buttons, Mask, RxLookup;
type
TautentificationForm = class(TForm)
serverConnectionPanel: TPanel;
userAutentificationPanel: TPanel;
Splitter1: TSplitter;
btnOK: TBitBtn;
btnCancel: TBitBtn;
groupLabel: TLabel;
userNameLabel: TLabel;
passwordLabel: TLabel;
btnNew: TBitBtn;
userNameEdit: TEdit;
userPasswordEdit: TMaskEdit;
groupNameDBLoocupCB: TRxDBLookupCombo;
Edit1: TEdit;
Label1: TLabel;
procedure btnNewClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure groupNameDBLoocupCBChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
type TUser = record
ID : integer;
grope_ID : integer;
name : string;
code : string;
password : string;
grants : integer;
info : string;
email : string;
end;
var
autentificationForm: TautentificationForm;
currentUser : TUser;
implementation
uses uClientNewUser, uClientDataModule, DB, uClientMain;
{$R *.dfm}
procedure TautentificationForm.btnNewClick(Sender: TObject);
begin
newUserForm.ShowModal;
end;
procedure TautentificationForm.FormShow(Sender: TObject);
begin
ZeroMemory(@currentUser,sizeof(TUser));
userNameEdit.Text := '';
userPasswordEdit.Text := '';
testingForm.StatusBar.Panels[0].Text := '';
end;
procedure TautentificationForm.groupNameDBLoocupCBChange(Sender: TObject);
var
sqlStr : string;
begin
with DataModule1 do
begin
groupQuery.Open;
groupSectionQuery.Open;
sqlStr := 'SELECT Section_ID, Section_name FROM Sections, Group_sections' +
' WHERE Group_sections.Gs_group_id = ' + groupQuery.FieldByName('Group_id').AsString +
' AND Group_sections.Gs_section_id = Sections.Section_ID';
sectionQuery.Close;
sectionQuery.SQL.Text := sqlStr;
sectionQuery.Open;
end;
end;
procedure TautentificationForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
sqlStr : WideString;
begin
if (Sender as TautentificationForm).ModalResult = mrOk then
begin
if ((userNameEdit.Text = '') or (userPasswordEdit.Text = '')) then
begin
MessageBox(Handle,'Не введен логин или пароль!','Ошибка входа',MB_OK or MB_ICONERROR);
CanClose := false;
end
else
begin
sqlStr := 'SELECT * FROM Users' +
' WHERE User_group_id = ' + DataModule1.groupQuery.FieldByName('Group_ID').AsString +
'AND User_name =' + '''' + userNameEdit.Text +
''' AND User_password = ' + '''' + userPasswordEdit.Text + ''';';
try
DataModule1.userQuery.Close;
DataModule1.userQuery.SQL.Text := sqlStr;
DataModule1.userQuery.Open;
except
on Exception do
begin
ShowMessage('Ошибка выполнения запроса к базе');
exit;
end;
end;
if DataModule1.userQuery.RecordCount = 1 then
begin
with DataModule1.userQuery do
begin
currentUser.ID := FieldByName('User_ID').AsInteger;
currentUser.grope_ID := FieldByName('User_group_ID').AsInteger;
currentUser.name := FieldByName('User_name').AsString;
currentUser.code := FieldByName('User_code').AsString;
currentUser.password := FieldByName('User_password').AsString;
currentUser.grants := FieldByName('User_grants').AsInteger;
currentUser.info := FieldByName('User_info').AsString;
currentUser.email := FieldByName('User_mail').AsString;
userResult.userID := currentUser.ID;
//выводим информацию для пользователя
testingForm.StatusBar.Panels[0].Text := 'Вы вошли как ' + currentUser.name +
' (Группа : ' + DataModule1.groupQuery.FieldByName('Group_name').AsString + ')';
end;
end
else
begin
MessageDlg('Ошибка аутентификации! Пользователь не найден',mtError,mbOKCancel,-1);
CanClose := false;
end;
end;
end;
end;
end.
unit uClientSelectTest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, DBCtrls, Buttons, RxLookup, Grids, DBGrids;
type
TtestSelectForm = class(TForm)
testSelectPanel: TPanel;
Splitter1: TSplitter;
testDiscriptionPanel: TPanel;
buttonPanel: TPanel;
Splitter2: TSplitter;
testSectionGroupBox: TGroupBox;
testListGroupBox: TGroupBox;
Splitter3: TSplitter;
testDescriptionGroupBox: TGroupBox;
testAutorGroupBox: TGroupBox;
Splitter4: TSplitter;
btnOk: TBitBtn;
btnCancel: TBitBtn;
testAutorDBMemo: TDBMemo;
testDescriptionDBMemo: TDBMemo;
testSectionDBLB: TRxDBLookupCombo;
RxDBLookupList1: TRxDBLookupList;
procedure testSectionDBLBChange(Sender: TObject);
procedure RxDBLookupList1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
testSelectForm: TtestSelectForm;
implementation
uses uClientDataModule, uClinetLogin, uClientMain;
{$R *.dfm}
procedure TtestSelectForm.FormShow(Sender: TObject);
var
errorMessage : string;
begin
randomize;
if currentUser.ID = 0 then
begin
errorMessage := 'Сначала необходимо пройти процедурц аутентификации' + #10#13 +
'Зарегистрироваться сейчас?';
if MessageBox(Handle,PChar(errorMessage),'Ошибка!!!',MB_YESNO or MB_ICONWARNING) = mrYes then
autentificationForm.ShowModal;
testSelectForm.Close;
end;
end;
procedure TtestSelectForm.testSectionDBLBChange(Sender: TObject);
var
sqlStr : string;
begin
sqlStr := 'SELECT * FROM Tests WHERE Test_section_ID = ' +
DataModule1.sectionQuery.FieldByName('Section_id').AsString;
DataModule1.testQuery.Close;
DataModule1.testQuery.SQL.Text := sqlStr;
DataModule1.testQuery.Open;
// ShowMessage(sqlStr);
end;
procedure TtestSelectForm.RxDBLookupList1Click(Sender: TObject);
var
sqlStr : string;
begin
sqlStr := 'SELECT * FROM Questions WHERE Question_test_id = ' +
DataModule1.testQuery.FieldByName('Test_ID').AsString;
DataModule1.questionQuery.Close;
DataModule1.questionQuery.SQL.Text := sqlStr;
//набор данных откроем после того как пользователь подтвердит выбор
// ShowMessage(sqlStr);
end;
procedure TtestSelectForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
sqlStr, sqlInsert : string;
begin
if (Sender as TtestSelectForm).ModalResult = mrOk then
begin
with DataModule1.testQuery do
begin
selectedTest.ID := FieldByName('Test_ID').AsInteger;
selectedTest.name := FieldByName('Test_Name').AsString;
selectedTest.testType := FieldByName('Test_type').AsInteger;
selectedTest.quistionLimit := FieldByName('Test_question_limit').AsInteger;
selectedTest.isRandomAnswer := FieldByName('Test_is_random_answers').AsBoolean;
selectedTest.isTimeLimit := FieldByName('Test_is_time_limit').AsBoolean;
selectedTest.timeLimit := FieldByName('Test_time_limit').AsString;
selectedTest.isBack := FieldByName('Test_is_back').AsBoolean
end;
testingForm.StatusBar.Panels[1].Text := 'Выбран тест: ' + selectedTest.name;
if selectedTest.ID <> 0 then
begin
sqlStr := 'SELECT Count(*) FROM Questions WHERE Question_test_id = ' +
IntToStr(selectedTest.ID);
DataModule1.universalQuery.Close;
DataModule1.universalQuery.SQL.Text := sqlStr;
DataModule1.universalQuery.Open;
selectedTest.questionCount := DataModule1.universalQuery.Fields[0].AsInteger;
userResult.testID := selectedTest.ID;
userResult.complited := 0;
userResult.userComplitedQuestion := 1;
userResult.userRightAnswerQuestion := 0;
if selectedTest.questionCount = 0 then
begin
MessageBox(Handle,'В выбранном тесте отсутствуют вопросы','Тестирование невозможно',MB_OK or MB_ICONWARNING);
CanClose := false;
end
else
begin
//формируем массим случайной последовательности вопросов
SetLength(GquestionOrderArray, selectedTest.questionCount); //тут получим размерность массива
testingForm.FillArray(GquestionOrderArray);
//открываем набор данных с вопросами
DataModule1.questionQuery.Open;
userResult.totalQuestion := selectedTest.questionCount;
userResult.timeBegin := now;
sqlInsert := 'INSERT INTO User_results (User_result_User_id,User_result_test_id,' +
'User_result_test_title,User_result_time_begin,User_result_comleted,' +
'User_result_total_questions) VALUES(' + IntToStr(userResult.userID) +
',' + IntToStr(userResult.testID) + ',''' + selectedTest.name + ''',''' +
testingForm.toSQLDateTime(userResult.timeBegin) +
''',0,' + IntToStr(userResult.totalQuestion) +');';
DataModule1.userResultQuery.Close;
DataModule1.userResultQuery.SQL.Text := sqlInsert;
DataModule1.userResultQuery.ExecSQL;
DataModule1.universalQuery.Close;
DataModule1.universalQuery.SQL.Text := 'Select max(user_result_id) from user_results' +
' where user_result_user_id=' + intToStr(currentUser.ID);
DataModule1.universalQuery.Open;
userResult.id := DataModule1.universalQuery.Fields[0].AsInteger;
//ShowMessage(sqlInsert);
end;
end;
end;
end;
end.
unit uClientDataModule;
interface
uses
SysUtils, StdCtrls, Dialogs, Classes, Controls, DB, ADODB, DBClient, MConnect,
SConnect;
type
TDataModule1 = class(TDataModule)
userResultDS: TDataSource;
userAnswerDS: TDataSource;
userDS: TDataSource;
groupDS: TDataSource;
groupSectionDS: TDataSource;
sectionDS: TDataSource;
answerDS: TDataSource;
questionDS: TDataSource;
testDS: TDataSource;
ADOConnection1: TADOConnection;
answerQuery: TADOQuery;
questionQuery: TADOQuery;
testQuery: TADOQuery;
sectionQuery: TADOQuery;
groupSectionQuery: TADOQuery;
groupQuery: TADOQuery;
userQuery: TADOQuery;
userResultQuery: TADOQuery;
userAnswerQuery: TADOQuery;
universalQuery: TADOQuery;
procedure questionQueryAfterScroll(DataSet: TDataSet);
procedure questionQueryBeforeScroll(DataSet: TDataSet);
procedure questionQueryAfterOpen(DataSet: TDataSet);
private
{ Private declarations }
public
procedure setSingleChoicePanelActive;
procedure setMultiChoicePanelActive;
procedure setRandomChoicePanelActive;
procedure setConformPanelActive;
procedure setOrderPanelActive;
function isUserAnswerRight(var answerText : string; questionType : integer) : boolean;
end;
var
DataModule1: TDataModule1;
implementation
uses uClientMain, Forms, CheckLst, ExtCtrls, Grids;
{$R *.dfm}
procedure TDataModule1.setSingleChoicePanelActive;
begin
with testingForm do
begin
SingleChoicePanel.Visible := true;
SingleChoicePanel.Align := alClient;
MultiChoicePanel.Visible := False;
RandomChoicePanel.Visible := false;
ConformPanel.Visible := false;
OrderPanel.Visible := false;
end;
end;
procedure TDataModule1.setMultiChoicePanelActive;
begin
with testingForm do
begin
MultiChoicePanel.Visible := true;
MultiChoicePanel.Align := alClient;
SingleChoicePanel.Visible := False;
RandomChoicePanel.Visible := false;
ConformPanel.Visible := false;
OrderPanel.Visible := false;
end;
end;
procedure TDataModule1.setRandomChoicePanelActive;
begin
with testingForm do
begin
RandomChoicePanel.Visible := true;
RandomChoicePanel.Align := alClient;
MultiChoicePanel.Visible := False;
SingleChoicePanel.Visible := false;
ConformPanel.Visible := false;
OrderPanel.Visible := false;
end;
end;
procedure TDataModule1.setConformPanelActive;
begin
with testingForm do
begin
ConformPanel.Visible := true;
ConformPanel.Align := alClient;
MultiChoicePanel.Visible := False;
RandomChoicePanel.Visible := false;
SingleChoicePanel.Visible := false;
OrderPanel.Visible := false;
end;
end;
procedure TDataModule1.setOrderPanelActive;
begin
with testingForm do
begin
OrderPanel.Visible := true;
OrderPanel.Align := alClient;
MultiChoicePanel.Visible := False;
RandomChoicePanel.Visible := false;
ConformPanel.Visible := false;
SingleChoicePanel.Visible := false;
end;
end;
//--Процедура форимрования понели для ответа пользователя--------
procedure setAnswer(questionType : integer);
var
lineIndex, index : integer;
answerArray : array of integer;
begin
//перемешиваем ответы если необходимо
if selectedTest.isRandomAnswer = true then
begin
SetLength(answerArray,DataModule1.answerQuery.RecordCount);
testingForm.FillArray(answerArray);
end
else
for index := 0 to DataModule1.answerQuery.RecordCount - 1 do
answerArray[index] := index;
if DataModule1.answerQuery.RecordCount > 0 then
begin
//одиночный выбор--------------------------------------------------
if questionType = 0 then
begin
testingForm.SingleChoiceRG.Items.Clear;
for index := 0 to DataModule1.answerQuery.RecordCount - 1 do
begin
DataModule1.answerQuery.RecNo := answerArray[index];
testingForm.SingleChoiceRG.Items.Add(DataModule1.answerQuery.FieldByName('Answer_text').AsString);
end;
DataModule1.setSingleChoicePanelActive;
end
//множественный выбор----------------------------------------------
else if questionType = 1 then
begin
testingForm.MultiChoiceCLB.Items.Clear;
for index := 0 to DataModule1.answerQuery.RecordCount - 1 do
begin
DataModule1.answerQuery.RecNo := answerArray[index];
testingForm.MultiChoiceCLB.Items.Add(DataModule1.answerQuery.FieldByName('Answer_text').AsString);
end;
DataModule1.setMultiChoicePanelActive;
end
//соответствие --------------------------------------------------
else if questionType = 2 then
begin
for lineIndex := 0 to testingForm.conformStringGrid.RowCount - 1 do
testingForm.conformStringGrid.Rows[lineIndex].Clear;
testingForm.conformStringGrid.RowCount := 1;
testingForm.conformStringGrid.ColWidths[0] := 40;
testingForm.conformStringGrid.ColWidths[2] := 40;
testingForm.conformStringGrid.ColWidths[1] := (testingForm.PanelAnswer.Width - 100) div 2;
testingForm.conformStringGrid.ColWidths[3] := (testingForm.PanelAnswer.Width - 100) div 2;
for index := 0 to DataModule1.answerQuery.RecordCount - 1 do
begin
DataModule1.answerQuery.RecNo := answerArray[index];
testingForm.conformStringGrid.Cells[1, index] := DataModule1.answerQuery.FieldByName('Answer_text').AsString;
testingForm.conformStringGrid.RowCount := (index + 1);
end;
DataModule1.answerQuery.First;
index := 0;
while not DataModule1.answerQuery.Eof do
begin
testingForm.conformStringGrid.Cells[2, index] := IntToStr(index + 1);
testingForm.conformStringGrid.Cells[3, index] := DataModule1.answerQuery.FieldByName('Answer_corresp').AsString;
DataModule1.answerQuery.Next;
inc(index);
end;
DataModule1.setConformPanelActive
end
//упорядоченный список-------------------------------------------
else if questionType = 3 then
begin
for lineIndex := 0 to testingForm.orderStringGrid.RowCount - 1 do
testingForm.orderStringGrid.Rows[lineIndex].Clear;
testingForm.orderStringGrid.RowCount := 1;
testingForm.orderStringGrid.ColWidths[0] := 40;
testingForm.orderStringGrid.ColWidths[1] := testingForm.PanelAnswer.Width - 50;
for index := 0 to DataModule1.answerQuery.RecordCount - 1 do
begin
DataModule1.answerQuery.RecNo := answerArray[index];
testingForm.orderStringGrid.Cells[1,index] := DataModule1.answerQuery.FieldByName('Answer_text').AsString;
testingForm.orderStringGrid.RowCount := (index + 1);
end;
DataModule1.setOrderPanelActive;
end
//свободный ввод--------------------------------------------------
else if questionType = 4 then
begin
testingForm.RandomChoiceEdit.Text := '';
DataModule1.setRandomChoicePanelActive;
end
end;
end;
//---------------------------------------------------------------
//--Получаем и анализируем ответ пользователя
function TDataModule1.isUserAnswerRight(var answerText : string; questionType : integer) : boolean;
var
lineIndex,primaryIndex : integer;
lineIsRight,correspIsRignt : boolean;
sqlStr : string;
begin
//выборка правильных ответов для текущего вопроса
sqlStr := 'SELECT Answer_number, Answer_text, Answer_corresp From Answers Where Answer_question_id = ' +
DataModule1.questionQuery.FieldByName('Question_id').AsString + ' AND Answer_is_right = 1';
DataModule1.universalQuery.Close;
DataModule1.universalQuery.SQL.Text := sqlStr;
DataModule1.universalQuery.Open;
Result := false;
//одиночный выбор--------------------------------------------------
if questionType = 0 then
begin
answerText := '';
Result := false;
with testingForm.SingleChoiceRG do
begin
if ItemIndex <> -1 then
answerText := Items.Strings[ItemIndex];
if ((ItemIndex <> -1) and (Items.Strings[ItemIndex] = DataModule1.universalQuery.Fields[1].AsString)) then
Result := True;
end;
end
//множественный выбор----------------------------------------------
else if questionType = 1 then
begin
answerText := '';
for lineIndex := 0 to testingForm.MultiChoiceCLB.Items.Count - 1 do
if testingForm.MultiChoiceCLB.Checked[lineIndex] then
answerText := answerText + #10#13 + testingForm.MultiChoiceCLB.Items.Strings[lineIndex];
Result := false;
DataModule1.universalQuery.First;
while not DataModule1.universalQuery.Eof do
begin
with testingForm.MultiChoiceCLB do
begin
if Checked[Items.IndexOf(DataModule1.universalQuery.FieldByName('Answer_text').AsString)] = true then
Result := true
else
Result := false;
end;
DataModule1.universalQuery.Next;
end;
end
//соответствие --------------------------------------------------
else if questionType = 2 then
begin
answerText := '';
with testingForm.conformStringGrid do
begin
for lineIndex := 0 to RowCount - 1 do
begin
if Cells[0,lineIndex] = '' then
begin
answerText := '';
exit;
end
else
answerText := answerText + #10#13 + Cells[1, lineIndex] + '-' + Cells[3, StrToInt(Cells[0,lineIndex])];
end;
end;
Result := true;
DataModule1.answerQuery.First;
primaryIndex := 0;
while not answerQuery.Eof do
begin
with testingForm.conformStringGrid do
begin
for lineIndex := 0 to RowCount - 1 do
begin
correspIsRignt := false;
if ((Cells[0, lineIndex] = Cells[2,primaryIndex])
and (Cells[1, lineIndex] = DataModule1.answerQuery.FieldByName('Answer_text').AsString)) then
begin
correspIsRignt := true;
break;
end;
end;
end;
Result := Result and correspIsRignt;
DataModule1.answerQuery.Next;
inc(primaryIndex);
end;
end
//упорядоченный список-------------------------------------------
else if questionType = 3 then
begin
answerText := '';
with testingForm.orderStringGrid do
begin
for lineIndex := 0 to RowCount - 1 do
begin
if Cells[0,lineIndex] = '' then
begin
answerText := '';
exit;
end
else
answerText := answerText + #10#13 + Cells[0,lineIndex] + '-' + Cells[1, lineIndex];
end;
end;
Result := true;
for lineIndex := 0 to testingForm.orderStringGrid.RowCount - 1 do
begin
DataModule1.answerQuery.First;
with testingForm.orderStringGrid do
begin
while not DataModule1.answerQuery.Eof do
begin
if ((Cells[0,lineIndex] = DataModule1.answerQuery.FieldByName('Answer_number').AsString)
and
(Cells[1,lineIndex] = DataModule1.answerQuery.FieldByName('Answer_text').AsString)) then
begin
lineIsRight := true;
break;
end
else
lineIsRight := false;
DataModule1.answerQuery.Next;
end;
end;
Result := Result and lineIsRight;
end;
end
//свободный ввод--------------------------------------------------
else if questionType = 4 then
begin
answerText := testingForm.RandomChoiceEdit.Text;
Result := false;
if AnsiLowerCase(testingForm.RandomChoiceEdit.Text) =
AnsiLowerCase(DataModule1.answerQuery.FieldByName('Answer_text').AsString) then
Result := true;
end
end;
//---------------------------------------------------------------
procedure TDataModule1.questionQueryAfterScroll(DataSet: TDataSet);
var
sqlStr : string;
begin
sqlStr := 'SELECT * FROM Answers WHERE Answer_question_id = ' +
questionQuery.FieldByName('Question_id').AsString;
with answerQuery do
begin
Close;
SQL.Text := sqlStr;
Open;
end;
setAnswer(questionQuery.FieldByName('Question_type').AsInteger);
end;
procedure TDataModule1.questionQueryBeforeScroll(DataSet: TDataSet);
{var
insertSql : string;
answerText : string;
answerIsRight, isAnswered : integer;}
begin
{ answerIsRight := 0;
isAnswered := 0;
if DataModule1.isUserAnswerRight(answerText,questionQuery.FieldByName('Question_type').AsInteger) = true then
begin
inc(userResult.userRightAnswerQuestion);
answerIsRight := 1;
end;
if ((answerText <> '') or (answerText <> ' ')) then
isAnswered := 1;
insertSql := 'INSERT INTO User_answers (User_answer_user_result_id, User_answer_qnumber,' +
'User_answer_question, User_answer_answer, User_answer_time, User_answer_is_right, '+
'User_answer_score, User_answer_answered) VALUES (' + intToStr(userResult.id) +
',' + IntToStr(GquestionNumber) + ',' + DataModule1.questionQuery.FieldByName('Question_text').AsString +
',' + answerText + ',00:00,'+ IntToStr(answerIsRight) + ',0,' + IntToStr(isAnswered) + ')';
ShowMessage(insertSql);}
end;
procedure TDataModule1.questionQueryAfterOpen(DataSet: TDataSet);
begin
GquestionNumber := 0;
DataModule1.questionQuery.RecNo := GquestionOrderArray[GquestionNumber];
end;
end.
unit uClientMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, ExtCtrls, ToolWin, StdCtrls, ImgList, CheckLst,
Buttons, RxRichEd, DBRichEd, DBCtrls, RXCtrls, Grids, RXGrids;
type
TtestingForm = class(TForm)
StatusBar: TStatusBar;
MainMenu: TMainMenu;
Mtest: TMenuItem;
Mquestion: TMenuItem;
Mhelp: TMenuItem;
MtestLogin: TMenuItem;
MtestBegin: TMenuItem;
MtestStop: TMenuItem;
MquestionPrev: TMenuItem;
MquestionNext: TMenuItem;
MhelpAbout: TMenuItem;
PanelQuestion: TPanel;
PanelAnswer: TPanel;
ToolBar1: TToolBar;
Splitter: TSplitter;
SingleChoicePanel: TPanel;
MultiChoicePanel: TPanel;
RandomChoicePanel: TPanel;
ConformPanel: TPanel;
OrderPanel: TPanel;
SingleChoiceRG: TRadioGroup;
RandomChoiceEdit: TLabeledEdit;
ImageList1: TImageList;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
N1: TMenuItem;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
MultiChoiceCLB: TCheckListBox;
MultiChoiceLabel: TLabel;
questionTextRichEdit: TRxDBRichEdit;
Timer: TTimer;
orderStringGrid: TStringGrid;
orderLabel: TLabel;
conformStringGrid: TStringGrid;
conformLabel: TLabel;
procedure MtestLoginClick(Sender: TObject);
procedure MtestStopClick(Sender: TObject);
procedure MtestBeginClick(Sender: TObject);
procedure MquestionNextClick(Sender: TObject);
procedure PanelAnswerDblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure RandomChoicePanelResize(Sender: TObject);
procedure MquestionPrevClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
procedure FillArray(var A: array of Integer);
function toSQLDateTime(dateTime : TDateTime) : string;
{ Public declarations }
end;
TTest = record
ID : integer;
sectionID : integer;
name : string;
discription : string;
author : string;
testType : integer;
questionCount : integer;
quistionLimit : integer;
isRandomAnswer : boolean;
isTimeLimit : boolean;
timeLimit : string;
isBack : boolean;
end;
TUserResult = record
id : integer;
userID : integer;
testID : integer;
timeBegin : TDateTime;
timeEnd : TDateTime;
complited : integer;
userComplitedQuestion : integer;
userRightAnswerQuestion : integer;
score : integer;
totalQuestion : integer;
percentRight : real;
end;
TQuestion = record
ID : integer;
testID : integer;
number : integer;
time : string;
answerQuantity : integer;
queType : integer;
weight : integer;
text : string;
end;
TAnswer = record
questionID : integer;
DBnumber : integer;
localNumber : integer;
text : string;
score : integer;
isRight : boolean;
corresp : array [1..10,1..10] of integer;
end;
var
testingForm: TtestingForm;
selectedTest : TTest;
userResult : TUserResult;
// currentAnswer : TAnswer;
//массив случайных неповторяющихся порядковых номеров вопросов
GquestionOrderArray : array of integer;
//текущий индекс массиве номеров вопросов
GquestionNumber : integer;
implementation
uses uClinetLogin, uClientSelectTest, uClientDataModule;
{$R *.dfm}
//----функция для заполнения массива номеров вопросов--------------
procedure TtestingForm.FillArray(var A: array of Integer);
var
I, S, R: Integer;
begin
for I := 0 to High(A) do
A[I] := I + 1;
for i := High(A) downto 0 do
begin
R := Random(I);
S := A[R];
A[R] := A[I];
A[I] := S;
end;
end;
//-----------------------------------------------------------------
//Преобразуем дату и время в формат SQL Server
function TtestingForm.toSQLDateTime(dateTime : TDateTime) : string;
var
formatSetting : TFormatSettings;
begin
GetLocaleFormatSettings(0,formatSetting);
formatSetting.ShortDateFormat:='mm/dd/yyyy';
formatSetting.DateSeparator := '/';
Result := DateTimeToStr(dateTime,formatSetting);
end;
function toSQLFloat(realDigit : real) : string;
var
formatSetting : TFormatSettings;
begin
GetLocaleFormatSettings(0,formatSetting);
formatSetting.DecimalSeparator := '.';
Result := FormatFloat('0.00',realDigit,formatSetting);
end;
procedure TtestingForm.MtestLoginClick(Sender: TObject);
begin
autentificationForm.ShowModal;
end;
procedure TtestingForm.MtestStopClick(Sender: TObject);
begin
testingForm.Close;
end;
procedure TtestingForm.MtestBeginClick(Sender: TObject);
begin
testSelectForm.ShowModal;
end;
procedure TtestingForm.MquestionNextClick(Sender: TObject);
var
updateSql : string;
// answerText : string;
insertSql : string;
answerText : string;
answerIsRight, isAnswered : integer;
begin
//получение ответа пользователя и занесение его в БД--
answerIsRight := 0;
isAnswered := 0;
if DataModule1.isUserAnswerRight(answerText,DataModule1.questionQuery.FieldByName('Question_type').AsInteger) = true then
begin
inc(userResult.userRightAnswerQuestion);
answerIsRight := 1;
end;
if (answerText <> '') then
isAnswered := 1;
insertSql := 'INSERT INTO User_answers (User_answer_user_result_id, User_answer_qnumber,' +
'User_answer_question, User_answer_answer, User_answer_time, User_answer_is_right, '+
'User_answer_score, User_answer_answered) VALUES (' + intToStr(userResult.id) +
',' + IntToStr(GquestionNumber) + ',''' + DataModule1.questionQuery.FieldByName('Question_header').AsString +
''',''' + answerText + ''',''00:00'','+ IntToStr(answerIsRight) + ',0,' + IntToStr(isAnswered) + ')';
DataModule1.userAnswerQuery.Close;
DataModule1.userAnswerQuery.SQL.Text := insertSql;
DataModule1.userAnswerQuery.ExecSQL;
//ShowMessage(insertSql);
//---------------------------------------------
if GquestionNumber < selectedTest.questionCount - 1 then
begin
inc(GquestionNumber);
inc(userResult.userComplitedQuestion);
StatusBar.Panels[2].Text := 'Вопрос: ' + IntToStr(GquestionNumber + 1) +
' из ' + IntToStr(selectedTest.questionCount);
DataModule1.questionQuery.RecNo := GquestionOrderArray[GquestionNumber];
userResult.complited := 0;
end
else
begin
if DataModule1.isUserAnswerRight(answerText, DataModule1.questionQuery.FieldByName('Question_type').AsInteger) = true then
begin
//ShowMessage('pravilno');
//inc(userResult.userComplitedQuestion);
inc(userResult.userRightAnswerQuestion);
end;
userResult.complited := 1;
userResult.timeEnd := now;
ShowMessage('Тест окончен');
end;
userResult.percentRight := (userResult.userRightAnswerQuestion/userResult.totalQuestion)*100;
//Заносим обновления в базу
updateSql := 'Update User_results Set User_result_completed_questions=' + IntToStr(userResult.userComplitedQuestion) +
',User_result_right_questions=' + IntToStr(userResult.userRightAnswerQuestion) +
',User_result_percent_right=' + toSQLFloat(userResult.percentRight)+
',User_result_comleted=' + IntToStr(userResult.complited) +
' where User_result_id=' + IntToStr(userResult.id);
DataModule1.userResultQuery.Close;
DataModule1.userResultQuery.SQL.Text := updateSql;
DataModule1.userResultQuery.ExecSQL;
if userResult.complited = 1 then
begin
updateSql := 'Update User_results Set User_result_time_end=''' +
testingForm.toSQLDateTime(userResult.timeEnd) +
''' where User_result_id=' + IntToStr(userResult.id);
DataModule1.userResultQuery.Close;
DataModule1.userResultQuery.SQL.Text := updateSql;
DataModule1.userResultQuery.ExecSQL;
end;
end;
procedure TtestingForm.MquestionPrevClick(Sender: TObject);
begin
if ((selectedTest.isBack = true) and (GquestionNumber > 0)) then
begin
dec(GquestionNumber);
dec(userResult.userComplitedQuestion);
StatusBar.Panels[2].Text := 'Вопрос: ' + IntToStr(GquestionNumber + 1) +
' из ' + IntToStr(selectedTest.questionCount);
DataModule1.questionQuery.RecNo := GquestionOrderArray[GquestionNumber];
end
else
MessageBox(Handle,'Возврат невозможен','Ошибка!',MB_OK or MB_ICONWARNING);
end;
procedure TtestingForm.PanelAnswerDblClick(Sender: TObject);
begin
PanelAnswer.Align := alClient;
end;
procedure TtestingForm.FormCreate(Sender: TObject);
begin
SingleChoicePanel.Visible := false;
MultiChoicePanel.Visible := false;
OrderPanel.Visible := false;
ConformPanel.Visible := false;
RandomChoicePanel.Visible := false;
end;
procedure TtestingForm.RandomChoicePanelResize(Sender: TObject);
begin
RandomChoiceEdit.Left := RandomChoicePanel.Left + 5;
RandomChoiceEdit.Top := RandomChoicePanel.Top + 20;
RandomChoiceEdit.Width := RandomChoicePanel.Width - 13;
end;
procedure TtestingForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if userResult.userComplitedQuestion < userResult.totalQuestion then
begin
if MessageBox(handle,'Вы ответили не на все вопросы. Закрыть приложение?','Внимание!!!',MB_YESNO or MB_ICONWARNING) = mrYes then
CanClose := true
else
CanClose := false;
end;
end;
end.
Размещено на Allbest.ru
Подобные документы
Сетевая система контроля знаний студентов на основе объектно-ориентированного подхода. Выбор программно-технических средств для реализации проекта. Алгоритмическое и программное обеспечение, интерфейс пользователя. Разработка элементов базы данных.
дипломная работа [1,3 M], добавлен 04.02.2013Проектирование логической схемы данных для предметной области, физической модели базы данных. Разработка алгоритмов функциональных модулей программного приложения. Принципы тестирования спроектированного программного обеспечения, анализ эффективности.
курсовая работа [926,7 K], добавлен 20.05.2015Клиент-серверная архитектура проектируемой программы по проверке знаний студентов, структура базы данных. Разработка ее программно-интерфейсной реализации в среде Delphi. Установка и запуск приложения, информация для пользователя, листинг программы.
дипломная работа [2,1 M], добавлен 20.06.2011Разработка концептуальной модели базы данных. Реализация алгоритмов и разработка управляющей программы. Разработка структуры системы управления данными. Методика проведения и результаты тестирования. Функционирование разработанного программного модуля.
курсовая работа [550,5 K], добавлен 08.06.2023Результаты предпроектного обследования завода. Разработка и реализация программного комплекса "Subсontraсting". Информационное и программное обеспечение продукта. Технико-экономическое обоснование внедрения проекта, его безопасность и экологичность.
дипломная работа [5,4 M], добавлен 22.06.2011Возможности создания баз данных средствами программного продукта SQL. Изучение предметной области и разработка проекта базы данных по учету студентов "Журнал классного руководителя". Задачи реализации программного средства, его тестирование и отладка.
курсовая работа [3,7 M], добавлен 07.12.2012Создание сетевой системы тестирования с целью автоматизации процесса контроля знаний, оценивания результатов и создания тестовых заданий. Файлы проекта и их назначение. Описание алгоритмов и модулей программы. Работа с сетью, руководство пользователя.
контрольная работа [928,3 K], добавлен 23.12.2012Технико-экономическое обоснование разработки информационной системы "План-меню". Выбор технических средств и стандартного программного обеспечения. Проектирование структуры базы данных. Разработка и структура пользовательского интерфейса и ER-модели.
курсовая работа [817,6 K], добавлен 07.05.2009Анализ существующих решений для составления расписания репетитора. Разработка архитектуры программного продукта. Выбор инструментальных средств. Проектирование реляционной базы данных. Определение методики тестирования. Реализация интерфейса пользователя.
дипломная работа [411,7 K], добавлен 22.03.2018Проектирование программы в среде Delphi для тестирования знаний студентов по программированию, с выводом оценки по окончанию тестирования. Разработка экранных форм и алгоритма программы. Описание программных модулей. Алгоритм процедуры BitBtn1Click.
курсовая работа [365,0 K], добавлен 18.05.2013