Подписка на события контролов для версии 3.2.x

Проблема возникает при использовании событий CheckBox контрола в COM объекте написанном на C#.
Отписаться от любого из событий не вызывает проблем и делается вот так:

Window.EventsDispatcher.UnsubscribeFromEvent("chbTest", "OnClick");

При попытке же подписаться на событие через "+=" отсутствуют события контролов:

var chbTest = (ICheckBox)Window["chbTest "];
var chbTest.OnClick += control => MessageBox.Show("Подписка на событие выполнена успешно!");

Подскажите каким образом можно подписаться на события.

P.S. С объектами наборов данных и самим окном у меня все получилось. Подозреваю, что может быть класс приведение к которому позволит решить мою проблему.

Нравится

10 комментариев

Вопрос актуален!

Здравствуйте, Роман.
По поводу первой ссылки мне в принципе непонятно, что вы предлагаете, т.к., например, кнопка не смогла у меня привестись к интерфейсу 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#. Если возможно, предоставьте их, пожалуйста.

Показать все комментарии