События основной надписи чертежа

Автор lyret59, 26.07.21, 22:18:04

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

lyret59

Всем доброго времени суток. Пытаюсь написать библиотеку, с помощью которой можно по двойному клику в ячейке штампа чертежа выполнить какую-либо функцию. В SDK нашёл интерфейс ksStampNotify, пытался написать следующий код:
     
      KompasObject kompas = (KompasObject)Marshal.GetActiveObject("KOMPAS.Application.5");
            ksDocument2D document2D = (ksDocument2D)kompas.ActiveDocument2D();
            ksStamp stamp = (ksStamp)document2D.GetStamp();
            ksStampNotify stampNotify = (ksStampNotify)stamp;
но на последней строке получаю ошибку: System.InvalidCastException: "Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Kompas6API5.ksStampNotify". Пытался так же использовать интерфейс для COM: IStampNotify, но та же самая ошибка. Для COM использовал указатель не на штамп, а на документ как написано в SDK. Интерфейс.png

Рассматривал примеры Step12 и EventsAuto из SDK, понял только, что событие необходимо подписать, но как тоже не понял.
Если у кого есть пример, либо кто-то сможет объяснить что и как, буду очень благодарен! Так же, если кто-нибудь может объяснить в чём отличие Automation от COM было бы тоже очень здорово, так как пытался и то и то использовать, а ошибка одна и та же. ::)

Vi2

Вроде спецы по Шарпу отвечают, что это проще пареной репы. Я - по нему не спец, так что, если нужно, могу дать объяснение и решение на VB.

После присвоения переменной (в твоём случае stamp = (ksStamp)document2D.GetStamp()) у этой переменной становятся доступными методы его событийного интерфейса. Туда нужно присвоить обработчик этого события через оператор +=.

Примерно как в примере EventsAuto
this.btnOK = new System.Windows.Forms.Button();
...
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
т.е.
<имя переменной>.<имя событийного метода> += <имя метода-обработчика этого событийного метода>

Хотя в примере этот обработчик передаётся через EventHandler, но вроде про него ничего не говорили.

Vi2

Разницы между Automation и COM фактически уже нет. Так что можно рассматривать их синонимы.