
Лабораторна робота №12
.pdf
У програмі встановлено обмеження на кількість елементів масиву
T_TEXT - не більше 10. За бажанням це можна змінити. Після встановлюються властивості компоненти форма. Список значень властивості Items компоненти
RadioGroup1 формуватимемо в ході програми залежно від кількості елементів в масиві довідника тестів. Для цього до властивості Items застосовуємо метод
Add:
For I:=1 to 4 do RadioGroup1.Items.Add(T_TEXT[I]);
Якщо файл довідника тестів відсутній, то буде видано повідомлення Відсутній довідник тестів. В результаті форма буде виглядати так як на рис.12.4
Рисунок 12.4
Створіть нову форму Form2 і збережіть під ім'ям Unit2.pas. Під'єднаєте створену форму до титульної форми. Для цього в Unit1.pas у розділі interface в
рядок списку приєднаних модулів додайте Unit2. Створимо процедуру, яка обробляє ситуацію натиснення кнопки Button1 (Тест). Для цього виділіть об'єкт
Button1, перейдіть на вкладку Events Інспектора об'єктів (Object Inspector),
знайдіть подію OnClick, праворуч від нього двічі клацнути лівою кнопкою миші. Попавши в код програми, треба написати наступний код:
procedure TForm1.Button1Click(Sender: TObject);
21
Var N:Byte;
Begin
N:=RadioGroup1.ItemIndex+1; AssignFile(FFILE,'TEST_'+IntToStr(N)+'.txt'); // Тест с номером N
{$I-} Reset(FFILE); {$I+}
If IOResult = 0 then begin
AssignFile(FF_R, 'TEST_R.txt'); // Рабочий файл тестов
Rewrite(FF_R); Repeat Read(FFILE,TEST_); Write(FF_R,TEST_); until (Eof(FFILE)); CloseFile(FFILE); CloseFile(FF_R); Form2.ShowModal; end
else ShowMessage('Відсутній файл тестів'); end;
На початку процедури формується ім'я тесту залежно від номера вибраного рядка компонента RadioGroup1.
Примітка
Індекс першого перемикача дорівнює 0, а масив довідника містить індекс першого елементу дорівнює 1.
Далі відкривається вибраний файл-тест. Якщо даний файл відсутній, то видається повідомлення «Відсутній файл тестів». Якщо при відкритті файлу-
тесту не виникло помилки, то інформація з нього, переписується в робочий файл тестів (TEST_R.txt). У завершенні відкривається форма як модальна. Це означає, що управління передається новій формі, і користувач не може передати
22

