Author |
Topic |
|
sensey
1 Posts |
Posted - 06/15/2007 : 02:11:53
|
Добрый день, уважаемые участники форума! Вопрос у меня следующий. Надо создать фигуру скажем в виде поделённого напополам вертикальной линией прямоугольника. Фишка в том, что в правую его сторону надо вставлять рисунок. Можно ли это сделать так, чтоб рисунок сразу связывался с основной фигурой и при её перемещении двигался синхронно И ещё одно. Поидее в контекстном меню двухмерной фигуры в пункте "Поведение" можно настроить, чтоб по двойному щелчку на этой фигуре редактировался текст фигуры. Но почему-то это у меня не работает. Не подскажете, в чём тут дело или есть ли какой-то другой способ редактировать текст внутри фигуры? Большое спасибо за помощь. |
|
Michael
49 Posts |
Posted - 06/15/2007 : 19:06:36
|
1. Можно привязать значения ячеек PinX и PinY добавленного рисунка к соответствующим значениям основной фигуры формулами. Пусть основная фигура идет первым номером, тогда в PinX рисунка добавляем формулу =GUARD(Sheet.1!PinX+Sheet.1!Width/2) в PinY - =GUARD(Sheet.1!PinY-Sheet.1!Height/2) устанавливаем позиционирование обоих объектов по левому верхнему углу и получаем добавленный объект, левый верхний угол которого всегда расположен в центре основного объекта. 2. Редактирование текста фигуры выполняется нажатием F2. |
|
|
sars
17 Posts |
Posted - 07/17/2008 : 08:59:57
|
Подскажите, можно ли и как реализовать такую штуку, чтобы шейп всегда отображался в видимой области страницы? |
|
|
Michael
49 Posts |
Posted - 07/20/2008 : 14:37:03
|
А конкретнее? |
|
|
sars
17 Posts |
Posted - 07/21/2008 : 09:12:15
|
Есть лист формата А4(вертикальное расположение), масштаб 50%. Добавляем на лист прямоугольник (40х20 мм) в верхнюю область листа(X=100 мм, Y=270 мм). Увеличиваем масштаб до 100% и прокручиваем страницу к нижней области листа. Хотелось бы чтоб прямоугольник оказался в видимой области листа (например, в центре той части что я вижу). |
|
|
Tumanov
Russia
1198 Posts |
Posted - 07/21/2008 : 10:35:52
|
Реализовать можно, но для Visio такая задача очень необычна. Шейп обычно привязан к листу, а здесь Вы пытаетесь заставить его непрерывно перемещаться... Без макросов скорее всего не реализуется. С макросами сделать можно примерно так: - написать обработчик для события WindowChanged или ViewChanged (уточнить практически по требуемому поведению); - в обработчике с помощью GetViewRect ловить координаты видимой части страницы и в соответствии с ними изменять PinX, PinY перемещаемого шейпа. Еще надо будет разобраться с противоречиями, если Вы захотите переместить этот шейп вручную. И обработчики инициализировать (например при открытии документа). |
|
|
sars
17 Posts |
Posted - 07/21/2008 : 13:58:59
|
Спасибо за совет, получилось добиться перемещения шейпа по нажатию "кнопки", на которой весит процедура пересчитывающая кординаты шейпа. А как сделать, чтоб эта процедура выполнялась постоянно пока открыт документ (чтоб мне не жмакать постоянно "кнопку")? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 07/21/2008 : 17:34:37
|
Вот код, демострирующий идею:
Dim WithEvents vw As Window
Dim doubleLeft As Double, doubleTop As Double, doubleWidth As Double, doubleHeight As Double
Private Sub Document_DocumentOpened(ByVal doc As IVDocument)
Set vw = ActiveDocument.Application.Windows(1)
RePos
End Sub
Private Sub vw_ViewChanged(ByVal Window As IVWindow)
RePos
End Sub
Private Sub RePos()
On Error Resume Next
vw.GetViewRect doubleLeft, doubleTop, doubleWidth, doubleHeight
ActivePage.Shapes(1).Cells("PinX") = doubleLeft + doubleWidth / 2
ActivePage.Shapes(1).Cells("PinY") = doubleTop - doubleHeight / 2
On Error GoTo 0
End Sub При открытии документа объект vw (окно Visio) начинает генерировать события, в том числе и ViewChanged. При каждом перемещении окна вызывается обработчик ViewChanged, который обращается к процедуре RePos. Процедура RePos помещает первый шейп активной страницы в центр экрана. On Error - простенькая защита от ошибки при выключении (надо бы покорректнее, но в задачу это не входит). |
|
|
sars
17 Posts |
Posted - 07/22/2008 : 12:06:37
|
Класс!!! Большое спасибо :) Но есть маленькая проблемка. Шейп(у меня это "легенда") я размещаю в правом верхнем углу. Коэффициенты, которые я подобрал идеально подходят для масштаба 100% (который устанавливается в меню Вид). Если я меняю масштаб, то эти коэффициенты уже не работают и шейп начинает смещаться ближе к центру, либо уходит за пределы видимой области.
Хотел использовать разные коеффициенты в зависимости от масштаба, но не смог найти параметр отвечающий за его текущее значение. Можете подсказать, есть такой и как называется? Или может, есть другой вариант попроще?
И второй вопрос: как лучше поступить при изменении масштаба, чтобы шейп менял свои размеры и размер шрифта?
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 07/22/2008 : 16:15:46
|
Если в меню "Вид", то это скорее всего Zoom. Он читается как свойство окна. В моем примере это vw.Zoom Принимает значение от 0,05 (5%) до 9,99 (999%). А как поступить... - что-нибудь на что-нибудь домножать в зависимости от этого значения. Но сама идея такого шейпа мне совершенно не нравится. А нельзя было эту легенду в окошке "Custom properties" показать? Или по клавише формочку с этими сведениями показывать. В крайнем случае свое прикрепленное окно приделать... |
|
|
sars
17 Posts |
Posted - 07/23/2008 : 11:26:16
|
Спасибо!
Все это от скудного опыта и знаний :) Дело в том, что у меня в легенде отображаются шейпы (фигуры) с их описанием. В "Custom properties" на вряд ли получится такое изобразить. В форме я тоже не уверен, т.к. не представляю как на нее добавить фигуру?
Прикрепленное окно - это, то что обсуждалось здесь? http://www.visio.artberg.ru/forum/topic.asp?TOPIC_ID=1794
Если так, то у меня не получилось его создать. Выдает следующую ошибку: Constants, fixed-length strings, arrays, user-defined types, and Declare statements not allowed as Public members of an object module. Видимо какая то проблема с объявлением констант ... |
|
|
|
Topic |
|