Как создать тест в делфи 7 пошаговая инструкция с записью результатов

Сейчас подготовил серию уроков по созданию тестов на Delphi. Эта тема сейчас очень распространненая, так как много кто пишет курсовые по этим темам, дипломные и многое другое. Тех же самых сотрудников можно протестировать, так что эта тема очень распространненая. Предлагаю серию тестов с использованием файлов. Да с использованием БД — это хорошо, но если БД локальная, то дела все теже, что и с файлами. С БД я даже рассказывать не буду как делать, там вообще все просто, тем более я рассказал курс по работе с БД в Delphi. Так вот рассмотрим создание тестов используя два варианта. С использованием обычных файлов — dat, db или любой другой свой формат, а также с использованием ini-файлов. Скажу одно, что с использованием ini-файлов необходимо шифрование данных, я про него еще не рассказывал, но все как-нибудь доберусь. Шифрование нужно хотя бы для, того, чтобы пользователь, открыв файл не узнал правильный ответ, в dat-файле например, это можно кое-как скрыть и без шифрование, так что давайте попробуем для начала добавить данные в файл. То есть добавить (создать) наш тест. Для начала нам необходимо описать структуру, где будет храниться наш тест, а затем создать файл данной структуры.
Моя структура выглядит так

Type
TTest=record
Name_v:String[255];
otv:string[255];
count_v:integer;
count_otv:integer;
pr_ot:string[255];
end;

Здесь у меня

  • Name_v — вопрос
  • otv — ответ
  • count_v — количество вопросов
  • count_otv — количество ответов
  • pr_ot — правильные ответы

Далее мы описываем файл данной стуктуры, затем саму стуктуру и начинаем запись. Я про файлы не рассказывал (а надо было, займусь этим попозже), тут есть набор функций и процедур по работе с файлами. На событие формы — OnCreate мы создаем наш файл тестов

procedure TForm1.FormCreate(Sender: TObject);
var
F:File of TTest;
begin
try
count:=0;
AssignFile(F,'test.dat');
Rewrite(F);
except
on e:Exception do
end;
end;

Функции и процедуры по работе с файлами я расскажу потом, а сейчас менее подробно. Например AssignFile — связывает файловую переменную с именем файла. Rewrite — создает новый файл, Reset — открывае уже существующий файл, Seek — устанавливает указатель в файле на нужную компоненты (она нам очень пригодится). Также на форму я установил следующие компоненты

  • TButton — 2 шт
  • TEdit — 2 шт
  • TCheckListBox
  • TGroupBox

То есть у нас будут сколько угодно вариантов ответа и сколько угодно правильных ответов. Далее на кнопку добавления ответов в TChecklistBox я написал следующий код.

procedure TForm1.Button4Click(Sender: TObject);
begin
try
CheckListBox1.Items.Add(Edit2.Text);
Edit2.Clear;
except
on e:Exception do
end;
end;

То есть мы просто формируем наши ответы. Как Вам понятно у нас всего 3 вопроса, я первоначально нашей переменной присвоил это значение, может быть и меньше, но никаки больше. Далее я на кнопку записи вопроса в файл написал следующий код

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
F:File of TTest;
Test:TTest;
count,k:integer;
arr_pr_ot:array[1..255] of string;
begin
try
if (Trim(Edit1.Text)='') or (CheckListBox1.Count=0) then
begin
exit;
end;
inc(count);
Test.count_v:=3;
Test.count_otv:=CheckListBox1.Items.Count;
for i:=0 to CheckListBox1.Count-1 do
begin
Test.Name_v:=Edit1.Text;
if CheckListBox1.Checked[i] then
Test.pr_ot:=IntToStr(CheckListBox1.ItemIndex);
Test.otv:=CheckListBox1.Items[i];
Write(F,Test);
end;
if count=Test.count_v then
begin
ShowMessage('Test create compleate');
CloseFile(F);
count:=0;
end;
CheckListBox1.Clear;
Edit1.Clear;
except
on e:Exception do
end;
end;

Как видите мы просто записываем в цикле наши оветы с вопросами, с количеством, то есть в одной строке все. В следующей статья я расскажу как считать из файла все эти вопросы, а затем поговорим как определить правильный ли вопрос выбрал пользователь или нет. Проект пока что не прилаживаю, так как выложу его в конечном итоге.

Лучший ответ Сообщение было отмечено как решение

Решение

можно например вот такой тест написать здесь можно создавать сколько угодно файлов с вопросами и 1000 вопросов в файле.

исходники

Unit1

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls,ZapisVFile,Registry;
 
type
 
//Объявляем тип запись для записи туда вопросов
   TVoprosi=record
     Vopros,VariantOtveta1,VariantOtveta2:String[255];
     VariantOtveta3,VariantOtveta4:string[255];
     VariantOtveta5,VariantOtveta6:string[255];
     PoleViborOtveta1,PoleViborOtveta2,PoleViborOtveta3:string[10];
     PoleViborOtveta4,PoleViborOtveta5,PoleViborOtveta6:string[10];
     colichestvo:integer;
     NomerVoprosa:string[6];
    end;//конец объявления записи
 
TForm1 = class(TForm)
    Memo2: TMemo;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Image1: TImage;
    Button5: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
    //объявляем двумерный масив с элементами типа запись Voprosi
    MasVoprosov:array[1..1000]of TVoprosi;
     //объявляем двумерный масив с элементами типа запись Voprosi
    MasVoprosovP:array[1..1000]of TVoprosi;
 
    //объявляем двумерный масив с элементами типа запись VoprosiP
    MasOtvetovP:array[1..1000]of TVoprosi;
    //объявляем двумерный масив с элементами типа запись VoprosiP
    MasVoprosovBazi:array[1..1000]of TVoprosi;
    //объявляем массив номеров вопросов
    MasNomerovVoprosov:array[1..1000]of integer;
    Zap:TVoprosi;
    f:textfile;//объявляем переменную текстовый файл
  //создаем глобальные переменные
//создаем переменную типа запись
//создаем переменную типа массив записей
 
//обявляем переменную контроля числа записей
I,i1,i2,i3,i4,i5,i6,i7,n1,n,colVop,r,k1,k2,ik1,ik,ik2,oshibki,colichestvo1,ColVopPol:integer;
//обявляем переменную для выбора схемы вывода на экран  вопросов
 
 
 
 
implementation
 
  uses Unit2, Unit3, Unit4, Unit5, Unit6, Unit7;
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Edit1.Text=''then ShowMessage('не выбрана база данных')else
  begin
   //переменным контроля символов в редакторе ввода вопросов присваиваем значения
   i1:=255;
   i2:=255;
   i3:=255;
   i4:=255;
   i5:=255;
   i6:=255;
   i7:=255;
   // обновляем значения лейбелов
   form2.Label6.caption:=intTostr(i1);
   form2.Label7.caption:=intTostr(i2);
   form2.Label8.caption:=intTostr(i3);
   form2.Label9.caption:=intTostr(i4);
   form2.Label10.caption:=intTostr(i5);
   form2.Label11.caption:=intTostr(i6);
   form2.Label12.caption:=intTostr(i7);
   //открываем форму редактора вопросов
   Form2.Show;
 
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin //кнопка открытия формы выбора вопросов
 if Edit1.Text=''then ShowMessage('не выбрана база данных')else
  begin
  //считываем количество вопросов из файла
  AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
  {$i-}
  reset(f);//открываем файл только для чтения
  {$i+}
  if ioresult<>0 then
   begin
    ShowMessage('файл "'+Edit1.Text+'Baza.KV  не найден');
   end
   else
   begin
    read(f,ColVop);
    closefile(f);
    form5.edit1.Text:=IntToStr(ColVop);//записываем значение числа вопросов в эдит1
    form5.Showmodal;
   end;
 end;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
FORM1.Close;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
// если текущая база не выбрана то вывести сообщение
if Form1.Edit1.Text='' then
 begin
 ShowMessage('вы не подключили базу вопросов,нет текущей базы');
 Form4.Close;
 end
 else
 begin
  //считываем количество вопросов из файла
  AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
  {$i-}
  reset(f);//открываем файл только для чтения
  {$i+}
  if ioresult<>0 then
   begin
    ShowMessage('файл "'+Edit1.Text+'Baza.KV  не найден');
   end
   else
   begin
    read(f,ColVop);
    closefile(f);
    FORM4.ShowModal;
   end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Form7.Show;
end;
 
procedure TForm1.FormShow(Sender: TObject);
var reg:TRegistry;
begin
//при показе формы считываем из реестра имя файла текущей базы
// создаем объект реестр
reg:=Tregistry.Create;
// выбираем базовый ключ
reg.RootKey:=HKEY_CURRENT_USER;
//открываем подключ реестра без его создания
reg.OpenKey('CurrentBase',False);
Edit1.Text:=reg.ReadString('CurrentBase');
reg.CloseKey;
reg.Free;
// записываем в поле Текущая база имя текущей базы
Form1.Edit1.Text:=Form7.Label4.Caption;
Form2.Edit3.Text:=Form7.Label4.Caption;
Form3.Edit5.Text:=Form7.Label4.Caption;
Form4.Edit4.Text:=Form7.Label4.Caption;
end;
 
end.

Добавлено через 2 минуты
Unit2

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
 
type
  TForm2 = class(TForm)
    PoleVopros: TMemo;
    PoleVariantOtveta1: TMemo;
    PoleVariantOtveta2: TMemo;
    PoleVariantOtveta3: TMemo;
    PoleVariantOtveta4: TMemo;
    PoleVariantOtveta5: TMemo;
    PoleVariantOtveta6: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    Label3: TLabel;
    Edit1: TEdit;
    Label4: TLabel;
    Edit2: TEdit;
    BitBtn3: TBitBtn;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Edit3: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure PoleVoprosKeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta1KeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta2KeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta3KeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta4KeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta5KeyPress(Sender: TObject; var Key: Char);
    procedure PoleVariantOtveta6KeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
  h:integer;
 
implementation
 
uses Unit1, Unit3, Unit4, Unit5,ZapisVFile, Unit6, Unit7;
 
{$R *.dfm}
 
procedure TForm2.BitBtn1Click(Sender: TObject);
var kol:integer;// переменная которая считает кол-во варинтов ответов
begin //кнопка 'сохранить'
 
//пред проверки на ошибки
//если не заполнено поле вопрос
 if  (PoleVopros.Text='')then
  begin
   //вывести сообщение об ошибке
   showmessage('вы не заполнили поле "Вопрос"!');
  end
  else
  if ((PoleVariantOtveta2.Text='')and(CheckBox2.Checked=true))then
       showmessage('не может пустое поле быть правильным ответом')
  else
     if ((PoleVariantOtveta3.Text='')and(CheckBox3.Checked=true))then
       showmessage('не может пустое поле быть правильным ответом')
 
  else
      if ((PoleVariantOtveta4.text='')and(CheckBox4.Checked=true))then
       showmessage('не может пустое поле быть правильным ответом')
  else
     if ((PoleVariantOtveta5.Text='')and(CheckBox5.Checked=true))then
       showmessage('не может пустое поле быть правильным ответом')
  else
     if ((PoleVariantOtveta6.Text='')and(CheckBox6.Checked=true))then
       showmessage('не может пустое поле быть правильным ответом')
  else
 
 if(poleVariantOtveta1.text='')or (poleVariantOtveta2.Text='')then
  begin
   //вывести сообщение об ошибке
   showmessage('вы не заполнили поля хотя бы  "двух вариантов ответа"идущих по порядку');
  end
 else
  if  ((PoleVopros.Text<>'')and (poleVariantOtveta1.text<>'')and (poleVariantOtveta2.Text<>'')and
      (checkBox1.Checked=false) and (checkBox2.Checked=false))and(checkBox3.Checked=false) and
      (checkBox4.Checked=false)and(checkBox5.Checked=false) and(checkBox6.Checked=false)
    then
    begin
    //вывести сообщение об ошибке
    showmessage('вы не заполнили поля выбора правильного ответа "');
    end
  else
    if ((PoleVariantOtveta1.Text='')and(CheckBox1.Checked=true))then
      showmessage('не может пустое поле быть правильным ответом')
  else
 
      begin
        //вызываем процедуру записи  в файл из модуля ZapisVfile
        // записываем содержимое поля вопрос в файл
        ZapisiVFile(poleVopros.Text);
        //записываем варианты ответов в файл
        ZapisiVfile(poleVariantOtveta1.Text);
        ZapisiVfile(poleVariantOtveta2.Text);
        ZapisiVfile(poleVariantOtveta3.Text);
        ZapisiVfile(poleVariantOtveta4.Text);
        ZapisiVfile(poleVariantOtveta5.Text);
        ZapisiVfile(poleVariantOtveta6.Text);
       //записываем в файл варианты правильных  ответов
       if checkBox1.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
       if checkBox2.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
       if checkBox3.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
       if checkBox4.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
       if checkBox5.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
       if checkBox6.Checked=true then ZapisiVfile('true')
       else ZapisiVfile('false');
         //записываем регистрационный номер вопроса
         if edit2.text='0' then ZapisiVfile('1')else ZapisiVfile(edit2.Text);
       //очищаем поля ввода текста
       poleVopros.Text:='';
       poleVariantOtveta1.Text:='';
       poleVariantOtveta2.Text:='';
       poleVariantOtveta3.Text:='';
       poleVariantOtveta4.Text:='';
       poleVariantOtveta5.Text:='';
       poleVariantOtveta6.Text:='';
       //очищаем чекеты
        checkBox1.Checked:=false;
        checkBox2.Checked:=false;
        checkBox3.Checked:=false;
        checkBox4.Checked:=false;
        checkBox5.Checked:=false;
        checkBox6.Checked:=false;
 
        //обновляем значения в эдитах
        AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
        reset(f);
        read(f,colVop);
        closefile(f);
          //увеличиваем переменную кол-во вопросов на 1
        ColVop:=ColVop+1;
        form2.Edit1.Text:=InttoStr(ColVop);//обновляем кол-во вопросов в базе
        form2.Edit2.Text:=InttoStr(ColVop+1);//обновляем поле ваш вопрос под номером
 
        //запоминаем в файл значение кол-ва вопросов
        AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
        rewrite(f);//открываем файл для перезаписи
        write(f,ColVop);//записываем в файл значение кол-ва вопросов
        closefile(f);// закрываем файл
        //востанавливаем значение ограничителей текста
         i1:=255;
         i2:=255;
         i3:=255;
         i4:=255;
         i5:=255;
         i6:=255;
         i7:=255;
         //обновляем значения в ограничителях текста
         form2.Label6.caption:=intTostr(i1);
         form2.Label7.caption:=intTostr(i2);
         form2.Label8.caption:=intTostr(i3);
         form2.Label9.caption:=intTostr(i4);
         form2.Label10.caption:=intTostr(i5);
         form2.Label11.caption:=intTostr(i6);
         form2.Label12.caption:=intTostr(i7);
        //выводим сообщение что все сохранено
       showmessage('ваш вопрос и варианты ответа к нему сохранены успешно');
      end;