фокус іншій формі даного застосування до тих пір, поки він не закриє модальну форму.
Створимо процедуру, яка обробляє ситуацію натиснення кнопки Button2 («Вихід»). Для цього виділіть об'єкт Button2, перейдіть на вкладку Events
Інспектора об'єктів (Object Inspector), знайдіть подію OnClick, праворуч від нього двічі клацнути лівою кнопкою миші. Попавши в код програми, треба написати наступний код:
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
4.2. Створення форми тестування
Зробіть активною Form2 і розмістіть а ній компоненти у відповідності з
рис.12.5
Рисунок 12.5
23
№ |
Найменування |
Сторінка |
Призначення |
п/п |
компоненту |
|
|
1 |
Label1 |
Standard |
Виведення тексту «Питання № ...» |
2 |
Label2 |
Standard |
Виведення тексту «Текст» питання |
3 |
Label3 |
Standard |
Виведення тексту «Всього питань ...» |
4 |
Label4 |
Standard |
Виведення тексту «Правильних |
|
|
|
відповідей ...» |
5 |
RadioGroup1 |
Standard |
Виведення варіантів відповідей |
6 |
Button1 |
Standard |
Кнопка для переходу до наступного |
|
|
|
питання, показу результату і |
|
|
|
завершенню тестування |
В розділі implementation розмістіть опис типу і даних, які будемо використовувати під час роботи.
Type TTEST = Record
TEXT : String [250]; // Текст питання
OTV : Array [1..4]of String [100];// Варіанти відповідей
REZ : Array [1..4]of Byte // Правильна відповідь
end;
Var FF_R : File of TTEST; // Рабочий файл тестів
KOL : Byte; // Кількість питань в тесті
KOL_N: Byte; // Поточний номер питання
TEST_: TTEST; // рядок запису файлу
REZ_N: Byte;// Кількість правильних відповідей
Для об’єкту Form2, перейдіть на вкладку Events Інспектора об’єктів
(Object Inspector), знайдіть подію OnActivate, справа від нього двічі клацніть
лівою кнопкою миші. Потрапивши в код програми, треба написати наступний
код:
procedure TForm2.FormActivate(Sender: TObject); Var I : Byte;
Begin
AssignFile(FF_R,'TEST_R.txt');
Reset(FF_R);
Read(FF_R,TEST_);
KOL:= FileSize(FF_R)-1;
KOL_N:=1;
24
REZ_N:=0;
Label1.Visible:=True;
RadioGroup1.Visible:=True;
Form2.Caption:=TEST_.TEXT;
Form2.Height:=420;
Form2.Width:=850;
Label3.Caption:='Всього питань - '+IntToStr(KOL); Label3.Top:=20;
Label3.Left:= 700;
Label3.Font.Size := 8;
Label4.Caption:='Правильних відповідей - '+IntToStr(REZ_N); Label4.Top:=40;
Label4.Left:= 700; Label4.Font.Size := 8;
Label4.Font.Color:=clBlack;
Button1.Caption:='Наступний';
Button1.Top:=350;
Button1.Left:=720;
Button1.Width:= 100;
Button1.Height:=30;
Read(FF_R,TEST_);
Label1.Caption:='Питання № '+IntToStr(KOL_N); Label1.Font.Style := [fsBold]; Label1.Font.Size := 11;
Label1.Height:=50;
Label1.Width:=400;
Label1.Left:=40;
Label1.Top:=70;
Label2.Caption:=TEST_.TEXT;
Label2.Font.Size := 12;
Label2.Height:=50;
Label2.Width:=500;
Label2.Left:=60;
Label2.Top:=100;
25
Label2.WordWrap := True;
Label2.AutoSize := False;
RadioGroup1.Top:=160;
RadioGroup1.Left:=60;
RadioGroup1.Width:= 750;
RadioGroup1.Height:= 150;
RadioGroup1.Font.Size:=11;
RadioGroup1.Caption:= ' Оберіть відповідь ';
RadioGroup1.Items.Clear;
For I:=1 to 4 do RadioGroup1.Items.Add(TEST_.OTV[I]); end;
Робота даної процедури починається з того, що відкривається робочий файл тестів TEST_R.txt і зчитується перший запис, який містить назву тесту.
За допомогою функції FileSize визначаємо кількість записів у файлі, а кількість питань буде на одиницю менше.
Далі налаштуємо компоненти Form2, Label3, Label4, Button1. Читаємо з робочого файлу тестів ще один запис - перше питання. Після цього налаштовуємо компоненти Label1, Label2, RadioGroup1. При описі компонента RadioGroup1 додамо RadioGroup1.Items.Clear;
Цей рядок дозволяє нам очистити список значень властивості Items
компоненти RadioGroup1, який формується в ході програми. Вживання методу
Clear нам необхідне при повторному тестуванні - очистити список від попередніх варіантів відповідей. В результаті форма виглядатиме так само як на рис.12.6
26

