В начале мне хотелось бы просто рассказать об общем принципе, на
простом примере. Мы создадим в Run-Time кнопку и будем обрабатывать ее событие
OnClick. Кнопка у нас будет создаваться по нажатию на кнопку Button1.
procedure TForm1.Button1Click(Sender: TObject);
var New:
TButton;
begin
New:=TButton.Create(Form1);
New.parent:=form1;
New.Top:=100;
New.Left:=100;
New.Caption:='Нажми
меня';
New.Name:=New.ClassName+'1';
TButton(New).OnClick:=OnClickButton;
// Вот что нас здесь больше всего интересует!!!
end;
Здесь нет ничего сложного. Мы просто создаем объект типа TButton и задаем его
свойства. Но самое главное, что мы присвоили обработчику процедуры OnClick для
нашей кнопки процедуру OnClickButton, которая и будет выполнять все необходимые
действия. Нам осталось только описать эту процедуру.
Помещаем объявление процедуры в поле Private:
type
TForm1 = class(TForm)
Button1: TButton;
procedure
Button1Click(Sender: TObject);
private
{ Private declarations
}
Procedure OnClickButton( Sender : TObject );
public
{ Public
declarations }
end;
Ну а теперь остается самое простое - написать саму процедуру OnClickButton.
Самое простое что может прийти в голову - это вывести сообщение о нажатии на
кнопку. Теперь в теле программы мы пишем примерно следующее:
Procedure TForm1.OnClickButton( Sender : TObject
);
Begin
ShowMessage('Нажали на кнопку');
End;
Вот и все!!! По-моему невероятно просто.
Но в первой статье мы рассматривали еще и создание массива компонент в
Run-Time. Сейчас мы разберем обработку событий для этих компонент. Рассмотрим
это на примере поля ввода класса TEdit. Т.е. по нажатию на кнопку у нас будет
создаваться массив из 10 компонент TEdit.
Для разнообразия, объявим наш массив, как глобальную переменную:
var
Form1: TForm1;
mas:array[1..10] of
TEdit;
implementation
{$R *.DFM}
Изменим описание процедуры OnClick для кнопки Button1, что создавались наши
компоненты TEdit:
procedure TForm1.Button1Click(Sender:
TObject);
var
i:integer;
begin
for i:= 1 to 10 do
begin
Mas[i]:=TEdit.Create(Form1);
Mas[i].parent:=form1;
Mas[i].Top:=100+i*20;
Mas[i].Left:=100;
Mas[i].Text:='пробный
текст';
Mas[i].Name:=Mas[i].ClassName+inttostr(i); //задаем имя
компонентам
TEdit(Mas[i]).OnChange:=OnEditChange; //присваиваем
процедуру для обработчика события
end;
end;
Объявим процедуру OnEditChange в разделе Private (собственно это можно
сделать и в разделе Public):
Procedure OnEditChange( Sender : TObject );
И, наконец, напишем саму процедуру OnEditChange:
Procedure TForm1.OnEditChange( Sender : TObject
);
Begin
Form1.caption:=TEdit(sender).text;
End;
В результате работы этой процедуры заголовок формы будет содержать текст того
компонента TEdit, в котором производится ввод. С помощью Sender мы как раз и
указываем какой компонент инициировал это событие. Видите, все опять оказалось
просто :))
Ну вот, надеюсь что разрешил (хотя бы немного :)) проблему с обработкой
событий компонент, созданных в Run-Time.