end;
 
 
 
procedure TForm2.BitBtn3Click(Sender: TObject);
begin//кнопка очистить
//возвращаем значения в лейбелах показ-х кол-во символов
i1:=255;
i2:=255;
i3:=255;
i4:=255;
i5:=255;
i6:=255;
i7:=255;
form2.Label6.caption:=intTostr(i1);
form2.Label7.caption:=intTostr(i2);
form2.Label8.caption:=intTostr(i3);
form2.Label9.caption:=intTostr(i4);
form2.Label10.caption:=intTostr(i5);
form2.Label11.caption:=intTostr(i6);
form2.Label12.caption:=intTostr(i7);
 // очищаем все поля "варианты ответов" и "вопрос"
 
PoleVopros.Text:='';
PoleVariantOtveta1.Text:='';
PoleVariantOtveta2.Text:='';
PoleVariantOtveta3.Text:='';
PoleVariantOtveta4.Text:='';
PoleVariantOtveta5.Text:='';
PoleVariantOtveta6.Text:='';
//приводим в исходное состояние поля выбора ответов
checkBox1.Checked:=false;
checkBox2.Checked:=false;
checkBox3.Checked:=false;
checkBox4.Checked:=false;
checkBox5.Checked:=false;
checkBox6.Checked:=false;
 
end;
 
procedure TForm2.BitBtn2Click(Sender: TObject);
 var rez:Tmodalresult;
begin //кнопка вернутся в главное меню
 if (PoleVopros.Text<>'')and(PoleVariantOtveta1.Text<>'')then
      begin
       rez:=messagedlg('Вы не сохранили вопрос вы уверены что хотите выйти?',mtCustom,[mbYES,mbNo],0);
       if (rez=mryes)then
         begin
           form2.Close;
           form1.Show;
             // очищаем все поля "варианты ответов" и "вопрос"
 
           PoleVopros.Text:='';
           PoleVariantOtveta1.Text:='';
           PoleVariantOtveta2.Text:='';
           PoleVariantOtveta3.Text:='';
           PoleVariantOtveta4.Text:='';
           PoleVariantOtveta5.Text:='';
           PoleVariantOtveta6.Text:='';
            //приводим в исходное состояние поля выбора ответов
           checkBox1.Checked:=false;
           checkBox2.Checked:=false;
           checkBox3.Checked:=false;
           checkBox4.Checked:=false;
           checkBox5.Checked:=false;
           checkBox6.Checked:=false;
         end;
      end
   else
     begin
       // очищаем все поля "варианты ответов" и "вопрос"
 
PoleVopros.Text:='';
PoleVariantOtveta1.Text:='';
PoleVariantOtveta2.Text:='';
PoleVariantOtveta3.Text:='';
PoleVariantOtveta4.Text:='';
PoleVariantOtveta5.Text:='';
PoleVariantOtveta6.Text:='';
//приводим в исходное состояние поля выбора ответов
checkBox1.Checked:=false;
checkBox2.Checked:=false;
checkBox3.Checked:=false;
checkBox4.Checked:=false;
checkBox5.Checked:=false;
checkBox6.Checked:=false;
      form2.Close;
      form1.Show;
     end
 
