event binding-ActiveX problems | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Есть такая застарелая проблема в фоксе, как полное игнорирование положенными
на форму ActiveX контролами event-ов, генерируемых этими самыми контролами в результате программного вызова методов. К сожалению представить воспроизводимый пример затруднительно, ибо он должен по определению включать и C++ или Delphi код контрола, но надеюсь что я не останусь непонятым. Итак: 1) Имеем некоторый ActiveX контрол (необязательно "визуальный") выставляющий обработчик некоторого события, скажем Event1 в интерфейсе IMyControlEvents (IDispatch интефейс само собой). 2) Он (обработчик) нормально виден если компонент положить на форму (в Property Window он помечен как Event1 event). И в него можно записать свой фоксовый код. 3) Имеем для этого контрола некоторый метод, скажем Method1 в интерфейсе IMyControl (тоже IDispatch интефейс). Причём в процессе своей работы этот метод (Сишный или Delphi код) может периодически генерировать событие Event1 (ну т.е. вызывать клиентскую реализацию обработчика). 4) Делаем примитивный тест - помещаем контрол на форму (называем его oleCOM), прописываем код в обработчике Event1 например MESSAGEBOX("Вызван"). Помещаем на форме кнопку и в её Click пишем ThisForm.oleCOM.Method1() запускаем, нажимаем кнопку и наблюдаем полное отсуствие реакции фокса на такого типа событие. 5) Проводим тест аналогичный п.4 в другой среде - например в VB или C# - наблюдаем реакцию (обработчик вызывается). 6) Делаем чуть более сложный тест - из ObjectBrowser создаём шаблон класса реализующего интерфейс IMyControlEvents, прописываем MESSAGEBOX("Вызван") в тамошней реализации обработчика (IMyControlEvents_Event1). Проводим стандатную процедуру - создаём контрол через oCOM = CreateObject("MyLib.MyControl"), создаём объект из класса реализующего интерфейс oIF = CreateObject("VFPImplementClass") и связываем их по EVENTHANDLER(m.oCOM, m.oIF) и наконец вызываем интересующий нас метод oCOM.Method1() - наблюбаем отрабатывание нашего обработчика (что и требовалось!) Т.е. это не есть "принципиальная невозможность". P.S. Всё это работает совершенно одинаково как в VFP9PublicBeta так и в VFP8SP1 (и если мне не изменяет память, то и в VFP7SP1 и в VFP6SP5...) В общем нельзя ли наконец сделать поведение OleControl-контейнера более правильным в плане привязки к событиям содержащегося в нём ActiveX-а? P.P.S. SYS(2333) не помогает никак т.е. и в дефолтном режиме - 0 - vtable binding отключен, и в 1 - vtable включен никакой разницы не наблюдается. P.P.P.S. AFAIK именно в результате такого "непонятного" поведения фокса например не работает событие NodeChecked для MS TreeView Control, если отметку узла делать программно (и работает если делать её интерактивно - нажимая мышой на контроле). ------------------ WBR, Igor |
© 2000-2024 Fox Club  |