![]() |
Форум visio.getbb.ru | О форумах Библиотека | Частые вопросы | Литература | Склад материалов Visio Navigator | Blog | Полезные ссылки | О сайте История Visio | Продукты Visio |
Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д. |
Программная работа с текстом в Visio отличается от работы с другими элементами тем, что текст не виден в шейп-листе. Начинающих это обескураживает. Все видно, а текста нет.
Программист может использовать для доступа к тексту шейпа либо свойство Text шейпа (Shape.Text), либо свойство Text объекта Characters (Shape.Characters.Text).
Первый способ попроще, но и возможностей у него меньше. Он работает с текстом в целом.
Второй способ позволяет работать с отдельными фрагментами текста, в том числе задавать им разное форматирование.
В общем-то, это основное, что нужно помнить, остальное можно посмотреть в справке.
06.11.2015  Simple Macros in Microsoft Visio with the Macro Recorder David Parker.
20.10.2004  Processing Text in Visio Mai-lan. (англ.) Работа с текстом в Visio
Переключение скрытого текста
Переключение скрытого текста
Sub hidden()
If ActiveDocument.Styles("Скрытый").Font.hidden = False Then
ActiveDocument.Styles("Скрытый").Font.hidden = True
Else
ActiveDocument.Styles("Скрытый").Font.hidden = False
End If
End Sub
Если в документе существует текст, выполненный стилем "Скрытый", то данный макрос переключает его отображение. Большой документ при этом, естественно, дергается, что не очень удобно.
Как программно отформатировать текст в шейпе?
Как программно отформатировать текст в шейпе используя несколько шрифтов?
Все параметры шейпов в Visio отображаются и меняются в шейп-листе (ShapeSheet).
Если не знаете, как сделать что-то программно, делайте это вручную и смотрите, как это отражается в шейп-листе. Потом пытайтесь внести такое же изменение в ячейку шейп-листа программно.
Например.
Рисуем на листе только один квадрат, пишем в нем 1234567890. Открываем шейп лист. Находим секцию Character (на будущее). Теперь на листе рисунка красим текст в красный цвет. В шейп листе тут же в ячейке Color секции Character появляется 2 (номер красного цвета). Делаем вывод - если записать в ячейку Color значение 2, текст станет красным.
Проверяем. Отменяем ручные изменения и выполняем макрос
Sub ttt()
ActivePage.Shapes(1).Cells("Char.Color").Result("") = "2"
End Sub
Убеждаемся, что текст после этого макроса опять становится красным.
Точно также можно работать и с другими атрибутами секции Character: Font, Size, Scale и т.д.
Примечание.
Если в одном шейпе текст имеет разное форматирование (например 3 буквы красные, потом 5 синих), то в секции Character это будет отражено двумя строчками и можно менять параметры каждой группы текста отдельно. Больше групп - больше строчек. Однако, если первоначально текст был отформатирован одинаково (в секции была только одна строка), то возникнет проблема. В документации прямо указывается, что добавление и удаление строк из четырех секций запрещено (visSectionCharacter, visSectionParagraph, visSectionTextField, or visSectionTab).
Так что хорошо бы заранее готовить шейпы с нужным числом строк.
Если известно, что в каком-то типе шейпа может понадобиться менять форматирование фрагмента текста - взять и подправить мастер-шейп, то-есть внести несколько строк в секцию еще на уровне мастер-шейпа. Будет специальный мастер. А на рисунке уже работать с подготовленными секциями. Вот только разметка позиций будет фиксированной. Еще один кривой вариант - работать с группой. В принципе наверно можно иметь несколько шейпов-текстовых блоков, менять их размер в зависимости от введенного текста (типа Width = GUARD(EVALTEXT(TheText)) и позиционировать один за другим. Тогда каждый будет управляться сам по себе, а выглядеть это будет как одна текстовая строка (сам не пробовал, но почему бы не работать).
Некоторые эффекты получаются с использованием ячеек Scale и Transparency. То есть фрагмент текста можно сделать невидимым и сжать, а когда нужно развернуть.
Пример работы с текстом и файлами.
Я никогда не программировала для Visio и, чтобы разобраться как это делается, не поможете ли с программой для примера.
В открытом документе по указанию на какой-либо допустим квадратик (double-click?), берется его подпись (может activePage.Shapes.Text ?), открывается другой более общий файл visio, находится там квадратик с тем же текстом, увеличивается просмотр с центром экрана на этом квадратике.
Заранее спасибо.
Sub ttt()
s0 = ActiveWindow.Selection.Item(1).Text
Dim docObj As Visio.Document
Dim selObj As Visio.Selection
Dim winObj As Window
Set docObj = Documents.Open("C:\FileБолееОбщий.vsd")
Set pagObj = docObj.Pages(1)
For i = 1 To pagObj.Shapes.Count
s = pagObj.Shapes(i).Text
If (InStr(s, s0) > 0) Then
Set winObj = ActiveWindow
winObj.Select pagObj.Shapes(i), visSelect + visDeselectAll
px = winObj.Selection.Item(1).Cells("PinX")
py = winObj.Selection.Item(1).Cells("PinY")
winObj.SetViewRect px - 1, py + 1, 5, 5
MsgBox ("pX= " & px & " pY= " & py)
End If
Next
End Sub
Двойной щелчок по любому из квадратиков загружает более общий файл, находит в нем шейпы с похожим текстом и позиционирует на них окно. MsgBox пишет координаты шейпа (и тормозит программу на время просмотра).
После выполнения макроса "Более общий" файл закрыть вручную (забыл Close написать)
Помогите подсчитать программно сколько в тексте на шейпе wrapped строк.
Помогите подсчитать программно сколько в тексте на шейпе wrapped строк.
Вот такая штуковина
Sub ttt()
s = ActivePage.Shapes(1).Text
i = 1
While i > 0
i = InStr(i, s, vbLf) + 1
MsgBox i - 1
Wend
End Sub
Вот по такому тексту шейпа
Раз строка
Два строка
Три строка
Говорит последовательно: 11, 22, 0. То есть переводы строк на 11, 22 позиции, а больше нету.
Как подсчитать получившееся количество строк при заполнении шейпа текстом?
При добавлении текста на прямоугольник получается автоматический перенос строк(wrap) по ширине шейпа. Вопрос состоит в подсчете получившегося количества строк, независимо от нажатий при вводе этого текста.
Здесь вычисления могут быть только приближенными. Существует функция, которая выдает расчетную высоту текста с учетом ограничения текстового блока по ширине и прочих параметров форматирования.
TEXTHEIGHT(shapename!TheText,maximumwidth)
В принципе, пользуясь ей и зная высоту одной строки, можно рассчитать и число строк. Только не забыть все делать в одинаковых единицах измерения и помнить, что отступы текстового блока тоже входят в высоту.
Как программно изменить размер и выравнивание шрифта в шейпе?
Подскажите pls как программно изменить размер и выравнивание шрифта в шейпе и как пользоваться стилями?
Пишу
Set shpObj = pagObj.DrawRectangle(2, 8, 6, 9)
shpObj.Text = "Hello World!"
shpObj.TextStyle = "Arial 24pt centered"
Ошибка: стиль задан неверно!
А Вы создали предварительно стиль с таким названием? Этот способ работает с уже имеющимися стилями.
Создать новый стиль и изменить шрифт - это совершенно разные вещи.
Изменить шрифт легко. Вот эти две строчки сделают размер шрифта 6 pt и выравняют параграф по центру. Для этого стилей создавать не нужно.
Sub tty()
ActivePage.Shapes(1).Cells("Char.Size").Formula = "=6 pt."
ActivePage.Shapes(1).Cells("Para.HorzAlign") = 1
End Sub
А создавать новый стиль лучше все-таки вручную, а программно его только применять. То, что Вы пытались показать в примере, это только применение стиля.
Как менять несколько надписей сразу?
Требуется, чтобы при изменении одного текста на листе менялось также несколько надписей. Нашел почти подходящий шейп в Organization Chart (Position и др.), но он, при помощи метода create synchronized copy создает связанные предметы только для разных листов. Можно ли этот метод как-то использовать для простых объектов?
Заранее спасибо.
А может попроще?
Вставить в зависимые шейпы поле вот с такой формулой (в данном случае ссылка на шейп Sheet.1). И то, что появится в Sheet.1, будет транслироваться в эти шейпы.
=ShapeText(Sheet.1!TheText)
Как менять несколько надписей сразу 2?
1.Создаю прямоугольник с текстом внутри.
(тут вопросы: Нужно ли его помещать в shapes и если да то для мастера менять свойства? Дальше куда - в custom properties в format или открыть shape list? куда эту формулу =ShapeText(Sheet.1!TheText) вставлять)
2.Копирую его по всему листу(документу) и хочу, что бы при изменении текста внутри любого (можно одного главного) везде текст также менялся.
1) Создаете прямоугольник.
2) Когда он выделен либо нажимаете F2, либо 2-м нажатием левой кн. мыши.
3) Далее нажимаете правой кнопкой мыши и выбираете Insert Field...(Вставка поля...)
4) В появившемся окне в Category(Категория) выберите Custom Formula(Другая формула).
5) И в строке снизу введите необходимую формулу.
Вот и все.
Как программно прижать текстовый блок коннектора к одному из концов?
Как программно прижать текстовый блок коннектора к одному из концов. Пожалуйста, помогите.
Например, так.
Sub Text_position()
Dim shpObj As Visio.Shape
Set pagsObj = ThisDocument.Pages
Set pagObj = pagsObj.Item(1)
Set selectObj = ActiveWindow.Selection
Set shpObj = ActiveWindow.Selection.Item(1)
Set celObj1 = shpObj.Cells("TxtPinX") 'назначаем ячейку
Set celObj2 = shpObj.Cells("TxtPinY") 'назначаем ячейку
celObj1.Formula = "Width*1" 'прижимаем к низу
celObj2.Formula = "Height*1" 'прижимаем к низу
celObj1.Formula = "Width*0" 'прижимаем к верху
celObj2.Formula = "Height*0" 'прижимаем к верху
End Sub