Как обратиться к вызвавшему объекту из обработчика?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Zmey
Сообщения: 3
Зарегистрирован: 04 май 2005, 18:06
Откуда: Москва

Тут у меня такой вопрос, может кто поможет новичку?
Мне надо сделать один обработчик для событий однотипных объектов, которые создаются программой во время её выполнения. Короче надо чтобы в обработчике можно было обратиться к объекту, который инициировал событие. Вот такой вопрос.
Zmey из полиграфа
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Во многих случаях можно сделать так

Создаешь процедуру типа
Procedure TForm1.OnClickProc(Sender :TObject);

Далее делаешь присвоение процедуры

Buttons[1,1].OnClick:=OnClickProc;

В самой процедуре, если это onClick, например, для доступа к контролу, вызвавшему событие, можно использовать
Form.ActiveControl
Zmey
Сообщения: 3
Зарегистрирован: 04 май 2005, 18:06
Откуда: Москва

Спасибо, идея понятна. Не понятно, как через Form.ActiveControl добраться, допустим до Edit.Text?
Zmey из полиграфа
Zroman
Сообщения: 75
Зарегистрирован: 20 апр 2005, 19:23
Откуда: Киев

Попробуй (Form.ActiveControl as TEdit)
Zmey
Сообщения: 3
Зарегистрирован: 04 май 2005, 18:06
Откуда: Москва

Ага, получилось. :D Дважды спасибо.
Только вот при загрузке программа вылетает, фокус ввода не установлен в нужном месте. Я, конечно, обошёл этот кусок, но может есть ещё какие-нибудь способы добраться до вызвавшего событие объекта?
Zmey из полиграфа
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

Можно ActiveControl:=edit1
или что-нибудь типа
if activecontrol.ClassName='TEdit' then действие для едита
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

проще...
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 ...
Изображение
Ответить