Private

{ Private declarations } public

{ Public declarations } end;

В отличие от других, сгенерированных Delphi, строк объявления типа, строка procedure SelectorClick(Sender: TObject) вставлена В объявление вручную.

Примечание

При создании процедуры обработки события для обычного компонента (компонента, который добавлен в форму во время разработки формы программы) Delphi автоматически генерирует заготовку процедуры обработки события и ее объявление. Программист должен написать только инструкции процедуры.

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

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

selector[1].OnClick : = SelectorClick;

задает процедуру обработки события Onclick для компонента selector [i]. В листинге 15.2 приведен полный текст программы Тест, версия 2.

Листинг 15.2. Программа тестирования, версия 2

unittest2_;

Interface

Uses

SysUtils, WinTypes, WinProcs,

Messages, Classes, Graphics,

Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

Type

TForm1 = class(TForm)

Label5: TLabel; // поле вывода вопроса

Image1: TImage; // область вывода иллюстрации

Panel1: ТPanel; Button1: TButton;

// кнопка Ok, Дальше, Завершить

procedureFormActivate(Sender: TObject);

procedureFormCreate(Sender: TObject);

procedureButtonlClick(Sender: TObject);

procedureSelectorClick(Sender: TObject);

Private

{ Private declarations } public

{ Public declarations } end;

Var

Form1: TForm1; // форма

Implementation

Const

N_ANSWERS=4; // четыре варианта ответов

N_LEVEL=4; // четыре уровня оценки

Var

// динамически создаваемые компоненты

answer: array[1..N_ANSWERS] ofTLabel;

// альтернативные ответы

selector: array[1..N_ANSWERS+1] ofTRadioButton;

// кнопки выбора ответа

f:TextFile;

fn:string;// имя файла вопросов

level:array[1..N_LEVEL] ofinteger;

// сумма, соответствующая уровню

mes:array[1..N_LEVEL] of string;

// сообщение, соответствующее уровню

score:array[1..N_ANSWERS] ofinteger;

// очки за выбор ответа

summa:integer; // набрано очков

vopros:integer; // номер текущего вопроса

n_otv:integer; // число вариантов ответа

otv:integer; // номер выбранного ответа

// установка формы в исходное состояние

ProcedureResetForm(frm:TForm1);

Var

i:integer; begin

for i:=1 toN_ANSWERS do begin

answer[i].width:=frm.ClientWidth-answer[i].left-5;

answer[i].Visible:=FALSE; Selector[i].Visible:=FALSE;

end;

frm. Label5.width:=frm.ClientWidth-frm.Label5.left-5;

frm. Image1.Visible:=False;

end;

// определение достигнутого уровня

procedureItog(suirana:integer;frm:TForm1);

Var

i:integer; buf:string;

begin buf: = ";

str(summa:5,buf); buf:='Результаты тестирования'+chr(13)

+'Всего баллов: '+buf; i:=1;

while(summa < level[i]) and(i<N_LEVEL) do

i:=i+l;

buf:=buf+chr(13)+mes[i];

frm.Labels.caption:=buf;

end;

procedureTForm1.FormCreate(Sender: TObject);

Var

i: integer; begin

// создадим пять меток для вывода вопроса и альтернативных ответов

fori:=l toN_ANSWERS do

Begin

answer[i]:=TLabel.Create(self);

answer[i].Parent:=Forml;

answer[i].Left:=36;

answer[i].Wordwrap:=True;

end;

// создадим переключатели для выбора ответа

fori:=l toN_ANSWERS+1 do

Begin

selector[i]:=TRadioButton.Create(self);

selector[i].Parent:=self;

selector[i].Caption:='';

selector[i].Width:=17;

selector[i].Left:=16;

selector[i].Visible:=False;

selector[i].Enabled:=True;

selector[i].OnClick:=SelectorClick;

end;

ResetForm(Forml); end;

// вывод начальной информации о тесте

procedureinfo(var f:TextFile;l:TLabel);

Var