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