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

Форум по вопросам применения и программирования в Visio
Текущее время: 28 мар 2024, 19:45

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


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


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !

Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Сокращенная форма обращения к шейпу
СообщениеДобавлено: 20 авг 2014, 13:44 
Не в сети
Content manager
Content manager
Аватара пользователя

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
есть у меня некий мастер-шейп для работы со спецификацией.
Он состоит:
собственно из шапки спецификации и надписей в ней: Head
ряда групп строк: row1, row2, … row30
каждая N-ная группа строк состоит из 9 шейпов имеющих имена: N.1, N.2, … N.9

был у меня некий код (см. столбец слева), для обращения к шейпам внутри данного мастер-шейпа.
Я знал о возможности обращения к шейпу, находящемуся внутри группы
Код:
set sh = ActivePage.Shapes.Item("Спецификация").Shapes.Item("row1")
Но была проблема с формированием имени вложенного шейпа, благодаря моему другу Евгени мне удалось отвязаться от строковых переменных переменных с именами. Для сравнения код справа
Код:
Sub var1()
Dim r As Integer
Dim target As Shape
Dim c As Integer
Dim main As Shape   ' шейп - основная группа
Dim rw As Shape     ' шейп - группа «Строка.N»
Dim rn As String      ' имя шейп - группа «Строка.N»
Set main = ActivePage.Shapes.Item("Спецификация")
Dim SSS As Shapes  ' подмножество шейпов основной группы
Dim tn As String ' имя целевого шейпа
Set SSS = main.Shapes
For r = 1 To 30
rn = "row" & r
Set rw = SSS.Item(rn)
For c = 1 To 9
tn = r & "." & c
Set target = rw.Shapes.Item(tn)
Next c
Next r
End Sub
Код:
Sub var2()
Dim r As Integer
Dim target As Shape
Dim c As Integer
For r = 1 To 30
For c = 1 To 9
tn = r & "." & c
Set target = ActivePage.Shapes.Item("Спецификация").Shapes.Item("row" & r).Shapes.Item("" & r & "." & c)
Next c
Next r
End Sub










суть в том, что в скобках в имени шейпа слева должна быть часть заключенная в кавычки (как в приведенном справа примере "row" и "") и далее используя символ объединения строк & можно сформировать нужное имя шейпа
Благодаря все тому же Евгени я отказался от такой формы определения шейпа используя Selection(1)
Код:
Dim Mast As Master
Dim pg As Page
dim sh as Shape
Set pg = ActivePage
Set Mast = ActiveDocument.Masters.Item("Спецификация")
pg.Drop Mast, 0, 0
set sh = ActiveWindow.Selection(1)
Код:
Dim Mast As Master
Dim pg As Page
Dim sh as Shape
Set pg = ActivePage
Set Mast = ActiveDocument.Masters.Item("Спецификация")
set sh = pg.Drop Mast, 0, 0
немного поэкспериментировав, я обнаружил что можно без промежуточных переменных - шейпов, назначать переменной шейп находящийся внутри вытаскиваемого на лист шейпа
Код:
Dim pg As Page, sh As Shape
Dim shpd As Master
Set shpd = ActiveDocument.Masters.Item(1)
Set pg = ActivePage
Set sh = pg.Drop(shpd, 0, 0).Shapes.Item(3)
sh.Shapes.Item(3).Text = "1456" ' заменяем текст третьего шейпа находящегося внутри шейпа sh
sh.Shapes.Item(4).Text = "123" ' заменяем текст четвертого шейпа находящегося внутри шейпа sh
Если нужно изменить одно значение в ячейках шейпшита
Код:
Dim pg As Page
Set pg = ActivePage
Dim shpd As Master, sh As Shape
Set shpd = ActiveDocument.Masters.Item(1)
pg.Drop(shpd, 2, 5).Cells("height").FormulaU = 1
' сразу после вытаскивания на лист изменяем высоту вытащенного шейпа
Set shpd = ActiveDocument.Masters.Item(13)
pg.Drop(shpd, 1, 1).Shapes.Item("razr").Cells("prop.row_2").Formula = """Pushkin"""
' сразу после вытаскивания на лист изменяем свойство prop.row_2 в шейпе с именем razr внутри вытащенного шейпа

PS спустя почти 2 года наткнулся в сети на ссылку со стареньким SDK
MSDN in article Declaring Object Variables писал(а):
Using Compound Object References

You can concatenate Visio object references, properties, and methods in single statements, as you can with Microsoft® Visual Basic® for Applications (VBA) objects. However, simple references are sometimes more efficient, even if they require more lines of code.

For example, the following statement refers to the first shape on the third page of the first open document in a Visio instance:
Код:
Set shpObj = Documents(1).Pages(3).Shapes(1)

Executing this statement retrieves one object—the Shape object assigned to shpObj. Compare the following series of statements that use simple object references:
Код:
Set docObj = Documents.Item(1)
Set pagsObj = docObj.Pages
Set pagObj = pagsObj.Item(3)
Set shpsObj = pagObj.Shapes
Set shpObj = shpsObj.Item(1)
Running these statements retrieves five objects: a Document object, a Pages collection, a Page object, a Shapes collection, and a Shape object. References to these objects are assigned to variables and are available for other uses, unlike the previous example. If your program will eventually need access to these intermediate objects, your code will be easier to read and maintain if you retrieve them all in this way.

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


Последний раз редактировалось Surrogate 17 апр 2016, 00:15, всего редактировалось 1 раз.
Добавлена ссылка на SDK


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

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



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

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


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

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