Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как попроще заменить обработчик события своим а потом восстановить оригинальный???

442
29 августа 2002 года
HexoGenus
121 / / 20.03.2000
Hi, all.
Вот пробую разобраться с написанием компонентов и столкнулся с проблемой...
В чем она заключается?
Например в процессе работы компонента нужно добавить какому-либо другому компоненту свою функцию реакции на событие…
Хотелось бы знать может есть более быстрый способ чем тот который выработался за долгое время моей практики (моих мучений).
Как я это делаю, могу описать (вдруг кто-то еще более страшным способом пользуется …)
Например нам нужно заменить фильтрующий обработчик таблицы
Form1->Table->OnFilterRecord
на наш собственный а потом вернуть оригинальный обработчик на место.
Для этого напишем свой обработчик
void __fastcall Form1tFilterRecord(TDataSet *DataSet, bool &Accept)
{
……………
}
Объявим его в Unit1.h например в разделе private
void __fastcall tFilterRecord(TDataSet *DataSet, bool &Accept);
Теперь наша задача подставить на место базового обработчика наш собственный, но сначала нужно сохранить указатель на базовый обработчик.
Как ссылаться на функцию? Как я понимаю для этого используются специальные указатели __closure смотрим в справке их описание
<type> ( __closure * <id> ) (<param list>);
Теперь как определить как правильно описать наш указатель. Я для этого специально провоцирую ошибку
Form1->Table->onFilterRecord=5;
На что при компиляции приложения получаем описание ошибки от Билдера
Cannot convert 'int' to 'void (__fastcall * (__closure )(DbTDataSet *,bool &amp;))(DbTDataSet *,bool &amp;)'.
Теперь после слова __closure нам только остается подставить имя указателя *Filter в котором мы будем хранить имя оригинального обработчика события
(Творчески отрезаем * она уже есть перед Filter и убираем повторение описания входных данных)
void __fastcall (__closure *Filter) (DbTDataSet *,bool &amp;);

Ну а теперь использование всего этого в программе
Filter= Form1->Table->OnFilterRecord;
Form1->Table->onFilterRecord= tFilterRecord;
……. // код программы
// Возвращаем оригинальный обработчик на место
Form1->Table->OnFilterRecord =Filter;
С уважением HexoGenus


[ Это Сообщение было отредактировано HexoGenus в 2002-08-29 0910 ]

[ Это Сообщение было отредактировано HexoGenus в 2002-08-29 0911 ]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог