Как попроще заменить обработчик события своим а потом восстановить оригинальный???
Вот пробую разобраться с написанием компонентов и столкнулся с проблемой...
В чем она заключается?
Например в процессе работы компонента нужно добавить какому-либо другому компоненту свою функцию реакции на событие…
Хотелось бы знать может есть более быстрый способ чем тот который выработался за долгое время моей практики (моих мучений).
Как я это делаю, могу описать (вдруг кто-то еще более страшным способом пользуется …)
Например нам нужно заменить фильтрующий обработчик таблицы
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 &))(DbTDataSet *,bool &)'.
Теперь после слова __closure нам только остается подставить имя указателя *Filter в котором мы будем хранить имя оригинального обработчика события
(Творчески отрезаем * она уже есть перед Filter и убираем повторение описания входных данных)
void __fastcall (__closure *Filter) (DbTDataSet *,bool &);
Ну а теперь использование всего этого в программе
Filter= Form1->Table->OnFilterRecord;
Form1->Table->onFilterRecord= tFilterRecord;
……. // код программы
// Возвращаем оригинальный обработчик на место
Form1->Table->OnFilterRecord =Filter;
С уважением HexoGenus
[ Это Сообщение было отредактировано HexoGenus в 2002-08-29 0910 ]
[ Это Сообщение было отредактировано HexoGenus в 2002-08-29 0911 ]