Пытаюсь сделать Container в Visio 2007.
Так как организация работает с 2007 (и переходить на другой офис в ближайшее время не планирует), жизнь заставляет делать контейнер.
Напомню - Контейнер отличается от Группы тем, что:
1) фигуры в Контейнер помещаются автоматически (для того, чтобы в фигура автоматически помещалась в группу нужно, чтобы в группе стоял флаг, что она может принимать, а в принимаемой фигуре должен стоять флаг, что она может приниматься).
2) в Контейнере фигуры привязаны к верхнему левому углу, а в Группе к левому нижнему
3) в Контейнере фигуры не изменяют свое положение и размер при изменении размера Контейнера (в Группе по умолчанию фигуры меняют свой размер вместе с группой, или положение - при установке особого флажка в поведении)
4) Контейнер сжимается только до размера вложенных фигур - группа - не ограничена.
Сейчас в тестовом проекте реализована обработка драг-дроп. Принимающая фигура подсвечивает рамку красным цветом. Когда фигура отпускается в нее прописываются формулы, которые привязывают ее к верхнему левому углу Контейнера, но тут же стираются простыми числами-значениями (это делает системное событие Drop). Как от этого отвязаться?
Вложение:
dragdrop project.png [ 7.88 Кб | Просмотров: 479 ]
Немного о проекте, пойду по значимости:
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 будет автоматически перемещаться за ней (формулы не сделаны защищенными!)
Вот это-то и должно происходить при отпускании фигуры по моей задумке.