for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

event binding-ActiveX problems
Igor Korolyov
Автор

Сообщений: 34119
Дата: 18.07.04 03:35:03
Есть такая застарелая проблема в фоксе, как полное игнорирование положенными
на форму 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
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 16 Sawradym PaulWist  (Гостей: 14)

© 2000-2021 Fox Club 
Яндекс.Метрика