Delphi. Обработка событий компонент, созданных в Run-Time

Автор статьи: Банников Н.А. ©
Сайт Автора: нет
E-mail Автора: stikriz@nvrsk.ru
Дата публикации: 06.05.2005


В начале мне хотелось бы просто рассказать об общем принципе, на простом примере. Мы создадим в 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.