end;
procedure TForm2.PoleVoprosKeyPress(Sender: TObject; var Key: Char);
begin
if (key=#8)then
   begin
    if(i1=255)then begin end
   else
   begin
   i1:=i1+1;
   label6.Caption:=inttostr(i1);
 end;
 end
 else
if (i1=0)then//если кол- во символов исчерпано ничего не выводить
 
 begin
   key:=#0;
   label6.Caption:=inttostr(i1);
 end
 else // иначе показать
 
  begin
  label6.Caption:=inttostr(i1);
  i1:=i1-1;
  label6.Caption:=inttostr(i1);
   end;
end;
 
procedure TForm2.PoleVariantOtveta1KeyPress(Sender: TObject;
  var Key: Char);
begin
 if (key=#8)then
   begin
   if(i2=255)then
    begin
 
     end
   else
  begin
   i2:=i2+1;
   label7.Caption:=inttostr(i2);
 end;
 end
 else
 
 if (i2=0)then
 
 begin
   key:=#0;
   label7.Caption:=inttostr(i2);
 end
 else
 
  begin
  label7.Caption:=inttostr(i2);
  i2:=i2-1;
  label7.Caption:=inttostr(i2);
   end;
end;
 
procedure TForm2.PoleVariantOtveta2KeyPress(Sender: TObject;
  var Key: Char);
begin
 if (key=#8)then
  begin
   if(i3=255)then
    begin
 
    end
       else
     begin
       i3:=i3+1;
       label8.Caption:=inttostr(i3);
     end;
 end
 else
 
 if (i3=0)then
 
 begin
   key:=#0;
   label8.Caption:=inttostr(i3);
 end
 else
 
  begin
  label8.Caption:=inttostr(i3);
  i3:=i3-1;
  label8.Caption:=inttostr(i3);
   end;
end;
 
procedure TForm2.PoleVariantOtveta3KeyPress(Sender: TObject;
  var Key: Char);
begin
 if (key=#8)then
   begin
    if (i4=255)then
     begin
     end
    else
    begin
 
 i4:=i4+1;
 label9.Caption:=inttostr(i4);
 end;
 end
 else
if (i4=0)then
 
 begin
   key:=#0;
   label9.Caption:=inttostr(i4);
 end
 else
 
  begin
  label9.Caption:=inttostr(i4);
  i4:=i4-1;
  label9.Caption:=inttostr(i4);
   end;
end;
 
procedure TForm2.PoleVariantOtveta4KeyPress(Sender: TObject;
  var Key: Char);
begin
if (key=#8)then
   begin
   if (i5=255)then
    begin
    end
   else
   begin
    i5:=i5+1;
    label10.Caption:=inttostr(i5);
 end;
 end
 
 else
 if (i5=0)then
 
 begin
   key:=#0;
   label10.Caption:=inttostr(i5);
 end
 else
 
  begin
  label10.Caption:=inttostr(i5);
  i5:=i5-1;
    label10.Caption:=inttostr(i5);
   end;
end;
 
procedure TForm2.PoleVariantOtveta5KeyPress(Sender: TObject;
  var Key: Char);
begin
 if (key=#8)then
  begin
  if (i6=255)then
  begin
  end
  else
  begin
   i6:=i6+1;
   label11.Caption:=inttostr(i6);
  end;
 end
 else
 if (i6=0)then
 
 begin
   key:=#0;
   label11.Caption:=inttostr(i6);
 end
 else
 
  begin
  label11.Caption:=inttostr(i6);
  i6:=i6-1;
  label11.Caption:=inttostr(i6);
   end;
end;
 
procedure TForm2.PoleVariantOtveta6KeyPress(Sender: TObject;
  var Key: Char);
begin
 if (key=#8)then
  begin
  if (i7=255)then
  begin end
  else
  begin
    i7:=i7+1;
    label12.Caption:=inttostr(i7);
 end;
 end
 else
 if (i7=0)then
 
 begin
   key:=#0;
   label12.Caption:=inttostr(i7);
 end
 else
 
  begin
  label12.Caption:=inttostr(i7);
  i7:=i7-1;
  label12.Caption:=inttostr(i7);
   end;
end;
 
procedure TForm2.FormShow(Sender: TObject);
begin
// при показе формы 2
//считываем количество вопросов из файла
  //узнаем количество вопросов в базе переменная ColVop
  //открываем файл кол-во вопросов для чтения
 if Form1.Edit1.Text=''then ShowMessage('не выбрана база данных')else
  begin
  //считываем количество вопросов из файла
  AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
  {$i-}
  reset(f);//открываем файл только для чтения
  {$i+}
  if ioresult<>0 then
   begin
    ShowMessage('файл "'+Edit1.Text+'Baza.KV  не найден');
   end
   else
   begin
    read(f,ColVop);
    closefile(f);
    form2.edit1.Text:=IntToStr(ColVop);//записываем значение числа вопросов в эдит1
     form2.edit2.Text:=IntToStr(ColVop+1);//записываем значение числа вопросов в эдит1
   end;
 end;
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
 
end;
 
end.

Добавлено через 1 минуту
Unit3

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
unit Unit3;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls;
 
type
  TForm3 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    PoleVopros: TMemo;
    BitBtn2: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    BitBtn3: TBitBtn;
    Label5: TLabel;
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    PoleVariantOtveta1: TMemo;
    CheckBox1: TCheckBox;
    Panel2: TPanel;
    PoleVariantOtveta2: TMemo;
    CheckBox2: TCheckBox;
    Panel3: TPanel;
    PoleVariantOtveta3: TMemo;
    CheckBox3: TCheckBox;
    Panel4: TPanel;
    PoleVariantOtveta4: TMemo;
    CheckBox4: TCheckBox;
    Panel5: TPanel;
    PoleVariantOtveta5: TMemo;
    CheckBox5: TCheckBox;
    Panel6: TPanel;
    PoleVariantOtveta6: TMemo;
    CheckBox6: TCheckBox;
    Label6: TLabel;
    Edit3: TEdit;
    Button3: TButton;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label13: TLabel;
    Edit5: TEdit;
    procedure BitBtn2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form3: TForm3;
  col:integer;
  colichestvo:integer;
implementation
 
uses Unit1, Unit2, Unit4, Unit5, Unit6, ZapisVFile;
 
{$R *.dfm}
 
procedure TForm3.BitBtn2Click(Sender: TObject);
begin
//Вынуждено заканчиваем тестирование
//If (Button1.Enabled=False) And (Button2.Enabled=True) then
//Message('Вы не прошли тестирование до конца вы уверены что хотите выйти?',);
 
// очищаем поле кол-во вариантов ответа
Label7.Caption:='';
Edit1.Text:='';
Edit2.Text:='';
form3.Close;
form1.Show;
end;
 
procedure TForm3.Button1Click(Sender: TObject);
Label m1;
var k,i,KNV:integer;//объявляем локальную переменную для посчета вопросов
 
begin //// кнопка 'начать тестирование'////
 
//какая форма вывода
   Bitbtn3.Enabled:=True;
   //узнаем количество вопросов в базе переменная ColVop
  //открываем файл кол-во вопросов для чтения
  AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
  {$i-}
  reset(f);
  {$i+}
  if ioresult<>0 then
  begin
  showmessage('не найден файл "'+Form1.Edit1.Text+'.Baza'+'.KV'+'" процесс остановлен')
  end
  else
  begin
   Read(f,ColVop);
   CloseFile(f);
 
  end;
  //записав в переменную ColVop значение закрываем файл
  //записываем в массив вопросы из файла
  AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza');
  {$i-}
  Reset(f);
  if ioresult<>0 then
     begin
      ShowMessage('не найден файл " '+Form1.Edit1.Text+' ".Baza');
 
      end
     {$i+}
     else
     begin
for k:=1to ColVop do
  begin
   readln(f,masVoprosov[k].Vopros);
   readln(f,masVoprosov[k].VariantOtveta1);
   readln(f,masVoprosov[k].VariantOtveta2);
   readln(f,masVoprosov[k].VariantOtveta3);
   readln(f,masVoprosov[k].VariantOtveta4);
   readln(f,masVoprosov[k].VariantOtveta5);
   readln(f,masVoprosov[k].VariantOtveta6);
   readln(f,masVoprosov[k].PoleViborOtveta1);
   readln(f,masVoprosov[k].PoleViborOtveta2);
   readln(f,masVoprosov[k].PoleViborOtveta3);
   readln(f,masVoprosov[k].PoleViborOtveta4);
   readln(f,masVoprosov[k].PoleViborOtveta5);
   readln(f,masVoprosov[k].PoleViborOtveta6);
   readln(f,MasVoprosov[k].NomerVoprosa);
  end;
closefile(f);
//выбираем случайным образом вопросы из массива вопросов в массив пользователя
 
 //обнуляем массив номеров вопросов в цикле
    for KNV:= 1 to ColVopPol do
      MasNomerovVoprosov[KNV]:=0;
for k:=1 to ColVopPol do
   begin
 
      //выбираем случайный номер вопроса из базы
      m1:i:=random(ColVop)+1;
      // проверяем был ли в этой сесии уже номер вопроса
      // сгенерированый функцией рандом
      for KNV:= 1 to ColVopPol do
       if MasNomerovVoprosov[KNV]=i then goto m1;
         //записываем в массив текущий номер вопроса
         MasNomerovVoprosov[k]:=i;
         masVoprosovP[k]:=masVoprosov[i];
   end;
 
 
 
k:=1;//первоначальное присваивание
// востонавливаем положение панелей
                  panel1.Top:=184;
                  panel2.Top:=264;
                  panel3.Top:=344;
                  panel4.Top:=424;
                  panel5.Top:=504;
                  panel6.Top:=584;
 //делаем все панели видимыми
 panel1.Visible:=True;
 panel2.Visible:=True;
 panel3.Visible:=True;
 panel4.Visible:=True;
 panel5.Visible:=True;
 panel6.Visible:=True;
//выводим текст в поля вывода без всяких форм вывода
poleVopros.Text:=masVoprosovP[k].Vopros;
poleVariantOtveta1.Text:=masVoprosovP[k].VariantOtveta1;
poleVariantOtveta2.Text:=masVoprosovP[k].VariantOtveta2;
poleVariantOtveta3.Text:=masVoprosovP[k].VariantOtveta3;
poleVariantOtveta4.Text:=masVoprosovP[k].VariantOtveta4;
poleVariantOtveta5.Text:=masVoprosovP[k].VariantOtveta5;
poleVariantOtveta6.Text:=masVoprosovP[k].VariantOtveta6;
// выводим в эдит номер вопроса
edit2.Text:=InttoStr(k);
// выводим в эдит регистрационный номер
edit3.Text:=masVoprosovP[k].NomerVoprosa;
   //переменной кол-во присваиваем первоначально 0
      col:=0;
      // Считаем кол-во правильных ответов
      if masVoprosovP[k].PoleViborOtveta1='true'  then Col:=Col+1;
      if masVoprosovP[k].PoleViborOtveta2='true'  then Col:=Col+1;
      if masVoprosovP[k].PoleViborOtveta3='true'  then Col:=Col+1;
      if masVoprosovP[k].PoleViborOtveta4='true'  then Col:=Col+1;
      if masVoprosovP[k].PoleViborOtveta5='true'  then Col:=Col+1;
      if masVoprosovP[k].PoleViborOtveta6='true'  then Col:=Col+1;
      // выводим кол-во правильных ответов
       Label7.Caption:=IntToStr(col);
         // обнуляем переменную перед её использованием
      Colichestvo:=0;
      // считаем кол-во вариантов ответа всего
     if masVoprosovP[k].VariantOtveta1<>'' then
     begin
     panel1.Visible:=true
     end
      else  panel1.Visible:=False;
     if masVoprosovP[k].VariantOtveta2<>'' then
     begin
      panel2.Visible:=true
     end
     else  panel2.Visible:=False;
     if masVoprosovP[k].VariantOtveta3<>'' then
     begin
      panel3.Visible:=true
     end
      else  panel3.Visible:=False;
 
     if masVoprosovP[k].VariantOtveta4<>'' then
     begin
      panel4.Visible:=true
     end
      else  panel4.Visible:=False;
     if masVoprosovP[k].VariantOtveta5<>'' then
     begin
      panel5.Visible:=true
     end
      else  panel5.Visible:=False;
     if masVoprosovP[k].VariantOtveta6<>'' then
     begin
      panel6.Visible:=true
     end
      else  panel6.Visible:=False;
 
 
 
k1:=K; // инициализация k1
 
// скрываем панели вывода если в них нет текста
 
{//если в поле текста нет то делаем его невидимым если есть видимым
if polEVariantOtveta1.Text=''then POleVariantOtveta1.Visible:=false else POleVariantOtveta1.Visible:=true;
if polEVariantOtveta2.Text=''then POleVariantOtveta2.Visible:=false else POleVariantOtveta2.Visible:=true;
if polEVariantOtveta3.Text=''then POleVariantOtveta3.Visible:=false else POleVariantOtveta3.Visible:=true;
if polEVariantOtveta4.Text=''then POleVariantOtveta4.Visible:=false else POleVariantOtveta4.Visible:=true;
if polEVariantOtveta5.Text=''then POleVariantOtveta5.Visible:=false else POleVariantOtveta5.Visible:=true;
if polEVariantOtveta6.Text=''then POleVariantOtveta6.Visible:=false else POleVariantOtveta6.Visible:=true;
//если нет текста напротив скрываем такой чекит иначе показываем
if polEVariantOtveta1.Text=''then checkbox1.Visible:=false else checkbox1.Visible:=true;
if polEVariantOtveta2.Text=''then checkbox2.Visible:=false else checkbox2.Visible:=true;
if polEVariantOtveta3.Text=''then checkbox3.Visible:=false else checkbox3.Visible:=true;
if polEVariantOtveta4.Text=''then checkbox4.Visible:=false else checkbox4.Visible:=true;
if polEVariantOtveta5.Text=''then checkbox5.Visible:=false else checkbox5.Visible:=true;
if polEVariantOtveta6.Text=''then checkbox6.Visible:=false else checkbox6.Visible:=true;}
 // УБИРАЕМ КНОПКУ ЗАКРЫВАЮЩУЮ ПОЛЯ ОТВЕТОВ
 BUTTON3.Visible:=FALSE;
 button1.Enabled:=false;
end;
end;
procedure TForm3.BitBtn3Click(Sender: TObject);
 
begin //1 кнопка вопросы ->
 
// записываем в массив ответы данные пользователем
if checkbox1.Checked=true then masOtvetovP[k1].PoleViborOtveta1:='true'else masOtvetovP[k1].PoleViborOtveta1:='false';
if checkbox2.Checked=true then masOtvetovP[k1].PoleViborOtveta2:='true'else masOtvetovP[k1].PoleViborOtveta2:='false';
if checkbox3.Checked=true then masOtvetovP[k1].PoleViborOtveta3:='true'else masOtvetovP[k1].PoleViborOtveta3:='false';
if checkbox4.Checked=true then masOtvetovP[k1].PoleViborOtveta4:='true'else masOtvetovP[k1].PoleViborOtveta4:='false';
if checkbox5.Checked=true then masOtvetovP[k1].PoleViborOtveta5:='true'else masOtvetovP[k1].PoleViborOtveta5:='false';
if checkbox6.Checked=true then masOtvetovP[k1].PoleViborOtveta6:='true'else masOtvetovP[k1].PoleViborOtveta6:='false';
 
 
 
// очищаем все поля "варианты ответов" и "вопрос"
 
PoleVopros.Text:='';
PoleVariantOtveta1.Text:='';
PoleVariantOtveta2.Text:='';
PoleVariantOtveta3.Text:='';
PoleVariantOtveta4.Text:='';
PoleVariantOtveta5.Text:='';
PoleVariantOtveta6.Text:='';
//приводим в исходное состояние поля выбора ответов
checkBox1.Checked:=false;
checkBox2.Checked:=false;
checkBox3.Checked:=false;
checkBox4.Checked:=false;
checkBox5.Checked:=false;
checkBox6.Checked:=false;
 
k2:=k1+1;
// получаем случайное число схемы вывода вопросов
Randomize;// подключаем модуль случайных чисел
R:=random(3);// выбираем схему вывода вопросов
if edit1.text<>edit2.Text then
 
  begin
    //переменной кол-во присваиваем первоначально 0
      col:=0;
      // Считаем кол-во правильных ответов
      if masVoprosovP[k2].PoleViborOtveta1='true'  then Col:=Col+1;
      if masVoprosovP[k2].PoleViborOtveta2='true'  then Col:=Col+1;
      if masVoprosovP[k2].PoleViborOtveta3='true'  then Col:=Col+1;
      if masVoprosovP[k2].PoleViborOtveta4='true'  then Col:=Col+1;
      if masVoprosovP[k2].PoleViborOtveta5='true'  then Col:=Col+1;
      if masVoprosovP[k2].PoleViborOtveta6='true'  then Col:=Col+1;
      // выводим кол-во правильных ответов
       Label7.Caption:=IntToStr(col);
         // обнуляем переменную перед её использованием
      Colichestvo:=0;
      // считаем кол-во вариантов ответа всего
     if masVoprosovP[k2].VariantOtveta1<>'' then
     begin
     Colichestvo:=Colichestvo+1;
     panel1.Visible:=true
     end
      else  panel1.Visible:=False;
     if masVoprosovP[k2].VariantOtveta2<>'' then
     begin
     Colichestvo:=Colichestvo+1;
      panel2.Visible:=true
     end
     else  panel2.Visible:=False;
     if masVoprosovP[k2].VariantOtveta3<>'' then
     begin
     Colichestvo:=Colichestvo+1;
      panel3.Visible:=true
     end
      else  panel3.Visible:=False;
 
     if masVoprosovP[k2].VariantOtveta4<>'' then
     begin
     Colichestvo:=Colichestvo+1;
      panel4.Visible:=true
     end
      else  panel4.Visible:=False;
     if masVoprosovP[k2].VariantOtveta5<>'' then
     begin
     Colichestvo:=Colichestvo+1;
      panel5.Visible:=true
     end
      else  panel5.Visible:=False;
     if masVoprosovP[k2].VariantOtveta6<>'' then
     begin
     Colichestvo:=Colichestvo+1;
      panel6.Visible:=true
     end
      else  panel6.Visible:=False;
   // выводим в эдит номер вопроса
   edit2.Text:=InttoStr(k2);
   if (r=0)then //форма вывода 1
     begin
      poleVopros.Text:=masVoprosovP[k2].Vopros;
      poleVariantOtveta1.Text:=masVoprosovP[k2].VariantOtveta1;
      poleVariantOtveta2.Text:=masVoprosovP[k2].VariantOtveta2;
      poleVariantOtveta3.Text:=masVoprosovP[k2].VariantOtveta3;
      poleVariantOtveta4.Text:=masVoprosovP[k2].VariantOtveta4;
      poleVariantOtveta5.Text:=masVoprosovP[k2].VariantOtveta5;
      poleVariantOtveta6.Text:=masVoprosovP[k2].VariantOtveta6;
      edit3.Text:=MasVoprosovP[k2].NomerVoprosa;
    
      // мозайкой меняем положение панели
                  if colichestvo=2 then
                   begin
                    panel1.Top:=184;
                    panel2.Top:=264;
                   end;
                  if colichestvo=3 then
                   begin
                    panel1.Top:=264;
                    panel2.Top:=184;
                    panel3.Top:=344;
                   end;
 
                 if colichestvo=4 then
                   begin
                    panel1.Top:=424;
                    panel2.Top:=184;
                    panel3.Top:=344;
                    panel4.Top:=264;
                   end;
                if colichestvo=5 then
                  begin
                   panel1.Top:=424;
                   panel2.Top:=184;
                   panel3.Top:=344;
                   panel4.Top:=264;
                   panel5.Top:=504;
                  end;
               if colichestvo=6 then
                 begin
                  panel1.Top:=184;
                  panel2.Top:=344;
                  panel3.Top:=264;
                  panel4.Top:=504;
                  panel5.Top:=584;
                  panel6.Top:=424;
                 end;
             end;
            if (r=1)then // форма вывода 2
              begin
                  //выводим текст
                  poleVopros.Text:=masVoprosovP[k2].Vopros;
                  poleVariantOtveta1.Text:=masVoprosovP[k2].VariantOtveta1;
                  poleVariantOtveta2.Text:=masVoprosovP[k2].VariantOtveta2;
                  poleVariantOtveta3.Text:=masVoprosovP[k2].VariantOtveta3;
                  poleVariantOtveta4.Text:=masVoprosovP[k2].VariantOtveta4;
                  poleVariantOtveta5.Text:=masVoprosovP[k2].VariantOtveta5;
                  poleVariantOtveta6.Text:=masVoprosovP[k2].VariantOtveta6;
                  edit3.Text:=MasVoprosovP[k2].NomerVoprosa;
                  // мозайкой меняем положение панели
                  if colichestvo=2 then
                   begin
                    panel1.Top:=264;
                    panel2.Top:=184;
                   end;
                  if colichestvo=3 then
                   begin
                    panel1.Top:=264;
                    panel2.Top:=184;
                    panel3.Top:=344;
                   end;
 
                 if colichestvo=4 then
                   begin
                    panel1.Top:=264;
                    panel2.Top:=344;
                    panel3.Top:=184;
                    panel4.Top:=424;
                   end;
                if colichestvo=5 then
                  begin
                   panel1.Top:=504;
                   panel2.Top:=184;
                   panel3.Top:=264;
                   panel4.Top:=344;
                   panel5.Top:=424;
                  end;
               if colichestvo=6 then
                 begin
                  panel1.Top:=504;
                  panel2.Top:=424;
                  panel3.Top:=584;
                  panel4.Top:=184;
                  panel5.Top:=264;
                  panel6.Top:=344;
                 end;
     end;
  if (r=2)then // форма вывода 3
     begin
       //выводим текст
       poleVopros.Text:=masVoprosovP[k2].Vopros;
      poleVariantOtveta1.Text:=masVoprosovP[k2].VariantOtveta1;
      poleVariantOtveta2.Text:=masVoprosovP[k2].VariantOtveta2;
      poleVariantOtveta3.Text:=masVoprosovP[k2].VariantOtveta3;
      poleVariantOtveta4.Text:=masVoprosovP[k2].VariantOtveta4;
      poleVariantOtveta5.Text:=masVoprosovP[k2].VariantOtveta5;
      poleVariantOtveta6.Text:=masVoprosovP[k2].VariantOtveta6;
      edit3.Text:=MasVoprosovP[k2].NomerVoprosa;
         // мозайкой меняем положение панели
       if colichestvo=2 then
         begin
          panel1.Top:=184;
          panel2.Top:=264;
         end;
       if colichestvo=3 then
         begin
          panel1.Top:=344;
          panel2.Top:=184;
          panel3.Top:=264;
         end;
 
       if colichestvo=4 then
         begin
         panel1.Top:=424;
         panel2.Top:=264;
         panel3.Top:=184;
         panel4.Top:=344;
         end;
       if colichestvo=5 then
         begin
         panel1.Top:=184;
         panel2.Top:=264;
         panel3.Top:=344;
         panel4.Top:=424;
         panel5.Top:=504;
         end;
       if colichestvo=6 then
         begin
         panel1.Top:=344;
         panel2.Top:=184;
         panel3.Top:=424;
         panel4.Top:=264;
         panel5.Top:=584;
         panel6.Top:=504;
         end;//2
 
 
     end;// форма вывода 3
 
 
 
 
  //если в поле текста нет то делаем его невидимым если есть видимым
 
     k1:=k1+1;
 
 if panel4.Visible=False then
  BUTTON3.Caption:='';
      
    end
    else
   if k1=strtoint(form3.Edit1.Text) then
    begin
      bitbtn3.Enabled:=false;
      form3.Edit2.Text:=form3.Edit1.Text;
      BUTTON3.Visible:=TRUE;
 
      BUTTON3.Caption:='ВОПРОСЫ ЗАКОНЧИЛИСЬ НАЖМИТЕ КНОПКУ "ЗАКОНЧИТЬ ТЕСТИРОВАНИЕ"';
      BUTTON2.Enabled:=TRUE;
 
    end;
end;//1
 
procedure TForm3.Button2Click(Sender: TObject);
var j:integer;
var x:real;
begin
// очищаем поле кол-во вариантов ответа
Label7.Caption:='';
//обнуляем число ошибок
oshibki:=0;
// сравниваем ответы пользователя с правильными ответами
 for j:= 0 to strtoint(form3.Edit1.text)do
  begin
   if masOtvetovP[j].PoleViborOtveta1<> masVoprosovP[j].PoleViborOtveta1 then oshibki:=oshibki+1
   else
   if masOtvetovP[j].PoleViborOtveta2<> masVoprosovP[j].PoleViborOtveta2 then oshibki:=oshibki+1
   else
   if masOtvetovP[j].PoleViborOtveta3<> masVoprosovP[j].PoleViborOtveta3 then oshibki:=oshibki+1
   else
   if masOtvetovP[j].PoleViborOtveta4<> masVoprosovP[j].PoleViborOtveta4 then oshibki:=oshibki+1
   else
   if masOtvetovP[j].PoleViborOtveta5<> masVoprosovP[j].PoleViborOtveta5 then oshibki:=oshibki+1
   else
   if masOtvetovP[j].PoleViborOtveta6<> masVoprosovP[j].PoleViborOtveta6 then oshibki:=oshibki+1;
  end;
  //подсчитываем оценку
  // сначала узнаем сколько всего вопросов выбрал пользователь
 Colichestvo1:=StrToInt(Form3.Edit1.Text);
  //вычисляем x
  x:=(oshibki*100)/colichestvo1;
  if (x<=10) then
   BEGIN
    form6.label7.Caption:=' 5';
    FORM6.LABEL2.VISIBLE:=TRUE;
    END;
  if(x<=30)and(x>10)then
 
    BEGIN
     form6.label7.Caption:=' 4';
     FORM6.LABEL3.VISIBLE:=TRUE;
     END;
  if (x>30)and(x<=50)then
 
    BEGIN
     form6.label7.Caption:=' 3';
     FORM6.LABEL4.VISIBLE:=TRUE;
     END;
  if (x>50)and(x<=70)then
     BEGIN
      form6.label7.Caption:=' 2';
      FORM6.LABEL5.VISIBLE:=TRUE;
      END;
  if (x>70)then
  BEGIN
   form6.label7.Caption:=' 1';
   FORM6.LABEL6.VISIBLE:=TRUE;
   END;
form6.showMODAL;
end;
 
procedure TForm3.Button3Click(Sender: TObject);
begin
 
 if (button1.enabled=false)then
 begin
 end
 else
  BUTTON1.Click;
end;
 
procedure TForm3.Button4Click(Sender: TObject);
begin
form5.Show;
end;
 
procedure TForm3.FormShow(Sender: TObject);
begin //при показе формы 3
//блокируем клавишу закончить тестирование
Button2.Enabled:=False;
// делаем видимой кнопку которая закрывает панели
Button3.Visible:=True;
// запрещаем нажать кнопку "следующий вопрос"
Bitbtn3.Enabled:=False;
// разблокируем кнопку "начать тестирование"
Button1.Enabled:=True;
// меняем надпись на кнопке
Button3.Caption:='ЧТОБЫ НАЧАТЬ ТЕСТИРОВАНИЕ НАЖМИТЕ КНОПКУ "НАЧАТЬ ТЕСТИРОВАНИЕ"';
end;
 
procedure TForm3.FormCreate(Sender: TObject);
begin
 
end;
 
end.

Добавлено через 1 минуту
Unit4

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
unit Unit4;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
 
type
  TForm4 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    PoleVopros: TMemo;
    PoleVariantOtveta1: TMemo;
    PoleVariantOtveta2: TMemo;
    PoleVariantOtveta3: TMemo;
    PoleVariantOtveta4: TMemo;
    PoleVariantOtveta5: TMemo;
    PoleVariantOtveta6: TMemo;
    BitBtn2: TBitBtn;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    Edit1: TEdit;
    Edit2: TEdit;
    BitBtn1: TBitBtn;
    BitBtn3: TBitBtn;
    Label5: TLabel;
    BitBtn4: TBitBtn;
    Label6: TLabel;
    Edit3: TEdit;
    Button2: TButton;
    BitBtn5: TBitBtn;
    Label13: TLabel;
    Edit4: TEdit;
    procedure BitBtn2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure BitBtn5Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form4: TForm4;
 
implementation
 
uses Unit1, Unit2, Unit3, Unit5, Unit6, ZapisVFile;
 
{$R *.dfm}
 
procedure TForm4.BitBtn2Click(Sender: TObject);
var k:integer;
begin
// очищаем все поля текста и чекеты
 // очищаем все поля "варианты ответов" и "вопрос"
 
PoleVopros.Text:='';
PoleVariantOtveta1.Text:='';
PoleVariantOtveta2.Text:='';
PoleVariantOtveta3.Text:='';
PoleVariantOtveta4.Text:='';
PoleVariantOtveta5.Text:='';
PoleVariantOtveta6.Text:='';
//приводим в исходное состояние поля выбора ответов
checkBox1.Checked:=false;
checkBox2.Checked:=false;
checkBox3.Checked:=false;
checkBox4.Checked:=false;
checkBox5.Checked:=false;
checkBox6.Checked:=false;
//очищаем эдиты
edit1.Text:='';
edit2.Text:='';
//перезаписываем файл вопросов
AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza');
rewrite(f);
for k:=1 to colVop do
begin
writeln(f,masVoprosovBazi[k].Vopros);
writeln(f,masVoprosovBazi[k].VariantOtveta1);
writeln(f,masVoprosovBazi[k].VariantOtveta2);
writeln(f,masVoprosovBazi[k].VariantOtveta3);
writeln(f,masVoprosovBazi[k].VariantOtveta4);
writeln(f,masVoprosovBazi[k].VariantOtveta5);
writeln(f,masVoprosovBazi[k].VariantOtveta6);
writeln(f,masVoprosovBazi[k].PoleViborOtveta1);
writeln(f,masVoprosovBazi[k].PoleViborOtveta2);
writeln(f,masVoprosovBazi[k].PoleViborOtveta3);
writeln(f,masVoprosovBazi[k].PoleViborOtveta4);
writeln(f,masVoprosovBazi[k].PoleViborOtveta5);
writeln(f,masVoprosovBazi[k].PoleViborOtveta6);
writeln(f,masVoprosovBazi[k].NomerVoprosa);
end;
closefile(f);
 FORM4.Close;
 FORM1.SHOW;
end;
 
procedure TForm4.Button1Click(Sender: TObject);
var ik11:integer;
begin
 
end;
procedure TForm4.BitBtn3Click(Sender: TObject);
begin
 
if ik1=ColVop then
  begin
    showmessage('это последний вопрос!');
   end
   else
   begin
   bitBtn4Click(nil);
    ik1:=ik1+1;
PoleVopros.Text:=masVoprosovBazi[ik1].Vopros;
poleVariantOtveta1.text:=masVoprosovBazi[ik1].VariantOtveta1;
poleVariantOtveta2.text:=masVoprosovBazi[ik1].VariantOtveta2;
poleVariantOtveta3.text:=masVoprosovBazi[ik1].VariantOtveta3;
poleVariantOtveta4.text:=masVoprosovBazi[ik1].VariantOtveta4;
poleVariantOtveta5.text:=masVoprosovBazi[ik1].VariantOtveta5;
poleVariantOtveta6.text:=masVoprosovBazi[ik1].VariantOtveta6;
if masVoprosovBazi[ik1].PoleViborOtveta1='true'then checkbox1.checked:=true else checkbox1.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta2='true'then checkbox2.checked:=true else checkbox2.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta3='true'then checkbox3.checked:=true else checkbox3.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta4='true'then checkbox4.checked:=true else checkbox4.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta5='true'then checkbox5.checked:=true else checkbox5.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta6='true'then checkbox6.checked:=true else checkbox6.checked:=false;
 
 //вывести номер вопроса в эдит
 edit2.Text:=intTostr(ik1);
 end;
end;
 
procedure TForm4.BitBtn1Click(Sender: TObject);
begin
 if ik1=1 then
  begin
    ShowMessage('дальше нет вопросов!');
 
   end
 
 
   else
   begin
   bitBtn4Click(nil);
 if ik1<>1 then  ik1:=ik1-1;
 //вывести номер вопроса в эдит
 edit2.Text:=intTostr(ik1);
 
PoleVopros.Text:=masVoprosovBazi[ik1].Vopros;
poleVariantOtveta1.text:=masVoprosovBazi[ik1].VariantOtveta1;
poleVariantOtveta2.text:=masVoprosovBazi[ik1].VariantOtveta2;
poleVariantOtveta3.text:=masVoprosovBazi[ik1].VariantOtveta3;
poleVariantOtveta4.text:=masVoprosovBazi[ik1].VariantOtveta4;
poleVariantOtveta5.text:=masVoprosovBazi[ik1].VariantOtveta5;
poleVariantOtveta6.text:=masVoprosovBazi[ik1].VariantOtveta6;
if masVoprosovBazi[ik1].PoleViborOtveta1='true'then checkbox1.checked:=true else checkbox1.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta2='true'then checkbox2.checked:=true else checkbox2.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta3='true'then checkbox3.checked:=true else checkbox3.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta4='true'then checkbox4.checked:=true else checkbox4.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta5='true'then checkbox5.checked:=true else checkbox5.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta6='true'then checkbox6.checked:=true else checkbox6.checked:=false;
 
 
 
 
 //if edit2.text='1' then bitbtn1.Enabled:=false;
 //bitbtn3.Enabled:=true;
  end;
end;
 
procedure TForm4.BitBtn4Click(Sender: TObject);
var colich:integer;
begin
masVoprosovBazi[ik1].Vopros:=PoleVopros.Text;
masVoprosovBazi[ik1].VariantOtveta1:=PoleVariantOtveta1.Text;
masVoprosovBazi[ik1].VariantOtveta2:=PoleVariantOtveta2.Text;
masVoprosovBazi[ik1].VariantOtveta3:=PoleVariantOtveta3.Text;
masVoprosovBazi[ik1].VariantOtveta4:=PoleVariantOtveta4.Text;
masVoprosovBazi[ik1].VariantOtveta5:=PoleVariantOtveta5.Text;
masVoprosovBazi[ik1].VariantOtveta6:=PoleVariantOtveta6.Text;
if checkbox1.checked=true then masVoprosovBazi[ik1].PoleViborOtveta1:='true'else masVoprosovBazi[ik1].PoleViborOtveta1:='false';
if checkbox2.checked=true then masVoprosovBazi[ik1].PoleViborOtveta2:='true'else masVoprosovBazi[ik1].PoleViborOtveta2:='false';
if checkbox3.checked=true then masVoprosovBazi[ik1].PoleViborOtveta3:='true'else masVoprosovBazi[ik1].PoleViborOtveta3:='false';
if checkbox4.checked=true then masVoprosovBazi[ik1].PoleViborOtveta4:='true'else masVoprosovBazi[ik1].PoleViborOtveta4:='false';
if checkbox5.checked=true then masVoprosovBazi[ik1].PoleViborOtveta5:='true'else masVoprosovBazi[ik1].PoleViborOtveta5:='false';
if checkbox6.checked=true then masVoprosovBazi[ik1].PoleViborOtveta6:='true'else masVoprosovBazi[ik1].PoleViborOtveta6:='false';
showmessage('вопрос успешно перезаписан во временное хранилище при выходе из редактора он будет изменен в базе');
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
ik:=2;
ik1:=1;
end;
 
procedure TForm4.Button2Click(Sender: TObject);
begin
 
// если эдит пустой тогда вывести сообщение об ошибке
  if edit3.text=''then showmessage('вы не ввели номер вопроса')
   else
    if StrToInt(edit3.Text)>ColVop  then  showmessage('в базе нет такого вопроса')
  else
  begin
ik1:=strtoint(edit3.text);
  PoleVopros.Text:=masVoprosovBazi[ik1].Vopros;
poleVariantOtveta1.text:=masVoprosovBazi[ik1].VariantOtveta1;
poleVariantOtveta2.text:=masVoprosovBazi[ik1].VariantOtveta2;
poleVariantOtveta3.text:=masVoprosovBazi[ik1].VariantOtveta3;
poleVariantOtveta4.text:=masVoprosovBazi[ik1].VariantOtveta4;
poleVariantOtveta5.text:=masVoprosovBazi[ik1].VariantOtveta5;
poleVariantOtveta6.text:=masVoprosovBazi[ik1].VariantOtveta6;
if masVoprosovBazi[ik1].PoleViborOtveta1='true'then checkbox1.checked:=true else checkbox1.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta2='true'then checkbox2.checked:=true else checkbox2.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta3='true'then checkbox3.checked:=true else checkbox3.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta4='true'then checkbox4.checked:=true else checkbox4.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta5='true'then checkbox5.checked:=true else checkbox5.checked:=false;
if masVoprosovBazi[ik1].PoleViborOtveta6='true'then checkbox6.checked:=true else checkbox6.checked:=false;
 
 //вывести номер вопроса в эдит
 edit2.Text:=intTostr(ik1);
  end;
end;
procedure TForm4.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if (key>='0')and (key<='9')or (key=#8)then
  begin
  // ничего не делать
   if Edit3.Text<>''then
     begin
      if StrToInt(edit3.Text)>1000 then key:=#0;
     end;
  end
 
  else
  begin
  key:=#0;
  end;
 
 
end;
procedure TForm4.BitBtn5Click(Sender: TObject);
begin
edit3.Text:='';
end;
 
procedure TForm4.FormShow(Sender: TObject);
var ik11:integer;
begin // при показе формы 4//
 
  //проверка на существование файла вопросов
 AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza');
  {Si-}//отключаем стандартную обработку ошибок
  reset(f);
 {Si+}//включаем стандартную обработку ошибок
  closefile(f);
 if ioresult<>0 then
   begin
    showmessage('файл вопросов  " '+Form1.Edit1.Text+'.Baza'  +' " не найден без него редактору нечего менять');
 
   end
 
  else
  begin
   //проверка на существование файла количества вопросов
   AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
    {Si-}//отключаем стандартную обработку ошибок
    reset(f);
    {Si+}//включаем стандартную обработку ошибок
     closefile(f);
 if ioresult<>0 then
    begin
     showmessage('файл количества вопросов "'+Form1.Edit1.Text+'.Baza'+'.KV' +'" не найден без него редактору ничего не поменять');
 
    end
 
   else
  begin
   AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza'+'.KV');
          reset(f);
          read(f,colVop);
          closefile(f);
   AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza');//связываем файл с переменной
          reset(f);
          for ik11:=1 to ColVop do
          begin
          readln(f,masVoprosovBazi[ik11].Vopros);
          readln(f,masVoprosovBazi[ik11].VariantOtveta1);
          readln(f,masVoprosovBazi[ik11].VariantOtveta2);
          readln(f,masVoprosovBazi[ik11].VariantOtveta3);
          readln(f,masVoprosovBazi[ik11].VariantOtveta4);
          readln(f,masVoprosovBazi[ik11].VariantOtveta5);
          readln(f,masVoprosovBazi[ik11].VariantOtveta6);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta1);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta2);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta3);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta4);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta5);
          readln(f,masVoprosovBazi[ik11].PoleViborOtveta6);
          readln(f,masVoprosovBazi[ik11].NomerVoprosa);
          end;
 
          closefile(f);
          //записываем количество вопросов в эдит
          form4.edit1.Text:=intToStr(ColVop);
          //выводим первый вопрос  в поля текста для редактирования
          PoleVopros.Text:=masVoprosovBazi[1].Vopros;
          poleVariantOtveta1.text:=masVoprosovBazi[1].VariantOtveta1;
          poleVariantOtveta2.text:=masVoprosovBazi[1].VariantOtveta2;
          poleVariantOtveta3.text:=masVoprosovBazi[1].VariantOtveta3;
          poleVariantOtveta4.text:=masVoprosovBazi[1].VariantOtveta4;
          poleVariantOtveta5.text:=masVoprosovBazi[1].VariantOtveta5;
          poleVariantOtveta6.text:=masVoprosovBazi[1].VariantOtveta6;
          if masVoprosovBazi[1].PoleViborOtveta1='true'then checkbox1.checked:=true else checkbox1.checked:=false;
          if masVoprosovBazi[1].PoleViborOtveta2='true'then checkbox2.checked:=true else checkbox2.checked:=false;
          if masVoprosovBazi[1].PoleViborOtveta3='true'then checkbox3.checked:=true else checkbox3.checked:=false;
          if masVoprosovBazi[1].PoleViborOtveta4='true'then checkbox4.checked:=true else checkbox4.checked:=false;
          if masVoprosovBazi[1].PoleViborOtveta5='true'then checkbox5.checked:=true else checkbox5.checked:=false;
          if masVoprosovBazi[1].PoleViborOtveta6='true'then checkbox6.checked:=true else checkbox6.checked:=false;
          //записываем в эдит номер вопроса
          edit2.Text:='1';
 
 
           ShowMessage('база данных успешно подключена!');
  end;
end;
end;
end.

Добавлено через 1 минуту
Unit5 // форма выбора кол-ва вопросов

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm5 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form5: TForm5;
 
implementation
 
uses Unit1, Unit2, Unit3, Unit4;
 
{$R *.dfm}
 
procedure TForm5.FormCreate(Sender: TObject);
begin
  
  Edit2.Text:='0';//по умолчанию эдиту 2 присваиваем 0
end;
 
procedure TForm5.Button1Click(Sender: TObject);
label m;
begin // кнопка 'приступить к тестированию'
 
if (Edit2.Text='')then Edit2.Text:='0';
// проверяем на ошибки если значение поле выбора
// больше чем вопросов в базе вывести об этом сообщение
if StrtoInt(Edit2.Text) > StrtoInt(Edit1.Text)then
begin
ShowMessage('не соответствует количество выбранных вопросов к максимально возможному');
end
else
//если пользователь выбрал 0 вопросов выводим об этом сообщение
if (StrtoInt(edit2.Text)=0)then
 begin
  ShowMessage('вы выбрали 0 вопросов , это недопустимо!');
 end
 else
   begin
    Form3.Edit1.Text:=Form5.Edit2.Text;
    ColVopPol:=StrtoInt(Form5.Edit2.Text);
    Form5.Close;//закрываем форму выбора числа вопросов
    Form3.Show;//открываем менеджер тестирования
   
   end;
end;
 
procedure TForm5.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  
 if(( key>='0')and (key<='9'))OR(KEY=#8)then
   begin
    IF (edit2.text='0')then
      begin
       edit2.Text:='';
      end;
    //ничего не делать символы введены правильные
     if (edit2.text<>'')then
   begin
 
    if (strtoint(edit2.text)>1000)then
      begin
      if (key=#8)then
      begin
       end
       else
      key:=#0;
      end
   end
   end
else
 key:=#0;
end;
procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form5.edit2.text:='0';
 
end;
 
end.

Добавлено через 1 минуту
Unit6 // форма вывода оценки

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
unit Unit6;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
 
type
  TForm6 = class(TForm)
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form6: TForm6;
 
implementation
 
uses Unit1, Unit2, Unit3, Unit4, Unit5, ZapisVFile;
 
{$R *.dfm}
 
procedure TForm6.BitBtn1Click(Sender: TObject);
begin
FORM2.Close;
FORM3.Close;
FORM4.Close;
FORM5.Close;
FORM6.Close;
FORM5.Edit2.Text:='0';
FORM3.Edit2.Text:='';
form3.Button1.Enabled:=true;
form3.Button3.Caption:='ЧТОБЫ НАЧАТЬ ТЕСТИРОВАНИЕ НАЖМИТЕ КНОПКУ "НАЧАТЬ ТЕСТИРОВАНИЕ"';
form6.Label2.Visible:=false;
form6.Label3.Visible:=false;
form6.Label4.Visible:=false;
form6.Label5.Visible:=false;
form6.Label6.Visible:=false;
end;
 
procedure TForm6.FormCreate(Sender: TObject);
begin
 
end;
 
end.

Добавлено через 2 минуты
Unit7 // форма создания и выбора базы данных(фактически текстового файла)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
unit Unit7;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm7 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Button3: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Memo1Click(Sender: TObject);
    procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form7: TForm7;
 
implementation
 
uses Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, ZapisVFile,Registry;
 
{$R *.dfm}
 
procedure TForm7.Button1Click(Sender: TObject);
Var F:TextFile;
List:string;
begin // кнопка 'создать базу' данных
    if Edit1.Text<>''then
begin
//устонавливаем текущую директорию
//создаем файл вопросов
AssignFile(f,'Базы вопросов//'+Form7.Edit1.Text+'.Baza');
Rewrite(f);
CloseFile(f);
// создаем файл кол-во вопросов
AssignFile(f,'Базы вопросов//'+Form7.Edit1.Text+'.Baza'+'.KV');
Rewrite(f);
// записываем в файл значение вопросов =0
Write(f,'0');
CloseFile(f);
 
// записываем в файл кол-во баз имя новой базы
AssignFile(f,'Bazi.CL');
//открываем файл для дозаписи
Append(f);
//записываем имя базы в файл
Writeln(f,Edit1.Text);
//закрываем файл
CloseFile(f);
// обновляем список баз данных
// связываем файл с переменной
AssignFile(f,'Bazi.CL');
//открываем файл для чтения
Reset(f);
ListBox1.Clear;
// пока не конец файла считываем из него данные в список баз
While not EOF(F) do
 begin
 Readln(f,List);
 ListBox1.Items.Add(List);
 end;
CloseFile(f);
Edit1.Text:='';
ShowMessage('Файл базы успешно создан');
end
else ShowMessage('Вы не ввели имя базы данных,которую хотите создать');
 
end;
 
procedure TForm7.Button3Click(Sender: TObject);
var Reg:TRegistry;
    Strings:string;
begin
if Label4.Caption=''then ShowMessage('вы не выбрали базу,выберите базу и повторите ввод')else
begin
Strings:=Label4.Caption;
//создаем объект реестр
reg:=Tregistry.Create;
//выбираем корневой ключ
reg.RootKey:=HKEY_CURRENT_USER;
//переходим в под ключ этого ключа
reg.OpenKey('CurrentBase',True);
reg.WriteString('CurrentBase',label4.Caption);
reg.CloseKey;
reg.Free;
// записываем в поле Текущая база имя текущей базы
Form1.Edit1.Text:=Form7.Label4.Caption;
Form2.Edit3.Text:=Form7.Label4.Caption;
Form3.Edit5.Text:=Form7.Label4.Caption;
Form4.Edit4.Text:=Form7.Label4.Caption;
ShowMessage('база  '+Strings+'  была успешно выбрана текущей');
 
end;
 
end;
 
procedure TForm7.Memo1Click(Sender: TObject);
begin
//
end;
 
procedure TForm7.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if ListBox1.Itemindex<>-1 then Label4.Caption:=ListBox1.Items[ListBox1.ItemIndex];
end;
 
procedure TForm7.FormShow(Sender: TObject);
Var List:string;
begin
// при показе формы выводим все найденные базы данных
// считываем из файла баз данных количество баз
// обновляем список баз данных
// связываем файл с переменной
AssignFile(f,'Bazi.CL');
//открываем файл для чтения
Reset(f);
ListBox1.Clear;
// пока не конец файла считываем из него данные в список баз
While not EOF(F) do
 begin
 Readln(f,List);
 ListBox1.Items.Add(List);
 end;
CloseFile(f);
end;
 
procedure TForm7.Button2Click(Sender: TObject);
begin
if ListBox1.Itemindex=-1 then ListBox1.Enabled:=False Else ListBox1.Enabled:=True;
end;
 
procedure TForm7.FormCreate(Sender: TObject);
begin
 
end;
 
end.

Добавлено через 2 минуты
Unit содержащий процедуру записи в файл

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
unit ZapisVFile;
 
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls;
 
 
procedure ZapisiVFile(str:string);
 
implementation
 
uses Unit1, Unit2, Unit3, Unit4, Unit5, Unit6;
procedure ZapisiVFile(str:string);
label m;
var f:text;
 i:integer;
  begin
  m:AssignFile(f,'Базы вопросов//'+Form1.Edit1.Text+'.Baza');//связываем файл с переменной
   {$i-}
   append(f);//открываем текстовый файл для дозаписи
   {$i+}
   if ioresult<>0 then
      begin
      ShowMessage('файл вопросов базы не найден');
      end
else
        begin
          writeln(f,str);//считываем строку в файл и переходим на следующую строку
          closefile(f); //закрываем файл так как нам он больше не нужен на данный момент
        end;
 
end;     
end.

Добавлено через 8 минут
Я написал этот тестер еще 2 года назад он более функционален чем некоторые и подходит для многих нужд Если вы хотите написать его то вам достаточно создать 7 Form и 1 Unit назвать их как в программе затем скопировать весь код в отдельные формы и скомпилировать приложение типа Exe -это для тех кто хочет понять как можно написать тестер для тех же кто хочет просто скачать и пользоваться предлагаю скачать программу весь дистрибутив включая все модули

Добавлено через 6 минут

Если кому интересно могу переслать дистрибутив вместе с программой по Icq или как либо еще
бесплатно.



13



Предлагаемые методические рекомендации
отображают проектирование, оформление и
разработку тестирующих программ в среде
программирования Delphi.

Рекомендуются учителям информатики, учителям
школьных предметов, учащимся старших классов
общеобразовательных средних школ с углубленным
изучением информатики.

Введение

Ощутимые шаги в раскрытии глубинных
закономерностей человеческого обучения,
сделанные мировой дидактикой, а также бурный
прогресс в области развития персональных
компьютеров выводят педагогов на необходимость
создания электронных тестирующих программ для
самоконтроля и самопроверки знаний обучающихся.

Основная цель данных методических
рекомендаций состоит в том, чтобы дать знания о
технологии создания тестирующих программ в
среде программирования Delphi.

В результате использования этих рекомендаций
могут быть сформированы умения и навыки
проектирования тестирующих программ в среде
программирования Delphi.

Создание тестирующей программы с
использованием компонентов

TLabel, TButton, TRadioGroup

Требования к предварительной подготовке:

  • знать основы программирования в системе
    Паскаль;
  • уметь пользоваться кнопками панелей
    инструментов и контекстным меню.

Создание интерфейса приложения

1. Создайте проект 1 (презентация).

2. Задайте объектам следующие свойства

Объект Свойство Значение
Форма Name Form1
  Caption Тест самопроверки
  Color cllnfoBk
RadioGroup Name RadioGroup1, :, RadioGroup5
  Caption
  Items :(варианты ответов)
  ItemIndex 0,1,2,3 (индекс выбранного переключателя)
  Font Times New Roman, обычный, размер 14, цвет
тёмно-синий
Label    
(метка) Name Label1,:, Label5
  Caption :(текст выбранного вопроса)
  Font Times New Roman, полужирный, размер 14, цвет
тёмно-синий
Label    
(метка) Name Label4
  Caption
  Font Times New Roman, полужирный, размер 14, цвет
красный
Label    
(метка) Name Label5
  Caption
  Font Times New Roman, полужирный, размер 14, цвет
красный
Button    
(кнопка) Name Button1
  Caption Число правильных ответов
Button    
(кнопка) Name Button2
  Caption Выход

3.Сохраните проект (File -> Save All) в своей папке.

Написание кода

1. Напишите программу теста в окне кода.

var

Form1: TForm1;

m,n,k,l,w,v:integer; {указание типа переменных
(правильных ответов)}

implementation

{$R *.dfm}

{проверка правильности ответов на поставленные
вопросы}

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin m:=0; if RadioGroup1.ItemIndex=1 then m:=m+1 else m:=m; end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin n:=0; if RadioGroup2.ItemIndex=0 then n:=n+1 else n:=n; end;

procedure TForm1.RadioGroup3Click(Sender: TObject);

begin k:=0; if RadioGroup3.ItemIndex=0 then k:=k+1 else k:=k; end;

procedure TForm1.RadioGroup4Click(Sender: TObject);

begin w:=0; if RadioGroup4.ItemIndex=0 then w:=w+1 else w:=w; end;

procedure TForm1.RadioGroup5Click(Sender: TObject);

begin v:=0; if RadioGroup5.ItemIndex=2 then v:=v+1 else v:=v; end;

{подсчёт правильных ответов и вывод результата
тестирования}

procedure TForm1.Button1Click(Sender: TObject);

begin l:=m+n+k+w+v; if l=5 then

begin Label4.Caption:=IntToStr(l); Label5.Caption:=’Отлично!’; end else if l=4
then

begin Label4.Caption:=IntToStr(l); Label5.Caption:=’Хорошо! Но Вам
необходимо повторить теоретический материал.’; end
else if l<=3 then

begin Label4.Caption:=IntToStr(l); Label5.Caption:=’Плохо! Учите!’ end; end;

{выход из программы}

procedure TForm1.Button2Click(Sender: TObject); begin close; end; end.

2.Сохраните форму и проект в своей папке.

Создание тестирующей программы с
использованием компонентов TLabel, TButton, TRadioGroup,
TMainMenu

Создание интерфейса приложения

1.Создайте проект 2 (презентация).

Для этого добавьте на форму следующие
компоненты:

  • компонент MainMenu, состоящий из пунктов: Тест
    (Выход) и Помощь (Инструкция, О программе);
  • метку для текста вопросов и вывода результата
    теста в виде строки «:правильных ответов из 10
    вопросов»;
  • метку «Следующий ответ»;
  • группу зависимых переключателей для вариантов
    ответов (RadioGroup1,:, RadioGroup10), которые накладываются
    друг на друга;
  • кнопку «Результат тестирования».

2. Задайте объектам следующие свойства.

Объект Свойство Значение
Форма Name Form1
  Caption Тест по информатике
  Color clSkyBlue
MainMenu Name MainMenu1
Label    
(метка) Name Label1
  Caption :(текст вопроса)
  Font MS Sans Serif, полужирный курсив, размер 14,
цвет тёмно-синий
Label    
(метка) Name Label2
  Caption Следующий вопрос
  Font MS Sans Serif, полужирный, размер 14, цвет
сиреневый
Button    
(кнопка) Name Button1
  Caption Выход
  Font MS Sans Serif, полужирный курсив, размер 14,
цвет чёрный
Button    
(кнопка) Name Button2
  Caption Результат тестирования
  Font MS Sans Serif, полужирный курсив, размер 14,
цвет чёрный
  Visible False
RadioGroup Name RadioGroup1, :, RadioGroup10
  Caption
  Items :(варианты ответов)
  ItemIndex 0,1,2,3 (индекс выбранного переключателя)
  Font Times New Roman, обычный, размер 14, тёмно-синий
  Visible для RadioGroup1 — True

для RadioGroup2,:, RadioGroup10 —
False

3.Сохраните проект (File -> Save All) в своей папке.

Написание кода

1. Запрограммируйте метку Label2 («Следующий
вопрос») так, чтобы в метке Label1 выводился
следующий вопрос, варианты ответа на него, и при
достижении последнего вопроса метка Label2
становилась недоступной.

2. При написании программы следуйте инструкции:

  • повторный выбор ответа на вопрос недоступен;
  • результат тестирования вывести в метке Label1 по
    щелчку кнопки Button2;
  • пункт главного меню «Выход» закрывает
    программу;
  • пункт главного меню «О программе» выводит окно
    формы About Box (для этого необходимо выполнить
    команду File -> New-> Other, закладка Forms, форма About );
  • пункт главного меню «Инструкция» выводит
    информационное окно.

3.Напишите программу теста в окне кода.

Var Form1: TForm1;

{указание типа переменных (правильных ответов)}

a,b,c,d,f,g,j,l,m,n,k,p:integer; implementation uses Unit2; {$R *.dfm}

{проверка правильности ответов на поставленные
вопросы}

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin a:=0; if RadioGroup1.ItemIndex=0 then a:=a+1 else a:=a;
RadioGroup1.Visible:=False; end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin b:=0; if RadioGroup2.ItemIndex=1 then b:=b+1 else b:=b;
RadioGroup2.Visible:=False; end;

procedure TForm1.RadioGroup3Click(Sender: TObject);

begin d:=0; if RadioGroup3.ItemIndex=1 then d:=d+1 else d:=d;
RadioGroup3.Visible:=False; end;

procedure TForm1.RadioGroup4Click(Sender: TObject);

begin c:=0; if RadioGroup4.ItemIndex=0 then c:=c+1 else c:=c;
RadioGroup4.Visible:=False; end;

procedure TForm1.RadioGroup5Click(Sender: TObject);

begin f:=0; if RadioGroup5.ItemIndex=3 then f:=f+1 else f:=f;
RadioGroup5.Visible:=False; end;

procedure TForm1.RadioGroup6Click(Sender: TObject);

begin g:=0; if RadioGroup6.ItemIndex=2 then g:=g+1 else g:=g;
RadioGroup6.Visible:=False; end;

procedure TForm1.RadioGroup7Click(Sender: TObject);

begin j:=0; if RadioGroup7.ItemIndex=1 then j:=j+1 else j:=j;
RadioGroup7.Visible:=False; end;

procedure TForm1.RadioGroup8Click(Sender: TObject);

begin l:=0; if RadioGroup8.ItemIndex=1 then l:=l+1 else l:=l;
RadioGroup8.Visible:=False; end;

procedure TForm1.RadioGroup9Click(Sender: TObject);

begin m:=0; if RadioGroup9.ItemIndex=3 then m:=m+1 else m:=m;
RadioGroup9.Visible:=False; end;

procedure TForm1.RadioGroup10Click(Sender: TObject);

begin n:=0; if RadioGroup10.ItemIndex=2 then n:=n+1 else n:=n;
RadioGroup10.Visible:=False; end;

{вывод вопроса и вариантов ответа в метке Label1 по
щелчку метки Label2(«Следующий вопрос»)}

procedure TForm1.Label2Click(Sender: TObject);

begin k:=k+1; case k of

1: begin Label1.Caption:=’2 вопрос. Массовое производство
компьютеров началось в:’;

RadioGroup2.Visible:=True; end;

2: begin Label1.Caption:=’3 вопрос. Элементной базой
процессоров ЭВМ 2-ого поколения являлись:’;
RadioGroup3.Visible:=True; end;

3:begin Label1.Caption:=’4 вопрос. Какое устройство не
предназначено для обработки информации?’;
RadioGroup4.Visible:=True; end;

4:begin Label1.Caption:=’5 вопрос. За минимальную единицу
измерения количества информации принят:’;
RadioGroup5.Visible:=True; end;

5:begin Label1.Caption:=’6 вопрос. Сколько байтов занимает
в памяти ПК слово ПОБЕДА?:’;

RadioGroup6.Visible:=True; end;

6:begin Label1.Caption:=’7 вопрос. Производительность
работы компьютера зависит от:’;

RadioGroup7.Visible:=True; end;

7:begin Label1.Caption:=’8 вопрос. Какое устройство может
оказывать вредное воздействие на здоровье
человека?’; RadioGroup8.Visible:=True; end;

8:begin Label1.Caption:=’9 вопрос. При выключении
компьютера вся информация стирается:’;

RadioGroup9.Visible:=True; end;

9:begin Label1.Caption:=’10 вопрос. В целях сохранения
информации дискеты необходимо оберегать от:’;
RadioGroup10.Visible:=True; Button2.Visible:=True;Label2.Visible:=False; end; end;

end;

{подсчёт правильных ответов и вывод результата
тестирования}

procedure TForm1.Button2Click(Sender: TObject);

begin p:= a+b+c+d+f+g+j+l+m+n; if p=10 then

begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10
вопросов.’+’ Отлично!’; end

else if p>=8 then

begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10
вопросов.’+’ Хорошо!’; end

else if p=7 then

begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10
вопросов.’+’ Удовлетворительно.’;

end else if p<7 then

begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10
вопросов.’+’ Плохо! Учите!’; end;

end;

{выход из программы по кнопке Button1}

procedure TForm1.Button1Click(Sender: TObject); begin close; end;

{выход из программы по щелчку пункта главного
меню «Выход»}

procedure TForm1.N2Click(Sender: TObject);

begin close; end;

{подключение формы AboutBox}

procedure TForm1.N4Click(Sender: TObject);

begin AboutBox.show; end;

{вывод информационного окна по пункту главного
меню «Инструкция»}

procedure TForm1.N5Click(Sender: TObject);

begin MessageDlgPos(‘Будьте внимательны при выборе
варианта ответа! Повторный выбор ответа на
вопрос недоступен!’,mtInformation,[mbOK],0,300,200); end; end.

4.Сохраните форму и проект в своей папке.

Создание тестирующей программы с
использованием компонентов

TLabel, TButton, TRadioGroup, TPageControl, TImage, TPanel, TMainMenu

Создание интерфейса приложения

1.Создайте проект 3 (презентация).

Для этого добавьте на форму следующие
компоненты:

  • компонент MainMenu, состоящий из пунктов: Тест
    (Результат, Выход) и Помощь (Инструкция, О
    программе);
  • метку для вывода результата теста в виде строки
    «:правильных ответов из 6 вопросов»;
  • компонент PageControl (страница WIN32), который содержит
    вкладки с номерами вопросов;
  • на каждую вкладку поместите метку с текстом
    вопроса и группу зависимых переключателей для
    вариантов ответов (RadioGroup) с 3-4 вариантами ответов;
  • кнопку выхода из программы;
  • компонент Image (страница ADDITIONAL);
  • шесть компонентов Panel разместить таким образом,
    чтобы закрыть компонент Image.

2.Задайте объектам следующие свойства.

Объект Свойство Значение
Форма Name Form1
  Caption Тестирующая программа по информатике
  Color clSkyBlue
MainMenu Name MainMenu1
Label    
(метка) Name Label1
  Caption
  Font MS Sans Serif, полужирный курсив, размер 14,
цвет красный
Label    
(метка) Name Label2,:, Label7
  Caption :(текст вопроса)
  Font MS Sans Serif, полужирный курсив, размер 12,
цвет тёмно-синий
Button    
(кнопка) Name Button1
  Caption Выход
  Font MS Sans Serif, полужирный курсив, размер 14,
цвет чёрный
Image Name Image1
  Visible True
  Stretch True
  Picture указать путь к рисунку
Panel Name Panel1,:,Panel6
  Caption 1,:6
PageControl Name PageControl1
  Active Pages TabSheet1
  Visible True
TabSheet1,:, TabSheet6 Name TabSheet1,:,TabSheet6
  Caption вопрос1,:,вопрос6
RadioGroup Name RadioGroup1, :, RadioGroup6
  Caption
  Items :(варианты ответов)
  ItemIndex 0,1,2,3 (индекс выбранного переключателя)

3.Сохраните проект (File -> Save All) в своей папке.

Написание кода

1. При написании кода программы следуйте
инструкции:

  • повторный выбор ответа на вопрос недоступен;
  • при правильном выборе ответа на вопрос
    открывается часть рисунка (компонент Image);
  • пункт главного меню «Результат» выводит в
    метке Label1 результат тестирования;
  • пункт главного меню «Выход» закрывает
    программу;
  • пункт главного меню «О программе» выводит окно
    формы About Box (для этого необходимо выполнить
    команду File -> New-> Other, закладка Forms, форма About );
  • пункт главного меню «Инструкция» выводит
    информационное окно.

2. Напишите программу теста в окне кода.

var Form1: TForm1;

{указание типа переменных (правильных ответов)}

m,n,k,w,l,s,z:integer; implementation uses Unit2; {$R *.dfm}

{выход из программы по кнопке Button1}

procedure TForm1.Button1Click(Sender: TObject);

begin close; end;

{проверка правильности ответов на поставленные
вопросы и при правильном выборе ответа на вопрос
открытие части рисунка }

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin n:=0; if RadioGroup1.ItemIndex=0 then begin n:=n+1; Panel1.Visible:=False; end
else n:=n;

RadioGroup1.Visible:=False; end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin m:=0; if RadioGroup2.ItemIndex=2 then begin m:=m+1;Panel2.Visible:=False; end
else m:=m;

RadioGroup2.Visible:=False; end;

procedure TForm1.RadioGroup3Click(Sender: TObject);

begin k:=0; if RadioGroup3.ItemIndex=0 then begin k:=k+1; Panel4.Visible:=False; end
else k:=k;

RadioGroup3.Visible:=False; end;

procedure TForm1.RadioGroup4Click(Sender: TObject);

begin w:=0; if RadioGroup4.ItemIndex=0 then begin w:=w+1; Panel3.Visible:=False; end
else w:=w;

RadioGroup4.Visible:=False;end;

procedure TForm1.RadioGroup5Click(Sender: TObject);

begin s:=0; if RadioGroup5.ItemIndex=1 then begin s:=s+1; Panel5.Visible:=False; end
else s:=s;

RadioGroup5.Visible:=False; end;

procedure TForm1.RadioGroup6Click(Sender: TObject);

begin z:=0; if RadioGroup6.ItemIndex=1 then begin z:=z+1; Panel6.Visible:=False; end
else z:=z;

RadioGroup6.Visible:=False;end;

{подсчёт правильных ответов и вывод результата
тестирования по пункту главного меню
«Результат»}

procedure TForm1.N3Click(Sender: TObject);

begin l:=m+n+k+w+s+z; Label1.Caption:=IntToStr(l)+’ правильных ответов
из 6 вопросов’; end;

{выход из программы по пункту главного меню
«Выход»}

procedure TForm1.N4Click(Sender: TObject);

begin close; end;

{подключение формы AboutBox}

procedure TForm1.N7Click(Sender: TObject);

begin AboutBox.show; end;

{вывод информационного окна по пункту главного
меню «Инструкция»}

procedure TForm1.N6Click(Sender: TObject);

begin MessageDlgPos(‘Будьте внимательны при выборе
варианта ответа!

Повторный выбор ответа на вопрос
недоступен!’,mtInformation,[mbOK],0,300,200); end; end.

3.Сохраните форму и проект в своей папке.

Литература

1. Анеликова Л.А. Тесты. Информатика и
информационные технологии. — Москва: Дрофа, 2004.

2. Валеева Ю.А. Объектно-ориентированное
программирование в среде Delphi. — Новокузнецк, 2003.

3. Дробахина А.Н., Можаров М.С. Структурирование
содержания профессиональной подготовки учителя
информатики средствами современного
гипертекста. — Новокузнецк, 2003.

Создание теста.

Компонент RadioGroup

Caption заголовок группы

Items задание строк
кнопок 

ItemIndex содержит
номер выбранной строки (нумерация с 0),
значение -1 означает что ни одна строка
не выбрана!

1.

2.

3.

4.

5.


RadioGroup

Варианты ответов
(список) создаем в свойстве Items
(RadioGroup при этом выделен)

Тест состоит, например, из 5 форм. На
каждой форме расположены вопрос, варианты
ответов, кнопка (New – Form
открытие новой формы, Shift
+ F12 перемещение между
формами).

Процедура пишется на кнопку Далее.
Во всей работе будет одна переменная
i: integer;
она глобальная. Описываем ее в месте,
где:

Var

Form1: TForm1;

i:integer;
вписываем сами

Implementation

Uses Unit2;

Описание глобальной переменной происходит
только в Unit1. Разработчик
теста должен знать правильный ответ,
т.к. это указывается в программе.

Процедура на
кнопку Далее:

Begin

If RadioGroup1.Itemindex=-1 then ShowMessage
(‘Забыли ответить
на вопрос!’)

Else

Begin if RadioGroup1.Itemindex=2 then i:=i+1;

Form2.show;

End;

Открываем новую форму (New
– Form) оформляем вопрос –
ответы, кнопка Далее:

Begin

If RadioGroup1.Itemindex=-1 then ShowMessage
(‘Забыли ответить
на вопрос!’)

Else

Beginif RadioGroup1.Itemindex=1 then i:=i+1;

Form2.Close;

Form3.Show;

End;

Начиная со
второго модуля
(Unit2), добавляем слово
Unit1 в то
место, где
идет перечисление:
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,

StdCtrls, ExtCtrls,unit1;

Аналогичную работу проделываем с формой
3 и 4.

На форме 5 располагаем вопрос, варианты
ответов, кнопку Готово и пишем процедуру
на эту кнопку

Begin

If RadioGroup1.Itemindex=-1 then ShowMessage
(‘Забыли ответить
на вопрос!’)

Else

Begin if RadioGroup1.Itemindex=3 then i:=i+1;

End;

Case i of

0,1,2: ShowMessage (‘Вы получили
2’);

3: ShowMessage (‘Вы получили
3’);

4: ShowMessage (‘Вы получили
4’);

5: ShowMessage (‘Вы получили
5’);

End;

Создали тест, делаем первый раз запуск
программы, появится окно, где нужно
выбирать YES, окно будет
появляться столько раз, сколько было
форм, это устанавливаются связи.

Первую форму
можно использовать для отображения
общей информации о тесте, например:

Используемые объекты:

Компонента

Свойство
(properties)

Значение

Events

Forma1

Caption

Методика
многофакторного исследования личности
Р. Кеттела

OnCreate

Memo1

Lines

очитстить

Font

Настроить
по своему вкусу

ScroollBars

ssVertical

Button1

Caption

Ok

OnClick

Весь текст отображаемый в объекте Memo1,
заранее сохранить в файле text.txt (название
может быть свое), в текущей папке проекта

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Lines.LoadFromFile (‘text.txt’);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.show;

end;

Добавление иллюстраций

Страница
библиотеки Additional
Класс TImage

Компонент
Image
дает
отображение на форме графического
изображения. Свойство Picture
позволяет
отобразить выбранное изображение в
приложении.

Св-во

Объявление
/ Описание

AutoSize

Указывает,
изменяется ли автомататом размер
компонента, подстраиваясь под размер
изображения.
По умолчанию значение
false — не подстраивается.

Center

Указывает,
должно ли изображение центрироваться
в поле компонента,
если
его размеры меньше размеров поля. При
значении false изображение располагается
в
верхнем
левом углу поля. Свойство не действует,
если AutoSize установлено в true или если
Stretch
установлено
в true и Picture содержит не пиктограмму.

Соседние файлы в папке №10

  • #
  • #

22

ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ЛУГАНСКОЙ НАРОДНОЙ РЕСПУБЛИКИ

«КИРОВСКАЯ СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА №3»

Практическая работа

урока информатики

Тема:Разработка тестовой программы в среде Delphi 7

Составитель: учитель информатики II категории

Петров Денис Сергеевич

2017 г.

Цель: приобрести практические умения и навыки разработки тестовых программ.

Задание

Создать проект в среде Delphi7, реализующий тест, в соответствии со следующими требованиями:

— в проект добавить пользовательские формы, отображающие каждый из вопросов Вашего теста;

— создать программный код для каждой программной формы, позволяющий вывести на формы содержание вопросов и ответов;

— реализовать анализ ответов обучаемого на вопросы теста, по желанию выполнив его либо после ответа на каждый вопрос, либо после ответов на все вопросы;

— предусмотреть итоговый вывод количества правильных и неправильных ответов.

Теоретические сведения

1 Этапы разработки программы

Определение требований к программе – один из важнейших этапов. На этом этапе подробно описывается исходная информация, и формулируются требования к результату. Кроме того, описывается поведение программы в особых случаях.

При разработке программы, предназначенной для работы в Windows, требования к ней могут включать пункты о желаемом виде диалоговых окон программы.

На этапе разработки алгоритма необходимо определить последовательность действий, которые надо выполнить для достижения поставленной цели, получения результата. Если задача может быть решена различными способами, и, следовательно, возможны различные варианты алгоритма решения, то, программист, используя некоторый критерий, выбирает наиболее подходящее решение. Затем составляется подробное составление алгоритма.

При программировании в Delphi основная работа программиста заключается в разработке подпрограмм. Задачу организации взаимодействия разработанных подпрограмм берет на себя Delphi. Также Delphi удобна для создания программ с визуальными компонентами, которые уже созданы в ней и имеют стандартный набор команд.

1.1 Постановка задачи

Поставленная задача заключалась в следующем. Необходимо создать программу для проведения текстовых проверок знаний в форме тестирования.

1.2 Язык программирования Delphi

Среда разработки Delphi ориентирована, прежде всего, на создание программ для семейства операционных систем Windows. При этом большое внимание уделяется возможности визуальной разработки приложений с помощью большого набора готовых компонентов, а в стандартную поставку Delphi входят основные объекты, которые образуют удачно подобранную иерархию из 270 базовых классов, позволяющих избежать ручного кодирования. Эти компоненты охватывают практически все аспекты применения современных информационных технологий.

В процессе построения приложения необходимо выбирать из палитры компоненты, на основе которых будет строиться проект. Еще до компиляции видно результаты своей работы. В этом смысле проектирование в Delphi мало чем отличается от проектирования в интерпретирующей среде, однако после выполнения компиляции получаем код, который исполняется в 10 раз быстрее, чем то же самое, сделанное при помощи интерпретатора. Среда Delphi включает в себя полный набор визуальных инструментов для скоростной разработки приложений, поддерживающей разработку пользовательского интерфейса.

    1. Пользовательский интерфейс

При запуске теста, показывается название программы и кнопка “Начать тест”.

После нажатия этой кнопки начинается сам тест, при этом откроется новое окно, а старое закроется.

При нажатии кнопки “Начать тест” на форме отобразится вопрос и четыре варианта ответа, выбор варианта ответа производится кликом мыши. Продолжение тестирования производится кнопкой “Ответить ” при этом на форме будут отображаться новые вопросы и четыре варианта ответа.

По окончании теста, программа подсчитает количество правильных ответов и выставит на их основе оценку тестируемого.

2 Описание исходных текстов программы

unit Unit2; // модуль главной формы

В этом модуле содержится несколько основных функций необходимых для работы программы.

Переменные.

var

Form2: TForm2;

Ini: TIniFile;

QuestNum: Integer;

QuestCount: Integer;

Scores: Integer;

Wrong: Integer;

ProgPath : string;

Count : integer;

2.1 Создание простейшей кнопки

Простейшей и, пожалуй, наиболее часто используемой кнопкой является кнопка Button расположенная на странице библиотеки Standard.

Основное с точки зрения внешнего вида свойство кнопки — Caption (надпись). В надписях кнопок можно предусматривать использование клавиш ускоренного доступа, выделяя для этого один из символов надписи. Перед символом, который должен соответствовать клавише ускоренного доступа, ставится символ амперсанта «&». Этот символ не появляется в надписи, а следующий за ним символ оказывается подчеркнутым. Тогда пользователь может вместо щелчка на кнопке нажать в любой момент клавишу Alt совместно с клавишей выделенного символа.

Основное событие любой кнопки — OnClick, возникающее при щелчке на ней. Именно в обработчике этого события записываются операторы, которые должны выполняться при щелчке пользователя на кнопке. Помимо этого есть еще ряд событий, связанных с различными манипуляциями клавишами и кнопками мыши.

Свойство Cancel, если его установить в true, определяет, что нажатие пользователем клавиши Esc будет эквивалентно нажатию на данную кнопку. Это свойство целесообразно задавать равным true для кнопок «Отменить» в различных диалоговых окнах, чтобы можно было выйти из диалога, нажав на эту кнопку или нажав клавишу Esc. Свойство Default, если его установить в true, определяет, что нажатие пользователем клавиши ввода Enter будет эквивалентно нажатию на данную кнопку, даже если данная кнопка в этот момент не находится в фокусе. Правда, если в момент нажатия Enter в фокусе находится другая кнопка, то все-таки сработает именно кнопка в фокусе.

Из методов, присущих кнопкам, имеет смысл отметить один — Click. Выполнение этого метода эквивалентно щелчку на кнопке, т.е. вызывает событие кнопки OnClick. Этим можно воспользоваться, чтобы продублировать какими-то другими действиями пользователя щелчок на кнопке. Пусть, например, вы хотите, чтобы при нажатии пользователем клавиши с символом «С» или «с» в любой момент работы с приложением выполнялись операции, предусмотренные в обработчике события OnClick кнопки Button1. Поскольку неизвестно, какой компонент будет находиться в фокусе в момент этого события, надо перехватить его на уровне формы. Такой перехват осуществляется, если установить свойство формы KeyPreview в true. Тогда в обработчике события формы OnKeyPress можно написать оператор

if (key=’C’ or key=’c’) then Button1.Click;

Если пользователь ввел символ «С» или «с», то в результате будет выполнен обработчик щелчка кнопки Button1.

2.2 Опции окна редактирования

В компоненте Edit вводимый и выводимый текст содержится в свойстве Text. Это свойство можно устанавливать в процессе проектирования или задавать программно. Выравнивание текста, как это имело место в метках и панелях, невозможно. Перенос строк тоже невозможен. Текст, не помещающийся по длине в окно, просто сдвигается, и пользователь может перемещаться по нему с помощью курсора. Свойство AutoSize в окнах редактирования имеет смысл, отличный от смысла аналогичного свойства меток: автоматически подстраивается под размер текста только высота, но не ширина окна.

Окна редактирования снабжены многими функциями, свойственными большинству редакторов. Например, в них предусмотрены типичные комбинации «горячих» клавиш: Ctrl-C — копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl-X — вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl-V — вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl-Z — отмена последней команды редактирования.

Edit можно использовать и просто как компоненты отображения текста. Для этого надо установить в true его свойство ReadOnly и целесообразно установить AutoSelect в false. В этом случае пользователь не сможет изменять отображаемый текст, и окно редактирования становится подобным меткам. При использовании окон редактирования для вывода, ввода и редактирования чисел необходимо использовать функции взаимного преобразования строк и чисел. Для вывода это описанные при рассмотрении меток функции FloatToStr и IntToStr. При вводе это функции StrToFloat — преобразование строки в значение с плавающей запятой, и StrToInt — преобразование строки в целое значение. Если вводимый текст не соответствует числу (например, содержит недопустимые символы), то функции преобразования генерируют исключение EConvertError.

Этот код обеспечивает сообщение пользователю об ошибке ввода и предотвращает ошибочные вычисления. Впрочем, это не лучший вариант предотвратить ошибочный ввод, поскольку пользователь узнает о своей ошибке только после того, как программа пытается использовать введенные данные. Лучше, если пользователь просто не сможет ввести неправильные символы. Например, если вы хотите, чтобы пользователь мог вводить в окно редактирования Edit только цифры и символ точки, вы можете в обработчик события OnKeyPress этого компонента вставить оператор:

if not (Key in [‘0’..’9′, ‘,’]) then Key := #0;

Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом, который не занесется в текст окна Edit.

Внешний вид формы (Form2) в дизайнере форм. Иерархия расположения компонентов на форме приведена на рис.1.

.

Рисунок 1 — Иерархия расположения компонентов на форме

2.3 Функции

Ниже я приведу описание функций:

1) функция, ss2nn которая переводит секунды в минуты + секунды в строковом формате (необходимо для подсчета времени прошедшего с начала тестирования):

function TForm2.ss2nn(Seconds: Integer): String;

var

nMin, nSec: Integer;

begin

{Проверяем, меньше чем 1/Min}

if Seconds 60 then Result := ‘0 минут ‘ + IntToStr(Seconds) + ‘ секунд’

else begin

{Определяем минуты}

nMin := Seconds div 60;

{Определяем секунды}

nSec := Seconds — (nMin * 60);

{Возвращаем результат}

Result := IntToStr(nMin) + ‘ минут ‘ + IntToStr(nSec) + ‘ секунд’;

end;

end;

Функции надо передать количество секунд и в результате мы получим значение типа string. Например, если мы передадим функции число 70, то получим в результате 1 минут 10 секунд.

2) процедура ShowQuestion — функция, которая загружает текст вопроса и варианты ответов, а так же показывает текст вопроса и варианты ответов на текстовых метках.

procedure TForm2.ShowQuestion;

var

Count, i: Integer;

begin

if (QuestNum QuestCount) and (QuestNum 0) then

begin

{ Если номер текущего вопроса больше чем должно быть показано и кол-во вопросов 0 то выполняем следующее….}

Form3 := TForm3.Create(self);//создаем форму с результатами тестирования

res := (Scores * 100) div QuestCount;// узнаем кол-во правильных ответов

Form3.Gauge1.Progress := res; // выводим правильные ответы на графике в %

Form3.Gauge2.Progress := 100res; //выводим кол-во неправильных ответов

//сколько всего вопросов….

Form3.Label5.Caption := ‘Вопросов в тесте: ‘+IntToStr(QuestCount);

//пишем на label кол-во правильных ответов

Form3.Label3.Caption := IntToStr(Scores);

//тоже самое, только неправильные

Form3.Label4.Caption := IntToStr(Wrong);

Timer1.Enabled:=False; //выключаем таймер времени

Form3.TimeLabel.Caption:=TimeLabel.Caption; //выводим время на label времени

Form3.ShowModal;// наконец показываем форму с результатами

Form2.close; //закрываем форму с вопросами end;

Если данное условие не выполняется, то…

Рассмотрим это фрагмент функции более подробно. Для загрузки вопросов я использовал класс TIniFile – этот класс используется для работы с iniфайлами. Список вопросов и ответов хранится в специально сформированном файле Test.ini, откуда программа их загружает. Вот вырезка из файла Test.ini:

[Тест]

Количество Вопросов=15

Название теста = Проверка знаний по русскому языку

[Вопрос №1]

Текст вопроса = Вставьте проверяемые безударные гласные А или О. Укажите слова с буквой О.

Текст кнопки 1 = ХВ__ТАТЬ

Текст кнопки 2 = К__РАТЕЛЬНЫЙ

Текст кнопки 3 = НАК__ПИТЬ ДЕНЬГИ

Текст кнопки 4 = НАСЛ__ЖДАТЬСЯ

Правильный вариант = 3

Ниже приведена процедура загрузки вопроса и вариантов ответов:

//загружаем текст вопроса

Label1.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст вопроса’, ‘Вопрос отсутствует’);

//загружаем варианты ответов

RadioButton1.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст кнопки 1’, ‘ERROR‘);

RadioButton2.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст кнопки 2’, ‘ERROR’);

