Отчет
|
Описание
|
User_id
|
Соответствует одному из
значений поля "User_ID" из таблицы "Пользователи", таким
образом, однозначно характеризует пользователя. Целочисленный тип данных INTEGER.
|
Res_text
|
Текст результата
тестирования. Строковый тип данных VARCHAR(50)
|
Ball
|
Количество набранных
баллов. Число с плавающей запятой FLOAT(8).
|
Tema_ID
|
Соответствует одному из
значений поля "Tema_ID" из таблицы "Тема", таким образом,
однозначно характеризует темe. Целочисленный тип данных INTEGER.
|
Date
|
Дата проведения теста.
Строковый тип данных VARCHAR(50)
|
Time
|
Время проведения теста.
Строковый тип данных VARCHAR(50)
|
Result_ID
|
Первичный ключ. Целочисленный
тип данных INTEGER.
|
5.
Автоматизированные рабочие места
5.1 Автоматизированное рабочее место пользователя
1 ввод данных о пользователе в базу данных;
2 выбор темы тестирования;
выбор правильных ответов на вопросы, предлагаемые программой.
5.2 Автоматизированное рабочее место системного администратора
1 ввод и редактирование новых тем вопросов для тестирования;
2 ввод и редактирование вопросов для тестирования.
6. Описание
программы
.1 Аннотация
Описываемая программа тестирования пользователей состоит из клиентской
программы, устанавливаемой на компьютеры пользователей и единого сервера БД.
Разработанная программа сохраняет исходные данные о пользователях и результаты
тестирования.
Разработанная программа и база данных позволяют проводить многократное
тестирование пользователей, при этом сохраняются все результаты предыдущих
тестирований, время и дата. Входными данными для работы являются:
· Фамилия, имя отчество пользователя;
· Тема тестирования;
· Ответы на вопросы.
Программа выдает пользователю следующую информацию:
· Фамилия, имя отчество пользователя;
· Тема тестирования;
· Количество набранных баллов;
· Результат тестирования;
· Результаты предыдущих тестов.
Применение разработанной программы существенно повышает оперативность получения
результатов, снижает трудоемкость работ и улучшает условия работы занятого
проверкой персонала.
Для разработки использовалось следующее программное обеспечение - язык
ООП Borland C++ Builder
6 c использованием технологии доступа к
данным ADO (ActiveX Data Objects) и СУБД MS SQL Server 2000, работающие в среде ОС Windows. Листинг программы представлен в
Приложении А.
6.2 Настройка SQL-сервера
1 Вызовите компонент Microsoft SQL Server, предназначенный для создания
псевдонимов серверов - "Client Network
Utility". На рисунке 2 приведен пример
вызова этого компонента в среде Windows
2003 Server. В других версиях ОС Windows расположение компонента может
отличаться;
Рисунок 2 - Вызов программы "Client Network Utility"
2 На вкладке "Общие" в списке "Отключённые
протоколы" выберите запись "TCP/IP" и нажмите кнопку
"Включить" (см. рисунок 3);
Рисунок 3 - Выбор протокола подключения
Выберите вкладку "Псевдоним" и нажмите кнопку "Добавить"
(рисунок 4);
Рисунок 4 - Создание нового псевдонима сервера
3 В появившемся окне в разделе "Сетевые библиотеки"
выберите пункт "ТСР/IP",
в поле "Псевдоним для сервера" введите "Prioris_w2000" (без
кавычек), в поле "Имя сервера" - 127.0.0.1, а в поле "Имя
канала" - 1433 (см. рисунок 5). Нажмите кнопку "ОК".
Рисунок 5 - Заполнение параметров нового псевдонима сервера
4 Запустите программу управления MS SQL Server - "Enterprise Manager".
Обычно это делается последовательностью действий "Пуск -> Программы
-> Microsoft SQL Server -> Enterprise Manager";
Нажмите правой кнопкой мыши на узле дерева "SQL Server Group" для вызова контекстного меню;
5 Выберете пункт "New SQL Server
Registration";
6 В появившемся окне нажмите кнопку "Далее", затем
выберите из левого списка созданный сервер (Prioris_w2000) и нажмите кнопку
"Add". Нажмите кнопку
"Далее";
Выберите пункт "The SQL Server login
information…" (см. рисунок 6), в следующем окне "Login automatically…", и в поле "Login name" введите "sa", а поле "Password" оставьте пустым (см. рисунок 7). Нажмите кнопку "Далее";
Рисунок 6 - Регистрация нового сервера
Рисунок 7 - Заполнение имени пользователя
После этого появится окно, в котором необходимо выбрать пункт "Add the SQL Server(s) to an existing SQL Server group" (см. рисунок 8);
Рисунок 8 - Выбор группы для добавления нового сервера
8
После всех выше описанных операций появится окно с подтверждением успешного
добавления нового сервера (см. рисунок 9);
Рисунок 9 - Подтверждение успешного добавления нового сервера
9 Скопируйте два файла базы данных в каталог, где установлен SQL
Server (в данном случае: "C:\Program Files\Microsoft SQL
Server\MSSQL\Data");
10 Запустите программу управления MS SQL Server - "Enterprise Manager".
Обычно это делается последовательностью действий "Пуск -> Программы
-> Microsoft SQL Server -> Query Analyzer";
Введите в появившемся окне текст: "sp_attach_db 'Kurs_Max',
'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Kurs_Max_Data.MDF',
'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Kurs_Max_Log.LDF'";
Нажмите клавишу F5.
Произойдёт подключение файлов базы данных к серверу.
6.3 Установка программы
1 Скопируйте файл "Testirovanie.exe" в выбранный
вами каталог;
2 Вызовите компонент Windows
предназначенный для администрирования источников данных - "Источники
данных (ODBC)". На рисунке 10 приведен
пример вызова этого компонента в среде Windows 2003 Server.
В других версиях ОС Windows расположение
компонента может отличаться;
Рисунок 10 - Вызов компонента "Источники данных (ODBC)"
В открывшемся окне (см. рисунок 11) выберите одну из двух закладок -
"Пользовательский DSN"
или "Системный DSN";
Рисунок 11 - Главное окно компонента "Источники данных (ODBC)"
Для добавления нового источника данных на одной из этих закладок нажмите
кнопку "Добавить". Вызовется мастер добавления нового источника
данных (рисунок 12).
Примечание:
При создании пользовательского источника данных, с этим источником и
соответственно с программой сможет работать только тот пользователь, под
которым вы вошли в систему в момент добавления источника данных.
При создании системного источника данных с этим источником и
соответственно с программой сможет работать любой пользователь, прошедший
процедуру регистрации при входе в Windows.
Рисунок 12 - Первое окно мастера создания нового источника данных
3 Выберите в качестве драйвера для источника - "SQL Server" и нажмите кнопку "Готово";
4 В следующем окне мастера (рисунок 13) задайте в качестве имени
источника данных - "Maximoff" (прим.: обязательно латинскими буквами и именно это имя). Введите,
или если это доступно, выберите из выпадающего списка название сервера, с
которым будите работать (Prioris_w2000). Нажмите кнопку
"Далее";
Рисунок 13 - Задание имени источника данных и выбор сервера СУБД
5 В следующем окне (рисунок 14) ответьте на вопрос, как SQL-сервер должен проверять подлинность
пользователя, для этого установите переключатель в положение "проверка
подлинности учетной записи SQL Server".
Включите переключатель "Получить параметры, используемые по умолчанию, от SQL-сервера" и введите в поле
"Пользователь" - sa, а
поле "Пароль" оставьте пустым. Нажмите кнопку "Далее";
Рисунок 14 - Настройка параметров проверки подлинности пользователя
6 Оставив в следующих двух окнах мастера (рисунок 15 и рисунок 16)
всё без изменений, завершите создание источника данных, нажав в последнем окне
кнопку "Готово";
Рисунок 15 - Настройка параметров работы с БД
Рисунок 16 - Настройка параметров работы с SQL-сервером
7 После окончания работы мастера появится информационное окно
представленное на рисунке 17, в котором описаны произведённые настройки
источника данных;
Рисунок 17 - Параметры источника данных
8 Если настройки правильные, то после нажатия кнопки
"Проверить источник данных" появится подтверждающее сообщение
(рисунок 18). Нажмите "ОК" и закройте все открытые окна мастера настройки
источника данных.
Рисунок 18 - Подтверждающее информационное сообщение о правильности
настроек
.4 Описание работы с программой
Работа пользователя с программой начинается с показа заставки, на которой
написаны правила прохождения тестирования и фамилии разработчиков (см. рисунок
19). Данная заставка пропадает при нажатии на ней мыши.
Рисунок 19 - Заставка программы
Далее появится окно "Пользователи", в котором происходит выбор
пользователя и темы для тестирования.
Также в окне "Пользователи" имеется главное меню с двумя
кнопками: "Отчёт" и "О программе". При нажатии на
"Отчёт" появится окно "Результаты тестирования" (см. рис.
20). В данном окне отображаются все пользователи, зарегистрированные в
программе, темы, даты и время их предыдущих тестов. Выбирая в верхней таблице
"Пользователь" разных пользователей, а в нижней "Прошлые
тесты" вариант тестирования, можно просмотреть результаты, которые отображаются
в верхней части окна. При успешном прохождении теста цвет шрифта будет зелёным,
в противном случае - красным. Для прохождения нового тестирования необходимо
нажать кнопку "Новое тестирование".
Рисунок 20 - Окно "Результаты тестирования"
Если с программой работает пользователь, ранее не проходивший
тестирование, то ему необходимо ввести свою фамилию, имя и отчество в базу
данных. Это делается с помощью кнопок, расположенных ниже таблицы с
пользователями (см. рисунок 21).
Рисунок 21 - Окно "Пользователи"
После описанных выше операций пользователь должен нажать кнопку
"Начать тестирование". Окно "Пользователи" закроется и
появится окно "Программа тестирования пользователей". В данном окне в
верхней части указана категория сложности вопроса и сам вопрос, отображаемый
зелёным цветом (см. рисунок 22). Ниже находится панель "Варианты
ответа". На этой панели пользователь должен выбрать ответы, которые он
считает правильными. Для этого необходимо сделать щелчок мыши на тексте ответа.
После этого его цвет изменится на зелёный и напротив появится
"галочка". Затем пользователь должен нажать кнопку "ОК",
расположенную ниже вариантов ответа. Ему будет предложен следующий вопрос.
Рисунок 22 - Окно "Программа тестирования пользователей"
Если пользователь отметил правильные ответы, то цвет текста не изменится,
в противном случае он поменяется на красный. В случае, когда пользователь не
выбрал правильный ответ, его цвет станет зелёным (см. рисунок 23).
Рисунок 23 - Пример выбора вариантов ответа
После того, как пользователь ответит на все вопросы, появится окно
"Результаты тестирования", работа в котором описана выше.
При удалении пользователя из базы данных происходит автоматическое
удаление всех его прошлых результатов тестирования.
Приложение
Листинг программы
Форма "Пользователи"
//кнопка "Начать тестирование"__fastcall
TForm2::SpeedButton1Click(TObject *Sender)
{(QUsers1->IsEmpty()) //если не выбран ни один пользователь
{("Не выбран ни один пользователь!");
}//если пользователь выбран
{->Hide();->Refresh();->Show();->QVopros->SQL->Clear();
//создание запроса, который выбирает все
//вопросы для данной темы->QVopros->SQL->Add("Select * from
Vopros where Tema_Parent =
"+QTema->FieldByName("Tema_id")->AsString+"order by
Slognost");->QVopros->Open();->QVopros->First(); //установка
курсора на первую запись->Label1->Caption=Form1->QVopros->FieldByName("Text")->AsString;->QOtvet->SQL->Clear();
//создание запроса, который выбирает все
}
}
//---------------------------------------------------------------------------
//кнопка "Отчёт"__fastcall TForm2::N1Click(TObject *Sender)
{->Hide();->Show();->QOtchet->Close();->QOtchet->SQL->Clear();->QOtchet->SQL->Add("Select
* from Otchet where User_ID=
"+QUsers1->FieldByName("User_ID")->AsString+ "and
Tema_ID=
"+QTema->FieldByName("Tema_ID")->AsString);->QOtchet->Open();(!Form3->QOtchet->IsEmpty())
{(Form3->QOtchet->FieldByName("Res_text")->AsString=="Тест
не пройден")
{->Label3->Font->Color= clRed;->Label4->Font->Color=
clRed;->Label7->Font->Color= clRed;
}
{->Label3->Font->Color= clGreen;->Label4->Font->Color=
clGreen;->Label7->Font->Color= clGreen;
}->Label7->Caption=Form3->QOtchet->FieldByName("Date")->AsString;->Label3->Caption=Form3->QOtchet->FieldByName("Res_text")->AsString+"!";->Label4->Caption="Набрано
"+FloatToStr(Form3->QOtchet->FieldByName("Ball")->AsFloat)+"
баллов";
}
{->Label3->Font->Color=
clWindowText;->Label4->Font->Color=
clWindowText;->Label3->Caption="Тестирование не
производилось!";->Label4->Caption="Тестирование не
производилось!";->Label7->Caption="";
}
//------------------------заполняем таблицу с темами, датой и временем на
форме
"Результат"->QOtchet->Close();->QOtchet->SQL->Clear();->QOtchet->SQL->Add("Select
* from Otchet where User_ID= "+Form2->QUsers1->FieldByName("User_ID")->AsString+
"and Tema_ID=
"+Form2->QTema->FieldByName("Tema_ID")->AsString+
"order by Date,
Time");->QOtchet->Open();(!Form3->QOtchet->IsEmpty())
{(Form3->QOtchet->FieldByName("Res_text")->AsString=="Тест
не пройден")
{->Label3->Font->Color= clRed;->Label4->Font->Color=
clRed;->Label7->Font->Color= clRed;
}
{->Label3->Font->Color= clGreen;->Label4->Font->Color=
clGreen;->Label7->Font->Color= clGreen;
}->Label7->Caption=Form3->QOtchet->FieldByName("Date")->AsString;->Label3->Caption=Form3->QOtchet->FieldByName("Res_text")->AsString+"!";->Label4->Caption="Набрано
"+FloatToStr(Form3->QOtchet->FieldByName("Ball")->AsFloat)+"
баллов";
}
{->Label3->Font->Color=
clWindowText;->Label4->Font->Color=
clWindowText;->Label3->Caption="Тестирование не
производилось!";->Label4->Caption="Тестирование не
производилось!";->Label7->Caption="";
}->SG1->RowCount=2;->SG1->FixedRows=1;->SG1->Cells[0][0]="Тема";->SG1->Cells[1][0]="Дата";->SG1->Cells[2][0]="Время";->SG1->Cells[0][1]="";->SG1->Cells[1][1]="";->SG1->Cells[2][1]="";->QOtchet->Close();->QOtchet->SQL->Clear();->QOtchet->SQL->Add("Select
* from Otchet where User_ID=
"+Form2->QUsers1->FieldByName("User_ID")->AsString+
"order by Date, Time");->QOtchet->Open();->QOtchet->First();(!Form3->QOtchet->IsEmpty())
{i=1;(!Form3->QOtchet->Eof)
{*QSelect=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Tema where Tema_ID=
"+Form3->QOtchet->FieldByName("Tema_ID")->AsString);>Open();(!QSelect->IsEmpty())
{->SG1->Cells[0][i]=QSelect->FieldByName("Tema_text")->AsString;->SG1->Cells[1][i]=Form3->QOtchet->FieldByName("Date")->AsString;->SG1->Cells[2][i]=Form3->QOtchet->FieldByName("Time")->AsString;->SG1->RowCount=i+1;++;->QOtchet->Next();
}
{->SG1->Cells[0][1]="";->SG1->Cells[1][1]="";->SG1->Cells[2][1]="";
}QSelect;
}
}
}
//---------------------------------------------------------------------------
//кнопка "О программе"__fastcall TForm2::N2Click(TObject
*Sender)
{->Visible=false;->Visible=true;
}
//---------------------------------------------------------------------------__fastcall
TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
//удаление всех записей, принадлежащих удалённому пользователю*QSel=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Otchet");>Open();>First();(!QSel->Eof)
{*QDel=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Users where User_ID=
"+QSel->FieldByName("User_ID")->AsString);>Open();(QDel->IsEmpty())>Delete();>Next();QDel;
}QSel;
}
Форма "Тестирование"ball=0;prav=0; //количество правильных
ответов (в БД)prav_user=0; //количество правильных ответов, данных
пользователемneprav_user=0; //количество неправильных ответов, данных
пользователем
//кнопка "ОК"__fastcall
TForm1::SpeedButton1Click(TObject *Sender)
{
//проверка выбран ли вообще какой-нибудь ответ
if(CheckBox1->Checked==false &
CheckBox2->Checked==false & CheckBox3->Checked==false &
CheckBox4->Checked==false)
{("Не выбран ни один ответ!");;
}
//подсчёт кол-ва правильных ответов, выбранных пользователем>First();
//если пользователь ответил правильно
if(CheckBox1->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==1)
{_user=prav_user++;
}
//если пользователь поставил "галочку" на неправильном ответе
if(CheckBox1->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==0)
{_user=neprav_user++;->Font->Color = clRed;
}
//если пользователь не поставил "галочку" на правильном ответе
if
(QOtvet->FieldByName("Prav_otvet")->AsInteger==1 &
CheckBox1->Checked==false)
{->Font->Color = clGreen;
}>Next();
//если пользователь ответил правильно(CheckBox2->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==1)
{_user=prav_user++;
}
//если пользователь поставил "галочку" на неправильном ответе
if(CheckBox2->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==0)
{_user=neprav_user++;->Font->Color = clRed;
}
//если пользователь не поставил "галочку" на правильном ответе
if (QOtvet->FieldByName("Prav_otvet")->AsInteger==1
& CheckBox2->Checked==false)
{->Font->Color = clGreen;
}>Next();
//если пользователь ответил правильно(CheckBox3->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==1)
{_user=prav_user++;
}
//если пользователь поставил "галочку" на неправильном ответе
if(CheckBox3->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==0)
{_user=neprav_user++;->Font->Color = clRed;
}
//если пользователь не поставил "галочку" на правильном ответе
if (QOtvet->FieldByName("Prav_otvet")->AsInteger==1
& CheckBox3->Checked==false)
{->Font->Color = clGreen;
}>Next();
//если пользователь ответил правильно(CheckBox4->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==1)
{_user=prav_user++;
}
//если пользователь поставил "галочку" на неправильном ответе
if(CheckBox4->Checked==true &
QOtvet->FieldByName("Prav_otvet")->AsInteger==0)
{_user=neprav_user++;->Font->Color = clRed;
}
//если пользователь не поставил "галочку" на правильном ответе
if (QOtvet->FieldByName("Prav_otvet")->AsInteger==1
& CheckBox4->Checked==false)
{->Font->Color = clGreen;
}
//проверка правильности ответов:
QOtvet->First();(!QOtvet->Eof)
{=prav+QOtvet->FieldByName("Prav_otvet")->AsInteger;
QOtvet->Next();
}
//подсчёт баллов за ответ
if (prav_user!=0)=ball+((prav_user-neprav_user/4)/prav)*(QVopros->FieldByName("Slognost")->AsInteger);->Visible=true;->Angles->StartAngle=1;
Pie1->Angles->EndAngle=1;
//если все ответы правильные - время задержки меньше
if (neprav_user==0)
{->Visible=false;->Interval=500;->Enabled=true;
}//иначе - задержка 2 сек.
{->Visible=true;->Interval=1800;->Enabled=true;
Timer2->Enabled=true;
}
//обнуляем все значения для следующего вопроса
prav=0;_user=0;_user=0;
}__fastcall TForm1::CheckBox1MouseMove(TObject *Sender,Shift,
int X, int Y)
{(CheckBox1->Checked==false)->Font->Color =
clWindowText;
}
//---------------------------------------------------------------------------__fastcall
TForm1::CheckBox3MouseMove(TObject *Sender,Shift, int X, int Y)
{(CheckBox3->Checked==false)->Font->Color =
clWindowText;
}
//---------------------------------------------------------------------------__fastcall
TForm1::CheckBox4MouseMove(TObject *Sender,Shift, int X, int Y)
{(CheckBox4->Checked==false)->Font->Color =
clWindowText;
}
//---------------------------------------------------------------------------__fastcall
TForm1::CheckBox2MouseMove(TObject *Sender,Shift, int X, int Y)
{(CheckBox2->Checked==false)->Font->Color =
clWindowText;
}
//---------------------------------------------------------------------------__fastcall
TForm1::CheckBox3Click(TObject *Sender)
{->Font->Color = clGreen;
}
//---------------------------------------------------------------------------__fastcall
TForm1::CheckBox4Click(TObject *Sender)
{->Font->Color = clGreen;
}
//---------------------------------------------------------------------------
//закрытие формы
//если были удалены пользователи, то удаляем результаты их тестирования
void __fastcall TForm1::FormClose(TObject *Sender,
TCloseAction &Action)
{*QSel=new TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Otchet");>Open();>First();(!QSel->Eof)
{*QDel=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Users where User_ID=
"+QSel->FieldByName("User_ID")->AsString);>Open();(QDel->IsEmpty())>Delete();>Next();QDel;
}QSel;->Close();
}
//---------------------------------------------------------------------------__fastcall
TForm1::N2Click(TObject *Sender)
{->Hide();->Show();
}
//---------------------------------------------------------------------------
//первый таймер__fastcall TForm1::Timer1Timer(TObject *Sender)
{->Enabled=false;->Angles->EndAngle=360;(!QVopros->Eof)
{>Next();->Caption=QVopros->FieldByName("Text")->AsString;(QVopros->FieldByName("Slognost")->AsInteger==3)->Caption="Вопрос
"+QVopros->FieldByName("Slognost")->AsString+"-ей категории сложности";->Caption="Вопрос
"+QVopros->FieldByName("Slognost")->AsString+"-ой категории сложности";>SQL->Clear();>SQL->Add("Select *
from Otvet where Parent_id =
"+QVopros->FieldByName("Vopr_id")->AsString);>Open();->Caption=QOtvet->FieldByName("Otvet")->AsString;>Next();->Caption=QOtvet->FieldByName("Otvet")->AsString;>Next();->Caption=QOtvet->FieldByName("Otvet")->AsString;>Next();->Caption=QOtvet->FieldByName("Otvet")->AsString;>Next();(!QVopros->Eof)
{>Prior();
}
}
{("Тест окончен!");
//Вывод формы с результатами->Hide();
Form3->Show();->QOtchet->Open();
if(ball<10) //если тест не пройден
{->Label3->Font->Color= clRed;->Label4->Font->Color=
clRed;->Label7->Font->Color=
clRed;->QOtchet->Insert();->QOtchet->FieldByName("Date")->AsString=DateToStr(Date());->QOtchet->FieldByName("Time")->AsString=TimeToStr(Time());->QOtchet->FieldByName("Res_text")->AsString="Тест не пройден";->QOtchet->FieldByName("User_ID")->AsInteger=Form2->QUsers1->FieldByName("User_ID")->AsInteger;(ball==0)->QOtchet->FieldByName("Ball")->AsFloat=0;->QOtchet->FieldByName("Ball")->AsFloat=StrToFloat(FormatFloat("#.#",ball));->QOtchet->FieldByName("Tema_ID")->AsInteger=Form2->QTema->FieldByName("Tema_ID")->AsInteger;->QOtchet->Post();->Label3->Caption="Тест не пройден!";->Label4->Caption="Набрано
"+FormatFloat("#.#",ball)+" баллов";->Label7->Caption=DateToStr(Date());
}//пройден
{->Label3->Font->Color= clGreen;->Label4->Font->Color=
clGreen;->Label7->Font->Color=
clGreen;->QOtchet->Insert();->QOtchet->FieldByName("Date")->AsString=DateToStr(Date());->QOtchet->FieldByName("Time")->AsString=TimeToStr(Time());->QOtchet->FieldByName("Res_text")->AsString="Тест пройден";->QOtchet->FieldByName("User_ID")->AsInteger=Form2->QUsers1->FieldByName("User_ID")->AsInteger;->QOtchet->FieldByName("Ball")->AsFloat=StrToFloat(FormatFloat("#.#",ball));->QOtchet->FieldByName("Tema_ID")->AsInteger=Form2->QTema->FieldByName("Tema_ID")->AsInteger;->QOtchet->Post();->Label3->Caption="Тест пройден!";->Label4->Caption="Набрано
"+FormatFloat("#.#",ball)+" баллов";->Label7->Caption=DateToStr(Date());
}
//------------------------заполняем таблицу с темами, датой и временем на
форме "Результат"
Form3->QOtchet->Close();->QOtchet->SQL->Clear();->QOtchet->SQL->Add("Select
* from Otchet where User_ID=
"+Form2->QUsers1->FieldByName("User_ID")->AsString+
"and Tema_ID= "+Form2->QTema->FieldByName("Tema_ID")->AsString+
"order by Date, Time");->QOtchet->Open();->SG1->RowCount=2;->SG1->FixedRows=1;->SG1->Cells[0][0]="Тема";->SG1->Cells[1][0]="Дата";->SG1->Cells[2][0]="Время";->SG1->Cells[0][1]="";->SG1->Cells[1][1]="";->SG1->Cells[2][1]="";->QOtchet->Close();->QOtchet->SQL->Clear();->QOtchet->SQL->Add("Select
* from Otchet where User_ID=
"+Form2->QUsers1->FieldByName("User_ID")->AsString+
"order by Date,
Time");->QOtchet->Open();->QOtchet->First();(!Form3->QOtchet->IsEmpty())
{i=1;(!Form3->QOtchet->Eof)
{*QSelect=new TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Tema where Tema_ID=
"+Form3->QOtchet->FieldByName("Tema_ID")->AsString);>Open();(!QSelect->IsEmpty())
{->SG1->Cells[0][i]=QSelect->FieldByName("Tema_text")->AsString;->SG1->Cells[1][i]=Form3->QOtchet->FieldByName("Date")->AsString;->SG1->Cells[2][i]=Form3->QOtchet->FieldByName("Time")->AsString;->SG1->RowCount=i+1;++;->QOtchet->Next();
}
{->SG1->Cells[0][1]="";->SG1->Cells[1][1]="";->SG1->Cells[2][1]="";
}QSelect;
}
}=0;=0;_user=0;
}->Checked=false;->Checked=false;->Checked=false;->Checked=false;
//делаем черный цвет шрифта у всех ответов
CheckBox1->Font->Color =
clWindowText;->Font->Color = clWindowText;->Font->Color =
clWindowText;->Font->Color =
clWindowText;->Visible=false;->Enabled=false;
}
//---------------------------------------------------------------------------
//второй таймер__fastcall TForm1::Timer2Timer(TObject *Sender)
{->Angles->EndAngle=Pie1->Angles->EndAngle+2;
}
//---------------------------------------------------------------------------__fastcall
TForm1::FormCreate(TObject *Sender)
{->Visible=false;
}
Форма "Результаты тестирования"
//щелчок мыши на таблице "Пользователь"
void __fastcall TForm3::DBGrid1CellClick(TColumn *Column)
{>Close();>SQL->Clear();>SQL->Add("Select
* from Otchet where User_ID=
"+Form2->QUsers1->FieldByName("User_ID")->AsString+
"and Tema_ID=
"+Form2->QTema->FieldByName("Tema_ID")->AsString+
"Order by Date, Time");>Open();(!QOtchet->IsEmpty())
{(QOtchet->FieldByName("Res_text")->AsString=="Тест не пройден")
{->Font->Color= clRed;->Font->Color=
clRed;->Font->Color= clRed;
}
{->Font->Color= clGreen;->Font->Color=
clGreen;->Font->Color= clGreen;
}->Caption=Form3->QOtchet->FieldByName("Date")->AsString;->Caption=QOtchet->FieldByName("Res_text")->AsString+"!";->Caption="Набрано
"+FloatToStr(QOtchet->FieldByName("Ball")->AsFloat)+"
баллов";
}
{->Font->Color= clWindowText;->Font->Color=
clWindowText;->Caption="Тестирование не производилось!";
Label4->Caption="Тестирование не производилось!";
Label7->Caption="";
}->RowCount=2;->FixedRows=1;->Cells[0][0]="Тема";->Cells[1][0]="Дата";->Cells[2][0]="Время";->Cells[0][1]="";->Cells[1][1]="";->Cells[2][1]="";>Close();>SQL->Clear();>SQL->Add("Select
* from Otchet where User_ID=
"+Form2->QUsers1->FieldByName("User_ID")->AsString+
"Order by Date,
Time");>Open();>First();(!QOtchet->IsEmpty())
{i=1;(!QOtchet->Eof)
{*QSelect=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Tema where Tema_ID= "+QOtchet->FieldByName("Tema_ID")->AsString);>Open();(!QSelect->IsEmpty())
{->Cells[0][i]=QSelect->FieldByName("Tema_text")->AsString;->Cells[1][i]=QOtchet->FieldByName("Date")->AsString;->Cells[2][i]=QOtchet->FieldByName("Time")->AsString;->RowCount=i+1;++;>Next();
}
{->Cells[0][1]="";->Cells[1][1]="";
}QSelect;
}
}
}
//---------------------------------------------------------------------------
//закрытие формы__fastcall TForm3::FormClose(TObject *Sender, TCloseAction
&Action)
{
//если были удалены пользователи, то удаляем результаты их тестирования
TADOQuery *QSel=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Otchet");>Open();>First();(!QSel->Eof)
{*QDel=new
TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Add("Select
* from Users where User_ID=
"+QSel->FieldByName("User_ID")->AsString);>Open();(QDel->IsEmpty())>Delete();>Next();QDel;
}QSel;>Terminate();
}
//---------------------------------------------------------------------------
//кнопка "Новое тестирование"__fastcall TForm3::SpeedButton1Click(TObject *Sender)
{->Hide();->Show();
}
//---------------------------------------------------------------------------
//щелчок мыши на таблице "Прошлые тесты"__fastcall
TForm3::SG1SelectCell(TObject *Sender, int ACol, int ARow,
bool &CanSelect)
{
//если произошёл щелчок мыши на поле "Дата", то передвигаем его
//на поле "Тема"(ACol==1)=ACol-1;
//если произошёл щелчок мыши на поле "Время", то передвигаем
его
//на поле "Тема"(ACol==2)
ACol=ACol-2;*QSelect=new TADOQuery(NULL);>ConnectionString=Form2->ADOConnection1->ConnectionString;>SQL->Clear();>SQL->Add("Select
* from Tema where Tema_text= '"
+SG1->Cells[ACol][ARow]+"'");>Open();>Close();>SQL->Clear();>SQL->Add("Select
* from Otchet where User_ID= "+Form2->QUsers1->FieldByName("User_ID")->AsString+
"and Tema_ID=
"+QSelect->FieldByName("Tema_ID")->AsInteger+ "and
Date= '"+SG1->Cells[ACol+1][ARow]+"'"+ "and Time=
'"+SG1->Cells[ACol+2][ARow]+"'"+ "order by Date,
Time");>Open();(!QOtchet->IsEmpty())
{(QOtchet->FieldByName("Res_text")->AsString=="Тест не пройден")
{->Font->Color= clRed;->Font->Color=
clRed;->Font->Color= clRed;
}
{->Font->Color= clGreen;->Font->Color=
clGreen;->Font->Color= clGreen;
}->Caption=Form3->QOtchet->FieldByName("Date")->AsString;->Caption=QOtchet->FieldByName("Res_text")->AsString+"!";->Caption="Набрано
"+FloatToStr(QOtchet->FieldByName("Ball")->AsFloat)+"
баллов";
}
{->Font->Color= clWindowText;->Font->Color=
clWindowText;->Caption="Тестирование не производилось!";
Label4->Caption="Тестирование не производилось!";
Label7->Caption="";
}QSelect;
}