Рисунок 12.6
Створимо процедуру, яка обробляє ситуацію натиснення кнопки Button1. Для цього виділіть об'єкт Button1, перейдіть на вкладку Events Інспектора об'єктів (Object Inspector), знайдіть подію OnClick, праворуч від нього двічі клацнути лівою кнопкою миші. Попавши в код програми, треба написати наступний код:
Часть № 1
procedure TForm2.Button1Click(Sender: TObject); Var N, I :Byte;
OZENKA : Byte;
Begin
If Button1.Caption= 'Результат'
Then begin
OZENKA:=Round(REZ_N/KOL*5);
Button1.Caption:= 'Вихід';
Label1.Visible:=False;
RadioGroup1.Visible:=False;
Label2.Font.Size := 12;
Label2.Left:=250;
Label2.Top:=150;
27
Label2.Caption:='Кількість правильних відповідей - '+IntToStr(REZ N)+ ' з '+IntToStr(KOL);
Label3.Font.Size := 14;
Label3.Font.Style := [fsBold];
Label3.Left:=300;
Label3.Top:=200;
Label3.Caption:='Оцінка';
Label4.Font.Size := 14;
Label4.Left:=350;
Label4.Top:=200;
Case OZENKA of
1..2: Label4.Font.Color:=clPurple;
3:Label4.Font.Color:=clMaroon;
4:Label4.Font.Color:=clGreen;
5:Label4.Font.Color:=clNavy; end; Label4.Caption:=IntToStr(OZENKA); end
else
If Button1.Caption= 'Вихід' Then begin
Close; CloseFile(FF_R); end else begin
N:=RadioGroup1.ItemIndex+1; REZ_N:=REZ_N+ TEST_.REZ[N]; KOL_N:=KOL_N+1;
If KOL_N>KOL Then begin
Label4.Caption:='Правильних відповідей - '+IntToStr(REZ_N); Button1.Caption:= 'Результат' end
else begin
Label4.Caption:='Правильних відповідей - '+IntToStr(REZ_N); Read(FF_R,TEST_);
28

Label1.Caption:='Питання № '+IntToStr(KOL_N);
Label2.Caption:=TEST_.TEXT;
RadioGroup1.Items.Clear;
For I:=1 to 4 do RadioGroup1.Items.Add(TEST_.OTV[I]); end;
end;
end;
В ході програми кнопка Button1 може мати написи «Наступна», «Результат», «Вихід». Якщо кнопка має напис «Результат» і кликнули на ній, то в цьому випадку визначається значення змінної OZENKA по п'яти бальній системі залежно від кількості правильних відповідей Rez_n і загальної кількості питань
KOL. Потім встановлюється напис кнопки «Вихід», формується нове зображення форми, виводиться підсумкова оцінка, робляться невидимими компоненти Label1 і RadioGroup1 (тому в процедурі TForm2.FormActive
встановлюються компоненти видимими).
Якщо кнопка має напис «Вихід» і ви кликнули на ній, то в цьому випадку закривається робочий файл тестів і закривається форма. Якщо кнопка має напис «Наступний» і ви кликнули на ній, то в цьому випадку визначається яка була вибрана відповідь на питання, результат додається до змінної REZ_N.
Збільшує значення змінної KOL_N (номер поточного питання). Якщо новий поточний номер більше кількості питань, то змінюється напис на кнопці
(«Результат»), інакше переходимо до читання нового питання з робочого файлу тестів і формуємо виведення нового питання. Все, програма готова.
Залишилося лише її протестувати.
Завдання для самостійного виконання
Завдання
1Написати програму, яка здійснює конвертацію інформації з текстового файлу в типізований файл, для файлу з тестовими завданнями.
2Передбачити можливість вибору випадковим чином тестового завдання із загального списку завдань.
29

3Створити файл, в якому накопичується інформація про проходження тестування. Інформація, яка може знаходитися в ньому наступна: прізвище, ім'я, група, номер питання, номер відповіді учня, кількість правильних відповідей, кількість неправильних відповідей, час початку тестування, час закінчення тестування і т.п.
Контрольні питання
1.Який файл називають текстовим?
2.Що таке типізований файл?
3.Чим відрізняється нетипізований файл від типізованого?
4.Охарактеризуйте поняття поточного положення у файлі.
5.Який синтаксис оголошення файлу в програмі на мові Delphi?
6.Яку функцію виконують директиви компілятора {$I+}/{$I-}?
30