RadioButton3.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст кнопки 3’, ‘ERROR‘);

RadioButton4.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст кнопки 4’, ‘ERROR’);

{Процедура загрузки завершена}

end;

В данной функции метод ReadString класса TIniFile собственно и производит загрузку начальных значений меток (label) с вопросом и вариантами ответов.

3 Процедуры

1) Процедура – обработчик события нажатия на кнопку «Начать тест»(Button1):

procedure TForm2.Button1Click(Sender: TObject);

begin

Count:=0;

Timer1.Enabled:=True;

Label10.Visible:=True;

TimeLabel.Visible:=True;

BitBtn1.Visible := true;

Panel3.Visible := true;

Button1.Visible := false;

Label9.Visible:=True;

BitBtn1.OnClick(self);

end;

Во время выполнения этой процедуры происходит показ всех нужных для правильной работы программы компонентов, запуск таймера, а также скрытие самой кнопки «Начать тест».

2) процедура – обработчик события нажатия на кнопку «Ответить»(Button):

procedure TForm2.BitBtn1Click(Sender: TObject);

var

Answer, CA: Integer;

begin

Answer := Ini.ReadInteger(Вопрос №’ + inttostr(QuestNum), ‘Правильный вариант’, —1);

if Answer 0 then Exception.Create(В файле с вопросами не написан правильный вариант’);

