All Forums
 Категория Visio
 Форум Вопросы и ответы
 проблема взаимодействия с Undo
Author Previous Topic Topic Next Topic  

9rey

Russia
30 Posts

Posted - 01/13/2012 :  06:20:19
Всем привет.

Я конечно подозреваю, что вряд ли кто-то ответит, т.к. проблема очень специфическая, но все-таки...

есть обработчик события на копирование или дублирование шейпа/группы шейпов. в нем я новому шейпу после копирования задаю shape.name, какой мне надо. далее это имя помещается в TreeView control (дерево-список) на моей форме.

далее мне надо учесть, что пользователь после копирования или через какое-то время нажал "отмена" (Undo), т.е. новый скопированный шейп Visio удалит. я должен это отследить (по событию BeforeShapeDelete или еще какому-то) и убрать соответствующий пункт из TreeView control.

вот и всё! но. столкнулся с проблемой, что в Визио копирование происходит так:

есть шейп с именем name1. при копировании Visio обзывает сам новый шейп например так - name1.5, т.е. дает уникальное имя на странице. и только потом мой обработчик меняет name1.5 на name2 (как мне и надо).
имеем: name1 -> name1.5 -> name2
далее пользователь нажимает "отмена" и я ловлю событие BeforeShapeDelete, но только шейпа name1.5, и соответственно не могу получить name2, чтобы удалить эту запись из TreeView.

события до BeforeShapeDelete я смотрел, начиная с возникновения события входа в Undo (событие EnterScope) - нету никаких намеков на мой шейп name2. ниоткуда не могу его вытащить!

как мне получить в ходе операции "отмена" последнее (name2) имя моего шейпа, который удаляется по undo?? весь мозг сломал

Tumanov

Russia
1198 Posts

Posted - 01/13/2012 :  14:51:48
А если проверять NameID?
Оно ведь не меняется при Вашем переименовании.
Go to Top of Page

9rey

Russia
30 Posts

Posted - 01/13/2012 :  15:51:29
в том то и дело, что надо видеть новое имя!
все, что не меняется - мне не нужно, вся суть копирования шейпа в том, что создается шейп с новым именем, которое мне нужно поймать на "отмене".

вот попробуйте сами простой пример:
копируйте шейп, отследите например событие ShapeAdded. в новом шейпе замените имя на свое.
нажмите "отмена" и сделайте так, чтобы вывелось это имя. никаких вспомогательных средств не используя. только события при "отмене" и св-ва отменяемого шейпа.
Go to Top of Page

9rey

Russia
30 Posts

Posted - 01/14/2012 :  09:53:30
ладно. решил не париться.

создам вспомогательный массив структур с указателями на шейпы и именами в дереве-списке.
что-то типа:
Type myShape
sh as visio.shape
name as String
End Type


dim mycoll as new Collection


добавлять буду например так:
dim shp as myShape
set shp.sh = новый скопированный шейп
shp.name = (новый скопированный шейп).name

mycoll.add shp, CStr(ObjPtr(shp))


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

плевать на этот метод Undo, какой-то он мутный.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)