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

Форум по вопросам применения и программирования в Visio
Текущее время: 11 дек 2018, 02:32

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


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


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



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Текст внутри прямоугольника
СообщениеДобавлено: 01 мар 2018, 13:18 
Не в сети
Бывалый

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

Добавить очки репутацииУменьшить очки репутации
Задача такая:
Если высота текста больше прямоугольника - прямоугольник увеличивает высоту.
Если высота текста уменьшается, то высота прямоугольника не уменьшается.
Пользователь не может уменьшить высоту прямоугольника меньше высоты текста.

Делаю так:
User.Row_1 = TEXTHEIGHT(TheText,Width)
User.Row_1 = IF(Height<User.Row_1,SETF(GetRef(Height),User.Row_1),0)

При этом увеличении высоты текста прямоугольник свою высоту увеличивает.
Но если попытаться уменьшить высоту прямоугольника меньше высоты текста - прямоугольник "уезжает" вниз.

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


Вложения:
Комментарий к файлу: Документ с фигурой прямоугольника
1.vsd [15 Кб]
Скачиваний: 27
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Текст внутри прямоугольника
СообщениеДобавлено: 01 мар 2018, 13:31 
Пишите сразу в ячейку
Height = Guard(TEXTHEIGHT(TheText,Width))


Пожаловаться на это сообщение
Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Текст внутри прямоугольника
СообщениеДобавлено: 01 мар 2018, 16:13 
Не в сети
Administrator

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

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

Не любит Visio, когда его пытаются обмануть :)
В Visio циклические ссылки официально запрещены. Если он сам это обнаруживает, то выводит сообщение об ошибке, блокируя ввод такой формулы.
В данном случае контроль не срабатывает, потому что зацикливание идет через функцию SetF и дополнительные ячейки, а это отловить труднее.
Теперь механизм ошибки. Когда Вы тянете нижний шейпа край вверх, то высота шейпа уменьшается. Но шейп-то остается селектированным и мышку Вы продолжаете держать. Поэтому эффект такой, как будто вы на каждом шаге еще поддергиваете нижний край вверх (просите еще больше уменьшить высоту). Вот он и цикл.
Ситуацию можно несколько улучшить, если User.Row_2 сделать чувствительной только к изменению текста.
Код:
User.Row_2=IF(GetVal(Height)<User.Row_1,SETF(GetRef(Height),User.Row_1),0)+DEPENDSON(User.Row_1)

Функция GetVal дает однократное считывание значения высоты.
А зависимость от движения мышки сделать через EventXFMod
Код:
EventXFMod = IF(Height<User.Row_1,SETF(GetRef(Height),User.Row_1),0)

То есть по минимуму нужно одну формулу изменить, другую добавить.
При этом останется небольшой эффект "сползания". Если шейп уже уперся в минимум текст и Вы пытаетесь уменьшать его дальше (мышкой за край), то он будет сдвигаться. Но, думаю, с этим уже можно смириться. Кроме того, это эффект можно сделать односторонним, если установить LocPinY в Height*0 или Height*1. Тогда с одной стороны появится "упор", а с другой "сползание" останется.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Текст внутри прямоугольника
СообщениеДобавлено: 01 мар 2018, 23:31 
Не в сети
Бывалый

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

Добавить очки репутацииУменьшить очки репутации
Спасибо Гостю, но в этом случае мы получаем прямоугольник с рамкой равной высоте текста.

Господин, Tumanov, Вы, как всегда гениальны!

Но думаю, что применение DEPENDSON(User.Row_1) избыточно,
так как, мне кажется, DEPENDSON нужна в тех местах, где в формуле ссылок на ячейку нет, а нам нужно указать,
что выполнение формулы зависит от какой-то ячейки.

В данном случае User.Row_1 у нас и так в формуле указана .
(Но зато я узнал о существовании DEPENDSON, за что еще раз спасибо!)
Код:
User.Row_2=IF(GetVal(Height)<User.Row_1,SETF(GetRef(Height),User.Row_1),0)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Текст внутри прямоугольника
СообщениеДобавлено: 01 мар 2018, 23:54 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Но думаю, что применение DEPENDSON(User.Row_1) избыточно,

Не спорю. Оно появилось на промежуточном этапе, а потом забыл убрать.


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

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



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

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


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

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