ca := 0;

if RadioButton1.Checked then

Ca := 1;

if RadioButton2.Checked then

Ca := 2;

if RadioButton3.Checked then

Ca := 3;

if RadioButton4.Checked then

Ca := 4;

if Ca = Answer then

inc(Scores)

else

inc(Wrong);

inc(QuestNum);

Label6.Caption := ‘Номер вопроса: ‘ + IntToStr(QuestNum);

Label8.Caption := ‘Правильных ответов: ‘ + IntToStr(Scores);

Label7.Caption := Неправильных ответов: ‘ + IntToStr(Wrong);

ShowQuestion;

end;

Читаем Правильный ответ из рабочего ini файла программы:

Answer := Ini.ReadInteger(‘Вопрос №’ + inttostr(QuestNum), ‘Правильный вариант’, -1);

Собственно определяем правильный ответ или нет

if Ca = Answer then

inc(Scores)

else

inc(Wrong);

Оператор Inc увеличивает значение указанной переменной на 1. Если да то +1 к правильным если нет, то +1 к неправильным.

3.1 Процедура работы таймера времени

procedure TForm2.Timer1Timer(Sender: TObject);

begin

Count:=Count+1;

TimeLabel.Caption:=ss2nn(Count);

end;

Начальное значение переменной Count – 0, с каждой секундой значение переменной увеличивается на 1, затем функцией ss2nn значение переводится в секунды + минуты (если нужно) и результат выводится на TimeLabel. На рисунке 2 приведена иллюстрация, демонстрирующая работу программы.

