Розробка програми псіхотестірованія
Введення
Психологія - велика наука. Вона дозволяє дізнатися про людину ВСЕ. Для отримання
такої інформації використовуються психологічні тести - досліджуваному задаються
питання і пропонуються варіанти відповідей. Він вибирає той, який за змістом
ближче всіх до його думки. Наприкінці тесту відповіді аналізуються: кожному варіанту
присвоєно певну кількість балів; вони підраховуються і залежно від
загального рахунку виходить результат.
Такі методи психологічних досліджень застосовуються досить давно. Але в століття
комп'ютерів та загального доступу до них дедалі частіше для тестування стали
застосовуватися ЕОМ. Спеціалізована програма задає питання, приймає відповіді,
підраховує бали і видає результат. В Інтернеті є сайти, де все
бажаючі можуть дізнатися ступінь своєї впевненості в собі, агресивності,
організованості та багато іншого. Подібні програми існують і для локальних
ПК, не підключених до жодних мереж.
У цій роботі представлена система псіхотестірованія SuperPsy,
розроблена в системі програмування Borland Delphi. До неї входить три тести,
відповівши на які, людина отримує великі відомості про свій характер.
У системі тести не стаціонарні - можна створити файли з іншими тестами і
користуватися ними. Для створення файлів тестів є дві утілітние програми,
які також описані в роботі.
Програма має деякі елементи художнього оформлення, що важливо, якщо
врахувати спеціальність автора - ИПД.
1 Опис програми
У цій роботі представлена програма для псіхотестірованія, яка
містить три тести; вона створює психологічний портрет людини, відповів на
всі питання тестів.
Крім програми для тестування курсова робота містить у собі дві програми
для створення файлів тестів (усі тести, а також їх результати, які використовуються
програмою псіхотестірованія, містяться в окремих файлах, що спрощує
удосконалення системи тестування).
1 Внутрішня структура програми
Проект Delphi називається SuperPsy. Він містить три форми і один програмний
модуль, в якому описані основні користувацькі типи і змінні,
використовувані в програмі тестування, а також у програмах створення тестів. Всі
модулі програми наведено в табл. 1. 1.
Таблиця 1.1 Програмні модулі Delphi, складові программуІмя
модуляФормаФункціі, які виконує
MainfrmFrmMainЗдесь описано вікно програми, яке бачить користувач
відразу після її запуску. Розміщені процедури вибору потрібного тесту.
TestfrmFrmTestОкно тестування - вікно, на якому з'являються питання і
варіанти відповідей. У цьому модулі розміщені процедури завантаження тестів.
ResfrmFrmResЕто вікно служить для виведення результату тестування. Модуль не
містить важливих процедур.
TestTypesНетВ цьому модулі зібрані типи для опису тестів. Він однаковий для
всіх трьох програм пакета.
1. 1. 1 Зберігання інформації тесту
Для зберігання інформації тесту (тексти питань, варіанти відповідей і т. п.)
використовується для користувача тип TTest:
TTest = record
text: string [255]; (текст питання)
quest: array [1 .. 3] of string [100]; (варіанти)
count: array [1 .. 3] of byte; (очки за варіант)
end;
У такого запису зберігається одне питання. Весь тест міститься в масиві записів. При
збереженні тесту на диску використовується типізований файл цього типу.
Програма створення тестів - TestCreator теж використовує цей тип.
1. 2 Зберігання інформації для повернення результов тесту
Подібно до інформації про тести, інформація результатів теж зберігається в записах. Тип
називається TResult:
TResult = record
min, max: integer; (кількість балів)
text: array [1 .. 1000] of char; (текст результату)
end;
Подібно до питань, результати зберігаються в масивах; для збереження на диску
використовуються типізовані файли.
1. 3 Опис роботи програми
На формі frmMain розміщені кнопки SpeedButton, у яких властивість Flat
встановлено в "істину". Завдяки цьому вони прозорі. Написи, які
знаходяться на цих кнопках, насправді взяті з графічних файлів.
Натискання на будь-яку кнопку викликає відповідний обробник події, який, в
свою чергу, привласнює глобальної змінної testfilename: string, описаної в
модулі TestTypes, ім'я файлу тесту, а потім запускає процедуру RunTest,
показує форму frmTest.
Далі працюють процедури модуля цієї форми. Процедура Load, описана як
метод, завантажує з файлу тесту чергове запитання з варіантами. Оброблювач
події натиснення кнопки "Далі" перевіряє наявність ще питань у файлі і в разі
позитивної відповіді викликає Load, в іншому випадку - вантажить з файлу
результатів потрібний запис у Label1 форми виводу результатів frmRes. Після цього
ховає вікно тестування і показує результат.
Пристрій програм створення тестів і результатів не має потреби в описі.
1. 1. 4 Інструкція для користувача
Виконавчий файл програми називається SuperPsy.еxe. Запустивши його, користувач
побачить вікно, що запрошує вибрати потрібний тест. Це вікно показано на рис. 1. 1
Тут, на тлі неба як-б "висять" назви тестів. При русі курсору мишки
по кнопці, вона піднімається над загальним тлом, як показано на рис. 1.1 Клацнувши
лівою кнопкою миші, "тестовий вибирає що його цікавить, тест і потрапляє у вікно
тестування, показане на рис. 1. 2, стор 10. Щоб відповісти на питання,
достатньо клацнути на правильному з точки зору користувача варіанті відповіді
(при цьому всі варіанти тут-же заблокують і стане доступною кнопка "Далі").
Для переходу до наступного питання треба натиснути кнопку "Далі".
Малюнок 1. 2 - Вікно тестування
3 Створення тестів. Допоміжні програми
Як вже було сказано вище, в курсову роботу входять також дві утиліти - для
створення тестів і результатів до них. Перша називається TestCreator, а другий -
ResCreator, ТС і RC.
3. 1 Створення тесту
Програма ТЗ має єдине (якщо не вважати діалогових відкриття і
збереження файлу) вікно. Воно представлено на рис. 1. 3, стор 11.
Малюнок 1. 3 - Вікно програми ТЗ
При запуску замість тексту питання написана рядок "Текст питання", а замість
варіантів відповідей - "Варіант1 (2,3)". Мишкою можна вибирати "радіобаттон", а
потім вводити в поле "текст варіанту" потрібний варіант.
3. 2 Створення файлу результатів
Для цього призначена утілітная програма RC. (Result Creator). Після запуску
цієї програми виводиться вікно, представлене на рис. 1. 4, стор 12.
Малюнок 1. 4 - Вікно програми Result Creator
Як видно з рис. 1. 4, текст результату вводиться у вікні введення типу Memo. В
верхні спінедіти поміщається мінімальне та максимальне колічесіво очок,
які повинен набрати тестований, щоб висвітився саме цей варіант
результатів. Спінедіт "Варіант №" показує, над яким варіантом результату
ведеться робота. Кнопки "Зберегти" та "Завантажити" викликають стандартні діалогові
вікна Windows для, відповідно, збереження і завантаження файлу результатів.
Зберігаючи файл результатів, бажано давати йому розширення RTS.
2 Система меню
Середовище програмування Borland Delphi має два компоненти для створення меню:
TMainMenu і TPopupMenu. Вони роблять програмування меню додатків нескладної
завданням. У цій роботі будуть описані способи створення меню з обома
компонентами, а також представлені приклади програм.
2. 1 TMainMenu
Для того, щоб створити меню, помістіть компонент на форму, а потім клацніть по
нього два рази лівою кнопкою мишки. З'явиться спеціальне вікно для введення пунктів
меню, приклад якого представлений на рис. 2. 1.
Малюнок 2. 1 - Вікно для введення меню
На рис. 2.1 показано вікно для введення пунктів меню, а також частина інспектора
об'єктів з властивістю Caption, якому потрібно присвоїти рядок меню. Крім того,
можна змінити властивість Name.
2. 1. 1 Події
Щоб програма реагувала на вибір пункту меню, потрібно створити спеціальний
обробник події, який буде викликатися кожного разу після клацання мишки по
пункту або при натисканні клавіші "ENTER".
Вставити обробник події вибору меню можна кількома способами: подвійний
отримаєте по пункту на вікні редагування меню, на формі; можна, в крайньому випадку,
призначити подія на сторінці "Events" інспектора об'єктів.
2. 1. 2 Вкладені меню
Такі меню широко застосовуються у багатьох програмах Windows і не тільки. Вибираючи
пункт меню, користувач потрапляє в інше меню (як правило, розташоване
вертикально) і може вибирати там.
Після введення пункту горизонтального меню, воно приймає вигляд:
Малюнок 2. 2 - Приліплене меню
Тепер можна виділити мишкою пункт вкладеного меню і вводити його параметри, як
і для головного.
Підменю, в свою чергу, можна також призначати вкладені. Найзручніший
спосіб - натиснути правою кнопкою мишки івибрать з меню, що з'явилося пункт "Create
Submenu ".
Створювати вкладені меню Windows дозволяє до безкінечності (на практиці -
скільки вистачить пам'яті або поки не набридне).
2. 1. 3 Додаткові можливості
Замість звичайного виконання дії при виборі пункту меню, можна зробити так,
щоб він відзначався "пташкою" (Мал. 2. 4). У цьому випадку даний пункт діє
подібно до елементу інтерфейсу CheckBox. Щоб у програмі дізнатися, "включений" Чи
пункт, треба перевірити властивість Checked.
Малюнок 2. 4 - Меню, відзначене "пташкою"
У багатьох додатках також застосовується можливість закриття доступу до
певного пункту меню, ЯкщП в даний момент він не може виконається. Для
цього є властивість Enabled. Воно, як і Checked, має тип Boolean.
На рис. 2.4 видно, що пункт "Меню2" виділено жирним шрифтом. Це результат
установки ще одного логічного властивості об'єкта - Default.
Ще одна важлива можливість - вставка роздільної лінії. На рис. 2.5 (стор
16) вона розміщена між "Меню1" і "Меню2":
Цю "примочку" використовують в основному для отдленія різних типів дії,
викликається меню, наприклад, часто в меню "Файл" поміщають список декількох
відкривалися раніше файлів, відокремлений від решти меню такими лініями.
Чудовим прикладом використання розділових ліній також може служити меню
"Файл" програми Microsoft Word.
Однією із самих зручних можливостей системи меню є можливість
використання клавіш швидкого доступу, при одночасному натисканні клавіш Ctrl і Р
поточний документ отправлется на друк. І не потрібно відволікатися, витрачати час,
знімати руку з клавіатури ...
Розглянутий нами компонент TMainMenu також має можливість призначення
клавіш швидкого доступу. Для цього є властивість ShortCut.
У інспектора об'єктів воно має список, що розкривається, з якого можна вибрати
потрібну комбінацію клавіш.
Якщо комусь захочеться зробити вже дуже "круту" програму, тут йому допоможе
можливість вставки картинок.
2. 2 TPopupMenu
Це спливаюче меню, воно викликається натисканням правої кнопки миші. Як і
MainMenu, цей компонент слід помістити на форму, для редагування два рази
клацнути. У всьому, що стосується створення пунктів, цей компонент ідентичний
MainMenu. Ну, хіба що, одразу будується вертикальне меню.
Для того, щоб меню "спливало", потрібно у властивості PopupMenu форми вказати його
(меню) ім'я.
3 Приклад програми
Нижче будуть представлені приклади програм, що використовують такі компоненти, як
меню. Крім вихідного коду будуть ілюстрації.
Приклад являє собою нескладну програму, що дозволяє переглядати і
редагувати текстові файли. Вікно цієї програми показано на рис. 2. 8.
Малюнок 2. 8 - Вікно програми-прикладу
Нижче буде представлений лістинг програми:
unit Unit1;
(Головний модуль програми)
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus,
StdCtrls;
type
TForm1 = class (TForm)
MainMenu1: TMainMenu; (Головне меню)
N1: TMenuItem; (Меню "Файл")
N2: TMenuItem; (Меню "Відкрити")
N3: TMenuItem; (Меню "Зберегти")
N4: TMenuItem; (Меню "Вихід")
N5: TMenuItem; (Роздільна лінія)
N6: TMenuItem; (Меню "Допомога")
N7: TMenuItem; (Меню "Про програму")
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
PopupMenu1: TPopupMenu; (Спливаюче меню)
procedure N4Click (Sender: TObject);
procedure N7Click (Sender: TObject);
procedure N2Click (Sender: TObject);
procedure N3Click (Sender: TObject);
private
(Private declarations)
public
(Public declarations)
end;
var
Form1: TForm1;
implementation
uses Unit2;
($ R *. DFM)
procedure TForm1.N4Click (Sender: TObject);
begin
close;
end;
procedure TForm1.N7Click (Sender: TObject);
begin
aboutbox.show
end;
procedure TForm1.N2Click (Sender: TObject);
begin
if opendialog1.Execute then memo1.Lines.LoadFromFile (opendialog1.filename)
end;
procedure TForm1.N3Click (Sender: TObject);
begin
if savedialog1.Execute then memo1.Lines.SaveToFile (savedialog1.filename)
end;
end.
unit Unit2;
(Модуль, що описує вікно "Про програму")
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons,
ExtCtrls;
type
TAboutBox = class (TForm)
Panel1: TPanel;
ProgramIcon: T8529_;
ProductName: TLabel;
Comments: TLabel;
OKButton: TButton;
procedure OKButtonClick (Sender: TObject);
private
(Private declarations)
public
(Public declarations)
end;
var
AboutBox: TAboutBox;
implementation
($ R *. DFM)
procedure TAboutBox.OKButtonClick (Sender: TObject);
begin
Hide
end;
end.
Ця програма демонструє використання меню. Вона має головне меню і
спливаюче, яке з'являється при натисканні правої кнопки мишки. Меню забезпечені
клавішами швидкого доступу, використовується розділова лінія.
Меню "Відкрити", "Зберегти", "Вихід" і "Про програму" забезпечені клавішами швидкого
доступу. Спливаюче меню, що має два пункти - "Відкрити" і "Зберегти". При їх
натисканні викликаються події відповідних пунктів головного меню.
Висновки
У цій роботі розроблена система для псіхотестірованія на Borland
Delphi 5. 0. Крім основної програми, створені дві утілітние - для створення
тестів, які зберігаються в окремих файлах.
У процесі складання програми детально були вивчені основні об'єкти
графічного інтерфейсa Windows.
У процесі виконання другої частини курсової роботи були детально вивчені
компоненти, що дозволяють створювати систему меню. При розгляді цих
компонентів наведена програма-приклад.
Додаток А
Лістинг програми.
unit Mainfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, ExtCtrls, TestTypes;
type
TfrmMain = class (TForm)
8529_1: T8529_;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
8529_2: T8529_;
SpeedButton3: TSpeedButton;
procedure runtest;
procedure SpeedButton1Click (Sender: TObject);
procedure SpeedButton2Click (Sender: TObject);
procedure SpeedButton3Click (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
private
(Private declarations)
public
end;
var
frmMain: TfrmMain;
testcount: integer;
implementation
uses Testfrm;
($ R *. DFM)
procedure tfrmmain.runtest;
var f: file of ttest;
begin
frmmain.hide;
assignfile (f, testfilename);
try
reset (f);
except
showmessage ( 'Файл тесту не знайдений !');< br />
exit
end;
testnum: = 1;
while not eof (f) do begin
try
read (f, test [testnum]);
inc (testnum);
except
showmessage ( 'Помилка у файлі тесту');
frmmain.show;
exit
end
end;
closefile (f);
frmTest.show;
end;
procedure TfrmMain.SpeedButton1Click (Sender: TObject);
begin
testfilename: = 'Time.tst';
runtest
end;
procedure TfrmMain.SpeedButton2Click (Sender: TObject);
begin
testfilename: = 'Agress.tst';
runtest
end;
procedure TfrmMain.SpeedButton3Click (Sender: TObject);
begin
testfilename: = 'health.tst';
runtest
end;
procedure TfrmMain.FormClose (Sender: TObject; var Action: TCloseAction);
begin
if messagedlg ( 'Ви дійсно хочете вийти?', mtwarning, [mbyes, mbno], 0) = mrno
then action: = canone
end;
end.
unit Testfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Buttons, testtypes;
type
TfrmTest = class (TForm)
8529_1: T8529_;
rb1: TRadioButton;
rb2: TRadioButton;
rb3: TRadioButton;
Label1: TLabel;
SpeedButton1: TSpeedButton;
procedure load;
procedure rb1Click (Sender: TObject);
procedure rb2Click (Sender: TObject);
procedure rb3Click (Sender: TObject);
procedure FormActivate (Sender: TObject);
procedure SpeedButton1Click (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
private
(Private declarations)
public
defque: byte;
end;
var
frmTest: TfrmTest;
implementation
($ R *. DFM)
uses mainfrm, Resfrm;
procedure tfrmtest.load;
begin
label1.caption: = test [defque]. text;
rb1.Caption: = test [defque]. quest [1];
rb2.Caption: = test [defque]. quest [2];
rb3.Caption: = test [defque]. quest [3];
speedbutton1.enabled: = false;
rb1.Enabled: = true;
rb2.Enabled: = true;
rb3.Enabled: = true;
rb1.Checked: = false;
rb2.Checked: = false;
rb3.Checked: = false;
if rb3.caption =''then rb3.hide else rb3.Show
end;
procedure TfrmTest.FormActivate (Sender: TObject);
begin
testcount: = 0;
defque: = 1;
/> load
procedure TfrmTest.rb1Click (Sender: TObject);
begin
speedbutton1.Enabled: = true;
rb1.Enabled: = false;
rb2.Enabled: = false;
rb3.Enabled: = false;
inc (testcount, test [defque]. count [1])
end;
procedure TfrmTest.rb2Click (Sender: TObject);
begin
speedbutton1.Enabled: = true;
rb1.Enabled: = false;
rb2.Enabled: = false;
rb3.Enabled: = false;
inc (testcount, test [defque]. count [2])
end;
procedure TfrmTest.rb3Click (Sender: TObject);
begin
speedbutton1.Enabled: = true;
rb1.Enabled: = false;
rb2.Enabled: = false;
rb3.Enabled: = false;
inc (testcount, test [defque]. count [3])
end;
procedure TfrmTest.SpeedButton1Click (Sender: TObject);
var f: file of TResult;
r: tresult;
begin
inc (defque);
if defque = testnum then begin
assignfile (f, copy (testfilename, 1, length (testfilename) -3) + 'rts');
reset (f);
while not eof (f) do begin
read (f, r);
if testcount in [r.min .. r.max] then begin
frmres.label1.Caption: = r.text;
break
end
end;
closefile (f);
frmtest.hide;
frmres.show;
end;
/> load
procedure TfrmTest.FormClose (Sender: TObject; var Action: TCloseAction);
begin
frmmain.show;
action: = cahide
end;
end.
unit Resfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TfrmRes = class (TForm)
Label1: TLabel;
Button1: TButton;
procedure Button1Click (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
private
(Private declarations)
public
(Public declarations)
end;
var
frmRes: TfrmRes;
implementation
uses Mainfrm;
($ R *. DFM)
procedure TfrmRes.Button1Click (Sender: TObject);
begin
frmres.hide;
frmmain.show
end;
procedure TfrmRes.FormClose (Sender: TObject; var Action: TCloseAction);
begin
action: = cahide;
frmmain.show
end;
end.
unit TestTypes;
interface
type
TTest = record
text: string [255];
quest: array [1 .. 3] of string [100];
count: array [1 .. 3] of byte;
end;
var
testfilename: string;
test: array [1 .. 100] of ttest;
testnum: byte;
implementation
end.
Лістинг програми ТЗ:
unit Mainfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, TestTypes;
type
TfrmMain = class (TForm)
rb1: TRadioButton;
rb2: TRadioButton;
rb3: TRadioButton;
Edit1: TEdit;
Label1: TLabel;
SpinEdit1: TSpinEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
StaticText1: TStaticText;
Label5: TLabel;
SpinEdit2: TSpinEdit;
Button3: TButton;
procedure Button2Click (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure Edit1Change (Sender: TObject);
procedure Edit2Change (Sender: TObject);
procedure rb1Click (Sender: TObject);
procedure rb2Click (Sender: TObject);
procedure rb3Click (Sender: TObject);
procedure SpinEdit1Change (Sender: TObject);
procedure SpinEdit2Change (Sender: TObject);
procedure Button3Click (Sender: TObject);
private
(Private declarations)
public
variant: ^ tradiobutton;
nq: byte;
end;
var
frmMain: TfrmMain;
implementation
($ R *. DFM)
procedure TfrmMain.Button2Click (Sender: TObject);
var f: file of TTest;
i: byte;
begin
if savedialog1.execute then begin
assignfile (f, savedialog1.Filename);
rewrite (f);
for i: = 1 to testnum do write (f, test [i]);
closefile (f)
end
end;
procedure TfrmMain.Button1Click (Sender: TObject);
var f: file of ttest;
begin
if opendialog1.execute then begin
assignfile (f, opendialog1.Filename);
reset (f);
testnum: = 1;
while not eof (f) do begin
read (f, test [testnum]);
inc (testnum)
end;
statictext1.Caption: = 'Всього питань' + inttostr (testnum);
closefile (f);
spinedit1.value: = 1;
spinedit1change (sender)
end
end;
procedure TfrmMain.FormCreate (Sender: TObject); var i: byte;
begin
testnum: = 1;
variant: = @ rb1;
nq: = 1;
for i: = 1 to 100 do begin
test [i]. quest [1]: = 'Варіант1';
test [i]. quest [2]: = 'Варіант2';
test [i]. quest [3]: = 'Варіант3';
test [i]. count [1]: = 0;
test [i]. count [2]: = 0;
test [i]. count [3]: = 0;
test [i]. text: = 'Текст питання'
end;
end;
procedure TfrmMain.Edit1Change (Sender: TObject);
begin
label2.Caption: = edit1.Text;
test [spinedit1.value]. text: = edit1.text
end;
procedure TfrmMain.Edit2Change (Sender: TObject);
begin
variant ^. Caption: = edit2.Text;
test [spinedit1.value]. quest [nq]: = edit2.text
end;
procedure TfrmMain.rb1Click (Sender: TObject);
begin
variant: = @ rb1;
nq: = 1;
edit2.Text: = rb1.Caption;
spinedit2.Value: = test [spinedit1.Value]. count [1];
edit2.SetFocus
end;
procedure TfrmMain.rb2Click (Sender: TObject);
begin
variant: = @ rb2;
nq: = 2;
edit2.Text: = rb2.Caption;
spinedit2.Value: = test [spinedit1.Value]. count [2];
edit2.SetFocus
end;
procedure TfrmMain.rb3Click (Sender: TObject);
begin
variant: = @ rb3;
nq: = 3;
edit2.Text: = rb3.Caption;
spinedit2.Value: = test [spinedit1.Value]. count [3];
edit2.SetFocus
end;
procedure TfrmMain.SpinEdit1Change (Sender: TObject);
begin
if spinedit1.value> testnum then begin
inc (testnum);
statictext1.caption: = 'Всього питань' + inttostr (testnum)
end;
label2.Caption: = test [spinedit1.value]. text;
rb1.Caption: = test [spinedit1.value]. quest [1];
rb2.Caption: = test [spinedit1.value]. quest [2];
rb3.Caption: = test [spinedit1.value]. quest [3];
rb1.Checked: = true;
variant: = @ rb1;
edit1.Text: = test [spinedit1.value]. text;
edit2.text: = test [spinedit1.value]. quest [1];
edit2.setfocus
end;
procedure TfrmMain.SpinEdit2Change (Sender: TObject);
begin
test [spinedit1.value]. count [nq]: = spinedit2.value
end;
procedure TfrmMain.Button3Click (Sender: TObject);
var i: byte;
begin
if spinedit1.value = testnum then begin
dec (testnum);
spinedit1.value: = spinedit1.value-1;
exit
end;
if testnum = 1 then exit;
for i: = spinedit1.value to testnum-1 do test [i]: = test [i +1];
dec (testnum);
spinedit1change (sender);
statictext1.Caption: = 'Всього питань' + inttostr (testnum)
end;
end.
Лістинг програми RС:
unit Mainfrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
testtypes, StdCtrls, Spin;
type
TfrmMain = class (TForm)
Memo1: TMemo;
SpinEdit1: TSpinEdit;
Label1: TLabel;
SpinEdit2: TSpinEdit;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
SpinEdit3: TSpinEdit;
Label3: TLabel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure SpinEdit1Change (Sender: TObject);
procedure SpinEdit2Change (Sender: TObject);
procedure Memo1Change (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure SpinEdit3Change (Sender: TObject);
private
(Private declarations)
public
res: array [1 .. 100] of tresult;
varnum: byte;
no: boolean;
end;
var
frmMain: TfrmMain;
implementation
($ R *. DFM)
procedure TfrmMain.Button1Click (Sender: TObject);
var f: file of tresult;
i: byte;
begin
if savedialog1.execute then begin
assignfile (f, savedialog1.filename);
rewrite (f);
for i: = 1 to varnum-1 do write (f, res [i]);
closefile (f)
end
end;
procedure TfrmMain.Button2Click (Sender: TObject);
var f: file of tresult;
begin
if opendialog1.execute then begin
assignfile (f, opendialog1.filename);
reset (f);
varnum: = 1;
while not eof (f) do begin
read (f, res [varnum]);
inc (varnum)
end;
memo1.text: = res [1]. text;
spinedit1.value: = res [1]. min;
spinedit2.value: = res [1]. max;
spinedit3.value: = 1;
closefile (f)
end
end;
procedure TfrmMain.SpinEdit1Change (Sender: TObject);
begin
if no then exit;
res [spinedit3.value]. min: = spinedit1.value;
if spinedit2.value
end;
procedure TfrmMain.SpinEdit2Change (Sender: TObject);
begin
if no then exit;
res [spinedit3.value]. max: = spinedit2.value;
end;
procedure TfrmMain.Memo1Change (Sender: TObject);
var i: integer;
begin
if not no then for i: = 1 to length (memo1.text) do
res [spinedit3.value]. text [i]: = memo1.text [i]
end;
procedure TfrmMain.FormCreate (Sender: TObject);
begin
varnum: = 1;
no: = false
end;
procedure TfrmMain.SpinEdit3Change (Sender: TObject);
begin
no: = true;
if varnum
memo1.text: = res [spinedit3.value]. text;
spinedit1.value: = res [spinedit3.value]. min;
spinedit2.value: = res [spinedit3.value]. max;
no: = false;
memo1.SetFocus
end;
end.