Как обратиться к вызвавшему объекту из обработчика?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Тут у меня такой вопрос, может кто поможет новичку?
Мне надо сделать один обработчик для событий однотипных объектов, которые создаются программой во время её выполнения. Короче надо чтобы в обработчике можно было обратиться к объекту, который инициировал событие. Вот такой вопрос.
Мне надо сделать один обработчик для событий однотипных объектов, которые создаются программой во время её выполнения. Короче надо чтобы в обработчике можно было обратиться к объекту, который инициировал событие. Вот такой вопрос.
Zmey из полиграфа
Во многих случаях можно сделать так
Создаешь процедуру типа
Procedure TForm1.OnClickProc(Sender :TObject);
Далее делаешь присвоение процедуры
Buttons[1,1].OnClick:=OnClickProc;
В самой процедуре, если это onClick, например, для доступа к контролу, вызвавшему событие, можно использовать
Form.ActiveControl
Создаешь процедуру типа
Procedure TForm1.OnClickProc(Sender :TObject);
Далее делаешь присвоение процедуры
Buttons[1,1].OnClick:=OnClickProc;
В самой процедуре, если это onClick, например, для доступа к контролу, вызвавшему событие, можно использовать
Form.ActiveControl
Спасибо, идея понятна. Не понятно, как через Form.ActiveControl добраться, допустим до Edit.Text?
Zmey из полиграфа
Попробуй (Form.ActiveControl as TEdit)
Ага, получилось.
Дважды спасибо.
Только вот при загрузке программа вылетает, фокус ввода не установлен в нужном месте. Я, конечно, обошёл этот кусок, но может есть ещё какие-нибудь способы добраться до вызвавшего событие объекта?

Только вот при загрузке программа вылетает, фокус ввода не установлен в нужном месте. Я, конечно, обошёл этот кусок, но может есть ещё какие-нибудь способы добраться до вызвавшего событие объекта?
Zmey из полиграфа
Можно ActiveControl:=edit1
или что-нибудь типа
if activecontrol.ClassName='TEdit' then действие для едита
или что-нибудь типа
if activecontrol.ClassName='TEdit' then действие для едита
проще...
if ActiveControl is TEdit then with ActiveControl as TEdit do
begin
{}
end;
if ActiveControl is TEdit then with ActiveControl as TEdit do
begin
{}
end;
С уважением, Lost Angel...
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
Вообще-то объект инициировавший событие это Sender 0 передаётся параметром а дальше:
Код: Выделить всё
if Sender is TEdit then // это если совсем разные объекты цеплять
if (Sender as TEdit).Text = '' then ...