Рисунок 2 – Внешний вид программы

3.2 Форма с результатами тестирования (Form3/Unit3)

После того как программа закончила тестирование, она подсчитывает результаты, создает и показывает форму с результатами тестирования. Вид формы для результатов тестирования в дизайнере форм Delphi приведен на рисунке 3.

Рисунок 3 — Вид формы для результатов тестирования в дизайнере форм Delphi

Кнопка “Ok” на Form3 закрывает программу.

Процедуры.

Процедура – обработчик создания формы с результатами тестирования описана в предыдущем модуле (Unit2). Рассмотрим работу таймера, который собственно выставляет оценку.

procedure TForm3.Timer1Timer(Sender: TObject);

begin

if (Gauge1.Progress 40) then label7.Caption:=‘2’;

if (Gauge1.Progress = 40 )and (Gauge1.Progress 60) then label7.Caption:=‘3’;

if (Gauge1.Progress =60) and (Gauge1.Progress 90)

then label7.Caption:=‘4’; if Gauge1.Progress 90 then label7.Caption:=‘5’; end;

Приложение А

Модуль формы с вопросами.

program Project1;

uses

Forms,

Unit2 in ‘Unit2.pas’ {Form2},

Unit3 in ‘Unit3.pas’ {Form3};

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm2, Form2);

