Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 21 ноя 2018, 06:29

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Drag and drop
СообщениеДобавлено: 18 июн 2018, 15:27 
Не в сети
Бывалый

Зарегистрирован: 19 июн 2015, 22:18
Сообщений: 101
Использую Visio c: 2013
Очков репутации: 21

Добавить очки репутацииУменьшить очки репутации
Пытаюсь сделать Container в Visio 2007.
Так как организация работает с 2007 (и переходить на другой офис в ближайшее время не планирует), жизнь заставляет делать контейнер.

Напомню - Контейнер отличается от Группы тем, что:
1) фигуры в Контейнер помещаются автоматически (для того, чтобы в фигура автоматически помещалась в группу нужно, чтобы в группе стоял флаг, что она может принимать, а в принимаемой фигуре должен стоять флаг, что она может приниматься).
2) в Контейнере фигуры привязаны к верхнему левому углу, а в Группе к левому нижнему
3) в Контейнере фигуры не изменяют свое положение и размер при изменении размера Контейнера (в Группе по умолчанию фигуры меняют свой размер вместе с группой, или положение - при установке особого флажка в поведении)
4) Контейнер сжимается только до размера вложенных фигур - группа - не ограничена.

Сейчас в тестовом проекте реализована обработка драг-дроп. Принимающая фигура подсвечивает рамку красным цветом. Когда фигура отпускается в нее прописываются формулы, которые привязывают ее к верхнему левому углу Контейнера, но тут же стираются простыми числами-значениями (это делает системное событие Drop). Как от этого отвязаться?

Вложение:
dragdrop project.png
dragdrop project.png [ 7.88 Кб | Просмотров: 112 ]


Немного о проекте, пойду по значимости:
mdlInitEvents - инициализация событий. Для того, чтобы проект заработал нужно запустить Initialize (в дальнейшем привяжу к открытию документа или т.п.)

clsEvent - класс для реализации событий Drag-Drop

mdlDragDrop - процедуры, которые вызываются при событиях DragBegin, DragOver, DragEnd

clsSelectBox - вспомогательный класс для отслеживания положения выделенной рамки, которая движется вместе с курсором

clsTargetDropFrame - вспомогательный класс для подсветки рамки фигуры

mdlContainer - процедуры для реализации действий с Контейнером. Сейчас здесь только одна процедура - добавление фигуры в группу.

Итак: mdlInitEvents - создает объект класса clsEvent, который и начинает обрабатывать события.
При обработке событий вызываются процедуры из mdlDragDrop.
При этом используются классы clsSelectBox и clsTargetDropFrame.
При отпускании для всех перетаскиваемых фигур вызывается процедура AddToMyContainer1 из mdlContainer.

Но увы, формулы затираются. Что делать? Кто-нибудь работал с Drag-Drop? На форуме и в книгах ничего не нашел.

Еще раз - чтобы проект заработал нужно запустить Initialize из mdlInitEvents.
После этого можно брать меньшие фигуры и перетаскивать в большие. Рамка будет подкрашиваться красным цветом.

В mdlContainer есть пример вызова процедуры привязки фигуры Sheet.2 к Sheet.1 - процедура CallAddToMyContainer.
После ее вызова при перемещении Sheet.1 - Sheet.2 будет автоматически перемещаться за ней (формулы не сделаны защищенными!)
Вот это-то и должно происходить при отпускании фигуры по моей задумке.


Вложения:
test_drag_drop.vsd [63 Кб]
Скачиваний: 6
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Drag and drop
СообщениеДобавлено: 18 июн 2018, 18:21 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1187
Очков репутации: 100588

Добавить очки репутацииУменьшить очки репутации
1. А Вам точно необходима техника Drag&Drop?
Обычно она используется для перетаскивания чего-либо между приложениями. Например, из Блокнота в Visio.
А в пределах Visio вроде бы достаточно более простых ShapeAdded, EventXFMod, EventDrop, в крайнем случае CellChanged.
Может тогда и все проблемы исчезнут.
2. Можно попробовать вписывать свои формулы не до, а после каких-то штатных операций.
Например, сначала сохранить сам факт, что с этим шейпом надо бы что-то сделать, потом дождаться события VisioIsIdle (к этому времени все штатные операции должны бы закончиться) и для тех шейпов, которые находятся в стеке, провести вторую фазу операции - прописывание формулы.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Drag and drop
СообщениеДобавлено: 18 июн 2018, 19:24 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 591
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
+1. Я бы тоже рекомендовал прописывать значения пост-фактум. Прописывание незащищенных формул - путь в никуда.
То есть, можно отслеживать изменения размеров и положения "контейнера", и перемещать его "элементы", если нужно. Для этого надо знать, кто в каком контейнере, т.е. где-то хранить эту информацию (в самих фигурах, скорее всего). По сути, нужно воссоздать всю инфраструктуру контейнеров.

Реализация подсветки drag&drop через изменение фигуры (ее цвета линий) - плохая идея, undo/redo скорее всего будет замусорен, и пользовательские фигуры сломаны.
IMHO, лучше никак, чем так.

Да, в Visio 2007 есть CFF (Cross-Function-Flowchart) - шаблон + пристегнутый к нему плагин.
Те самые контейнеры, которые ты реализуешь, по сути. Может быть, подойдет?

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB