Проблема возникает при использовании событий CheckBox контрола в COM объекте написанном на C#.
Отписаться от любого из событий не вызывает проблем и делается вот так:
При попытке же подписаться на событие через "+=" отсутствуют события контролов:
var chbTest.OnClick += control => MessageBox.Show("Подписка на событие выполнена успешно!");
Подскажите каким образом можно подписаться на события.
P.S. С объектами наборов данных и самим окном у меня все получилось. Подозреваю, что может быть класс приведение к которому позволит решить мою проблему.
Нравится
Здравствуйте, Геннадий!
Возможно, помогут данные страницы sdk:
http://www.terrasoft.ru/sdk/IActiveXControl__SubscribeForEvent@[in]_BSTR@[in]_BSTR.html
Здравствуйте, Роман.
По поводу первой ссылки мне в принципе непонятно, что вы предлагаете, т.к., например, кнопка не смогла у меня привестись к интерфейсу IActiveXControl. Кроме этого если взглянуть на сигнатуру метода:
[id(209104)]
HRESULT SubscribeForEvent(
[in] BSTR ObjectMethodName,
[in] BSTR ScriptMethodName
);
то лично мне становится очевидным, что для того, чтобы что-то как-то заработало надо передать название события и метод скрипта для подписки. Где здесь можно "втиснуть" мой ком компонент, чтобы передать метод из него - непонятно.
Что касается второй ссылки, то именно ее я и обкатывал со всех сторон пока не выбился из сил.
Напомню сигнатуру:
[id(108409)]
HRESULT SubscribeForEvent(
[in] BSTR ObjectID,
[in] IDispatch* ObjectInstance,
[in] BSTR ObjectCoClassGUID,
[in] BSTR ObjectMethodName,
[in] BSTR ScriptMethodName,
[out, retval] IObjectEventsDispatcher** Value
);
Удалось сделать все тоже самое, что и для SubscribeForEvent, даже более того видно, что можно определить метод для события которое находится в другом скрипте.
Каким образом "запилить" в эти две функции мой новоиспеченный COM объект - неизвестно и судя по сигнатуре не представляется возможным!
Хотелось бы "скормить" любую произвольную функцию (даже private) из моего COM объекта. Не понятно почему такие сложности ведь из .Net "+=" работает при подписке на события объекта датасета:
Dataset.EventsDispatcher.UnsubscribeFromEvent("DatasetName", "OnDatasetAfterAppend"); Dataset.OnDatasetAfterAppend += control => BaseTaskInProcessOnDatasetAfterAppend(Dataset);
Вот пример на JavaScript для обработки клика по чек-боксу
var EventsDispatcher = Object(); var CheckBoxGUID = '{2FBAC2DA-2DEF-49FD-A0AE-9327D82303BC}'; function btnButtonOnClick(Control) { // создаём СОМ-объект диспетчера событий EventsDispatcher = System.CreateObject('TSObjectLibrary.EventsDispatcher'); // создаём СОМ-объект коннектора var Connector = System.CreateObject('TSObjectLibrary.Connector'); // присваиваем скрипт окна с чек-боксом EventsDispatcher.Script = Connector.Services.GetSingleItemByUSI('wnd_Window7Script'); // получаем окно с чек-боксом var Window = Connector.Services.GetNewItemByUSI('wnd_Window7'); // получаем чек-бокс var CheckBox = Window.ComponentsByName('chbCheckBox'); Window.Prepare(); Window.Show(); // подписываемся на событие EventsDispatcher.SubscribeForEvent('chbCheckBox', CheckBox, CheckBoxGUID, 'OnClick', 'CheckBoxOnClick'); } function CheckBoxOnClick(Control) { // в обработчике события показываем MessageBox MessageBox('Click!'); }
Максим, спасибо!
Но я это все умею.
Я хочу переопределять события в С# а не в JavaScript и указывать не метод из скриптов Terrasoft а свой абсолютно произвольный метод который у меня уже написан в одном из классов на C#.
Геннадий, на какой конкретно версии Вы выполняете подписку на событие из C#? Попробуйте применить указанный в примере код в конфигурации, отрабатывает ли?
Я проверил функциональность на 3.2.1.62 - событие OnClick отрабатывает корректно.
"Величко Максим Анатольевич" написал:Геннадий, на какой конкретно версии Вы выполняете подписку на событие из C#?
Билд: 3.2.0.86
"Величко Максим Анатольевич" написал:Попробуйте применить указанный в примере код в конфигурации, отрабатывает ли?
Нечего даже пробовать - ваш пример рабочий. И в javascript и переделанный в с# ваш код отработает.
"Величко Максим Анатольевич" написал:Я проверил функциональность на 3.2.1.62 - событие OnClick отрабатывает корректно.
Не совсем понимаю, что вы хотите этим сказать... OnClick и в моем билде отрабатывает без проблем.
Геннадий, предоставьте, пожалуйста, исходники примера C# приложения из которого необходимо подписываться на события нашего COM-контрола.
Добрый день, Роман!
Не совсем понятно, что вы хотите что-бы я предоставил. Кроме того у меня не COM-контрол...
Геннадий, специалисты департамента разработки запрашивают исходники Вашего примера приложения на C#. Если возможно, предоставьте их, пожалуйста.