Application.Run;

end.

unit Unit2; // модуль главной формы

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Buttons, IniFiles, XPMan;

type

TForm2 = class(TForm)

Panel1: TPanel;

Label1: TLabel;

BitBtn1: TBitBtn;

Panel2: TPanel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Button1: TButton;

Panel3: TPanel;

Label2: TLabel;

RadioButton1: TRadioButton;

Label3: TLabel;

RadioButton2: TRadioButton;

Label4: TLabel;

RadioButton3: TRadioButton;

RadioButton4: TRadioButton;

Label11: TLabel;

Timer1: TTimer;

Label10: TLabel;

TimeLabel: TLabel;

XPManifest1: TXPManifest;

procedure FormCreate(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

{Обьявляем необходимые переменные}

QuestNum: Integer;

QuestCount: Integer;

Scores: Integer;

Wrong: Integer;

ProgPath : string;

public

res : Integer;

{Функция для перевода секунд в минуты + секунды}

function ss2nn(Seconds: Integer): String;

procedure ShowQuestion; {!!!Главная процедура для загрузки и показа

вопросов и ответов}

end;

var

Form2: TForm2;

Ini: TIniFile;

Count : integer;

implementation

uses Unit3;

{$R *.dfm}

{ TForm2 }

function TForm2.ss2nn(Seconds: Integer): String;

var

nMin, nSec: Integer;

begin

{Проверяем, меньше чем 1/Min}

if Seconds 60 then Result := ‘0 минут ‘ + IntToStr(Seconds) + ‘ секунд’

else begin

{Определяем минуты}

nMin := Seconds div 60;

{Определяем секунды}

nSec := Seconds — (nMin * 60);

{Возвращаем результат}

Result := IntToStr(nMin) + минут + IntToStr(nSec) + секунд’;

end;

end;

procedure TForm2.ShowQuestion;

var

Count, i: Integer;

begin

if (QuestNum QuestCount) and (QuestNum 0) then

begin

{если кол-во вопросов больше чем уже показанных и кол-во вопросов

0 то выполняем следушее….}

Form3 := TForm3.Create(self);//создаем форму с результатами тестирования

res := (Scores * 100) div QuestCount;// узнаем кол-во правильных ответов

Form3.Gauge1.Progress := res; // выводим правильные ответы на графике в %

Form3.Gauge2.Progress := 100res; //выводим кол-во неправильных ответов

//сколько всего вопросов….

Form3.Label5.Caption := ‘Вопросов в тесте: ‘+IntToStr(QuestCount);

//пишем на label кол-во правильных ответов

Form3.Label3.Caption := IntToStr(Scores);

//тоже самое, только неправильные

Form3.Label4.Caption := IntToStr(Wrong);

Timer1.Enabled:=False; //выключаем таймер времени

Form3.TimeLabel.Caption:=TimeLabel.Caption; //выводим время на label времени

Form3.ShowModal;// наконец показываем форму с результатами

Form2.close; //закрываем форму с вопросами

end;

//загружаем текст вопроса

Label1.Caption := Ini.ReadString(‘Вопрос №’ + inttostr(QuestNum), ‘Текст вопроса’, ‘Вопрос отсутствует’);

//загружаем варианты ответов

RadioButton1.Caption := Ini.ReadString(Вопрос №’ + inttostr(QuestNum), Текст кнопки 1′, ERROR);

RadioButton2.Caption := Ini.ReadString(Вопрос №’ + inttostr(QuestNum), Текст кнопки 2′, ‘ERROR’);

RadioButton3.Caption := Ini.ReadString(Вопрос №’ + inttostr(QuestNum), Текст кнопки 3′, ‘ERROR’);

RadioButton4.Caption := Ini.ReadString(Вопрос №’ + inttostr(QuestNum), Текст кнопки 4′, ‘ERROR’);

{Процедура загрузки завершена}

end;

{Процедура созлания формы с вопросами}

procedure TForm2.FormCreate(Sender: TObject);

begin

{Получаем путь папки где находится наша прога}

ProgPath := ExtractFileDir(Application.ExeName) + »;

Ini := TIniFile.Create(ProgPath + ‘Test.ini’);

Label1.Caption := Ini.ReadString(‘Тест’, ‘Название теста’, ‘Тест без названия’);

QuestNum := 0;

Scores := 0;

wrong := —1;

QuestCount := Ini.ReadInteger(‘Тест’, ‘Количество Вопросов ‘, -2);

Label5.Caption := ‘Всего вопросов в тесте: ‘ + IntToStr(QuestCount);

end;

procedure TForm2.BitBtn1Click(Sender: TObject);

var

Answer, CA: Integer;

begin

Answer := Ini.ReadInteger(‘Вопрос №’ + inttostr(QuestNum), ‘Правильный вариант’, -1);

if Answer 0 then Exception.Create(‘В файле с вопросами не написан правильный вариант’);

ca := 0;

if RadioButton1.Checked then

Ca := 1;

if RadioButton2.Checked then

Ca := 2;

if RadioButton3.Checked then

Ca := 3;

if RadioButton4.Checked then

Ca := 4;

if Ca = Answer then

inc(Scores)

else

inc(Wrong);

inc(QuestNum);

Label6.Caption := ‘Номер вопроса: ‘ + IntToStr(QuestNum);

Label8.Caption := ‘Правильных ответов: ‘ + IntToStr(Scores);

Label7.Caption := ‘Неправильных ответов: + IntToStr(Wrong);

ShowQuestion;

RadioButton1.Checked:=False;

RadioButton2.Checked:=False;

RadioButton3.Checked:=False;

RadioButton4.Checked:=False;

end;

procedure TForm2.Button1Click(Sender: TObject);

begin

Count:=0;

Timer1.Enabled:=True;

Label10.Visible:=True;

TimeLabel.Visible:=True;

BitBtn1.Visible := true;

Panel3.Visible := true;

Button1.Visible := false;

Label9.Visible:=True;

BitBtn1.OnClick(self);

end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// Ini.Free;

end;

procedure TForm2.Timer1Timer(Sender: TObject);

begin

Count:=Count+1;

TimeLabel.Caption:=ss2nn(Count);

end;

end.

Литература

  1. Бобровский С.И. Delphi 5 – М.: Питер, 2002.

  2. Гаевский A. Разработка программных приложений на Delphi 6 – М.: Киев, 2000.

  3. Зуев В. A. Turbo Pascal 6.0, 7.0. М.: Москва, 1998.

  4. Коцюбинский А.О., Грошев С.В. Язык программирования Delphi 5 – М.: Москва, 1999.

  5. Леонтьев В.И. Delphi 5 – М.: Москва, 1999.

  6. Моисеев А.С. Object Pascal – М.: Москва, 2000.

  7. Немнюгин С.А. Программирование – М.: Питер, 2000.

  8. Ремизов Н. C. Delphi – М.: Питер, 2000.

Приложение Б

Модуль формы с результатами тестирования

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Gauges, Buttons;

type

TForm3 = class(TForm)

Bevel1: TBevel;

Label1: TLabel;

Label2: TLabel;

Gauge1: TGauge;

Gauge2: TGauge;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

BitBtn1: TBitBtn;

Label6: TLabel;

Label7: TLabel;

Timer1: TTimer;

Label8: TLabel;

TimeLabel: TLabel;

procedure BitBtn1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

implementation

uses Unit1, Unit2;

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);

