Форум пользователей Visio
http://visio.getbb.ru/

Перехватить удаление шейпа
http://visio.getbb.ru/viewtopic.php?f=6&t=1291
Страница 1 из 1

Автор:  powercat [ 12 фев 2018, 13:51 ]
Заголовок сообщения:  Перехватить удаление шейпа

Привет.
Много шейпов на листе. Нужно из внешней программы перехватить удаление произвольного.
Для чего нужно - при создании этих шейпов (из внешней же программы), для каждого из них создавался экземпляр класса для хранения данных. Соответственно, при удалении шейпа нужно и соответствующий экземпляр убить. Проблема в том, что убить шейп можно с листа без внешней проги...может перехватывать нажатие кнопки Del?
Как это сделать? Работа через библиотеку вижуо на C#, через контрол AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl - поле вижуо.

Автор:  Shishok [ 12 фев 2018, 13:59 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Имхо, надо настроить шейп так, чтобы его нельзя было удалить с листа. А при удалении внешней прогой эти настройки снимать.

Автор:  powercat [ 12 фев 2018, 14:04 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Shishok писал(а):
Имхо, надо настроить шейп так, чтобы его нельзя было удалить с листа. А при удалении внешней прогой эти настройки снимать.

Тоже так думал...
Сейчас склоняюсь к мысли перехвата нажатия на Del, т.к. удалять скорее всего будут именно так - как привыкли...

Автор:  Shishok [ 12 фев 2018, 14:06 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Цитата:
Сейчас склоняюсь к мысли перехвата нажатия на Del, т.к. удалять скорее всего будут именно так - как привыкли...

А как насчет Ctrl+X ?

Автор:  powercat [ 12 фев 2018, 14:52 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Да ну щас, на все проверки делать )))

Уже придумал, как решить - пусть удаляется, что угодно, потом просто перед анализом схемы пройти по списку имен экземпляров и проверить их на листе, и если их нет на листе - прибить в коллекции.

Автор:  Tumanov [ 12 фев 2018, 15:08 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

А традиционный путь чем не подходит?
Обычно ставят обработчик на BeforeShapeDelete. Например, на страницу. Хотя, можно и на документ.

Автор:  powercat [ 12 фев 2018, 15:43 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Tumanov писал(а):
А традиционный путь чем не подходит?
Обычно ставят обработчик на BeforeShapeDelete. Например, на страницу. Хотя, можно и на документ.


Да всем подходит, при условии работы под VBA...а я из c# пишу.
НО - может я просто не знаю, и можно обращаться к событиям вижуо из другой проги? Это было бы вообще суперотлично! Нда...что-то я опять туплю, оно же и так есть ))) Теперь понять бы, как это событие ээ...активировать что-ль? В VBA это просто закладки вверху страницы, а тут в виде Page.Before...
Можно пример на пару строк активации события?

Автор:  powercat [ 12 фев 2018, 16:17 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Повесить событие на контрол, выбрав его из списка событий - это просто.
Но шейпы-то я дропаю на лист...

Автор:  Tumanov [ 12 фев 2018, 16:19 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Ну, вот, что-то в таком духе...
Код:
        private bool Application_ShapeDelete(Visio.Selection target)
        {
            if (ActiveDoc == null) { return false; }
            if (!CheckDoc(ActiveApp.ActiveDocument )) { return false; }
            DelShape = target[1];
            DelOrder = 30;
            return true;
        }

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            this.Application.ViewChanged +=new Visio.EApplication_ViewChangedEventHandler(Application_ViewChanged);
            this.Application.MarkerEvent += new Visio.EApplication_MarkerEventEventHandler(Application_MarkerEvent);
            this.Application.DocumentCreated += new Visio.EApplication_DocumentCreatedEventHandler(Application_DocumentCreated);
            this.Application.DocumentOpened += new Visio.EApplication_DocumentOpenedEventHandler(Application_DocumentOpened);
            this.Application.BeforeDocumentClose +=new Visio.EApplication_BeforeDocumentCloseEventHandler(Application_BeforeDocumentClose);
            this.Application.BeforeDocumentSave += new Visio.EApplication_BeforeDocumentSaveEventHandler(Application_BeforeDocumentSave);
            this.Application.BeforeDocumentSaveAs +=new Visio.EApplication_BeforeDocumentSaveAsEventHandler(Application_BeforeDocumentSaveAs);
            this.Application.ShapeExitedTextEdit += new Visio.EApplication_ShapeExitedTextEditEventHandler(Application_ShapeExitedTextEdit);
            this.Application.QueryCancelSelectionDelete += new Visio.EApplication_QueryCancelSelectionDeleteEventHandler(Application_ShapeDelete);
...

Автор:  powercat [ 12 фев 2018, 16:25 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Непонятно ((
Вот есть событие
AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl.Document.Pages[1].BeforeShapeDelete
Не пойму, как с ним дальше быть...что-то куда-то надо далее разместить и записать...

Автор:  Tumanov [ 12 фев 2018, 17:04 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Там Visual Studio подсказывает, куда нажимать надо...
Вот попытался сделать картинку. Правда, подсказок не видно, но они есть :)
Сначала надо выбрать момент, когда этот обработчик подключать. У меня это в стартапе аддина. У Вас, естественно, будет другое место. Но это не важно.
Далее выбираем объект. На картинке это this.Application.ActivePage
Ставим точку и смотрим, какие события предложит Visual Studio. Выбираем нужное.
Пишем += и Visual Studio вывешивает пример подключения обработчика для этого события. Остается нажать Tab.
Ну и сам обработчик написать и куда-нибудь вставить.
Содержимое спрятано под спойлер ↓
Спойлер:
Вложение:
event.gif
event.gif [ 219.75 Кб | Просмотров: 463 ]

Автор:  powercat [ 13 фев 2018, 10:35 ]
Заголовок сообщения:  Re: Перехватить удаление шейпа

Не вдруг, но получилось.
Очередное большое БЛАГОДАРЮ )))

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/