begin

Close;

end;

procedure TForm3.Timer1Timer(Sender: TObject);

begin

if (Gauge1.Progress 40) then label7.Caption:=‘2’;

if (Gauge1.Progress = 40 )and (Gauge1.Progress 60) then label7.Caption:=‘3’;

if (Gauge1.Progress =60) and (Gauge1.Progress 90)

then label7.Caption:=‘4’;

if Gauge1.Progress 90 then label7.Caption:=‘5’;

end; end.

ПРИЛОЖЕНИЕ В

Вопросы теста и ответы к ним из файла Test.ini.

[Тест]

Количество Вопросов=15

Название теста = Проверка знаний по русскому языку

[Вопрос №1]

Текст вопроса = Вставьте проверяемые безударные гласные А или О. Укажите слово с буквой О.

Текст кнопки 1 = ХВ__ТАТЬ

Текст кнопки 2 = К__РАТЕЛЬНЫЙ

Текст кнопки 3 = НАК__ПИТЬ ДЕНЬГИ

Текст кнопки 4 = НАСЛ__ЖДАТЬСЯ

Правильный вариант = 3

[Вопрос №2]

Текст вопроса = Вставьте проверяемые безударные гласные (E, И, А, Я). Укажите слово с буквой E.

Текст кнопки 1 = Щ_ПАТЬСЯ

Текст кнопки 2 = Ш__ПТАТЬСЯ

Текст кнопки 3 = СТРАШНОЕ ПРИВ__ДЕНИЕ

Текст кнопки 4 = ПР_СКАКАТЬСЯ

Правильный вариант = 2

[Вопрос №3]

Текст вопроса = Вставьте непроверяемые безударные гласные А или О. Укажите слово с буквой О.

Текст кнопки 1 = ДИ__ГОНАЛЬ

Текст кнопки 2 = АМ__РАЛЬНЫЙ

Текст кнопки 3 = УТР__МБОВАТЬ

Текст кнопки 4 = ПОЛ_ГАТЬ

Правильный вариант =2

[Вопрос №4]

Текст вопроса = Вставьте непроверяемые безударные гласные (E, И, Я). Укажите слово с буквой E.

Текст кнопки 1 = МЕЛ__ОРАЦИЯ

Текст кнопки 2 = СТАЖ__РОВКА

Текст кнопки 3 = ДИЛ__ТАНТ

Текст кнопки 4 = СТ__ПЕНДИЯ

Правильный вариант = 3

[Вопрос №5]

Текст вопроса = Вставьте чередующиеся безударные гласные А или О. Укажите слово с буквой О

Текст кнопки 1 = СОПРИК__СНОВЕНИЕ

Текст кнопки 2 = ИЗЛ__ГАТЬ

Текст кнопки 3 = ПРИК_САТЬСЯ

Текст кнопки 4 = НЕПРИК__САЕМЫЙ

Правильный вариант = 1

[Вопрос №6]

Текст вопроса = Вставьте чередующиеся безударные гласные Е или И.Укажите слово с буквой Е.

Текст кнопки 1 = ОТБЛ__СК

Текст кнопки 2 = ПРИЧ__ТАЮЩИЙСЯ

Текст кнопки 3 = НАЧ__НАЮЩИЙ

Текст кнопки 4 = ПОДЖ__ГАТЬ

Правильный вариант = 1

[Вопрос №7]

Текст вопроса = Вставьте О или Ё после шипящих. Укажите слово с буквой Ё

Текст кнопки 1 = ИСКАЖ__ННОЕ ИЗОБРАЖЕНИЕ

Текст кнопки 2 = Ш__КОВАЯ ТЕРАПИЯ

Текст кнопки 3 = ПИРОГ С АЛЫЧ__Й

Текст кнопки 4 = РЕЧ__НКА

Правильный вариант = 1

[Вопрос №8]

Текст вопроса = Вставьте звонкие или глухие согласные. Укажите слово со звонкой согласной (б, в, г, д, ж, з)..

Текст кнопки 1 = _ДАЧА

Текст кнопки 2 = КРОМЕ__НАЯ ТЬМА

Текст кнопки 3 = ПРО__ЬБА О ПОМОЩИ

Текст кнопки 4 = _ДЕСЬ

Правильный вариант = 4

[Вопрос №9]

Текст вопроса = Укажите слово, где нужна непроизносимая согласная.

Текст кнопки 1 = ТРОС__НИКОВЫЙ САХАР

Текст кнопки 2 = БЕЗЫСКУС__НОСТЬ

Текст кнопки 3 = ЖИВОПИС__НЫЙ ВИД

Текст кнопки 4 = ОПАС_НЫЙ

Правильный вариант = 1

[Вопрос №10]

Текст вопроса = Укажите слово, где не нужно добавить согласную.

Текст кнопки 1 = ГА__ЛЕРЕЯ

Текст кнопки 2 = ВЕТРЕН_ЫЙ ДЕНЬ

Текст кнопки 3 = КО__ТЕДЖ

Текст кнопки 4 = ТО__НЕЛЬ

Правильный вариант = 1

[Вопрос №11]

Текст вопроса = Укажите слово, где нужен разделительные Ъ.

Текст кнопки 1 = ТРАНС__АТЛАНТИЧЕСКИЙ

Текст кнопки 2 = НЕПОД__ЁМНЫЙ ГРУЗ

Текст кнопки 3 = ОП__ЯНЁННЫЙ

Текст кнопки 4 = ЗАМУЖ_

Правильный вариант = 2

[Вопрос №12]

Текст вопроса = Укажите в слово, в котором нужен Ь после шипящей.

Текст кнопки 1 = СПЛОШ_

Текст кнопки 2 = СМЕРЧ_

Текст кнопки 3 = С ПЛЕЧ__ ДОЛОЙ

Текст кнопки 4 = УЖ_

Правильный вариант = 1

[Вопрос №13]

Текст вопроса = Определите написание сложных слов. Укажите слово с дефисным написанием.

Текст кнопки 1 = МИКРО__ХИРУРГИЯ

Текст кнопки 2 = МНОГО__СТОРОННИЙ

Текст кнопки 3 = ЛИТЕРАТУРНО__МУЗЫКАЛЬНЫЙ

Текст кнопки 4 = ЖЕЛЕЗНО_ДОРОЖНЫЙ

Правильный вариант = 3

[Вопрос №14]

Текст вопроса = Определите написание сложных слов с ПОЛ-. Укажите слово с дефисным написанием.

Текст кнопки 1 = ПОЛ__ЗАРПЛАТЫ

Текст кнопки 2 = ПОЛ__ПОЛЬШИ

Текст кнопки 3 = ПОЛ__ШЕСТОГО

Текст кнопки 4 = ПОЛ_ДОСКИ

Правильный вариант = 2

[Вопрос №15]

Текст вопроса = Вставьте 3 или С в приставки. Укажите слово с приставкой на -3.

Текст кнопки 1 = И__ЖАРИТЬ

Текст кнопки 2 = __ДУТЬ

Текст кнопки 3 = НИ__ПАДАТЬ

Текст кнопки 4 = БЕ__ПОДОБНО

Правильный вариант = 1

Понравилась статья? Поделить с друзьями:
  • Как создать тест в гугл формах пошаговая инструкция для чайников
  • Как создать телеграмм канал с телефона пошаговая инструкция андроид
  • Как создать телеграмм канал пошаговая инструкция на телефоне
  • Как создать телеграмм канал пошаговая инструкция на русском языке на андроид
  • Как создать телеграмм канал пошаговая инструкция на русском языке на айфон