Author |
Topic |
|
elena
41 Posts |
Posted - 03/20/2006 : 13:16:06
|
Как вставить программно текст из одной фигуры в другую с сохранением формата, если он заранее неизвестен,н-р сколько-то символов Arial, сколько-то Symbol и т.д.? Как сслылаться на поля листа в формулах? |
|
brace
Russia
358 Posts |
Posted - 03/20/2006 : 13:28:37
|
для начала пока народ думает что ответить попробуйте сделать все руками = не программно и включите макрос на запись по идее получите макрос = программу которя вам нужна. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/20/2006 : 21:37:55
|
Давайте я немножко покомментирую, а то Brace слишком сжато изложил :) Если пользоваться его методом, то получите примерно такой макрос: Sub Macro1()
Dim vsoCharacters1 As Visio.Characters Set vsoCharacters1 = Application.ActiveWindow.Page.Shapes.ItemFromID(1).Characters vsoCharacters1.Begin = 0 vsoCharacters1.End = 18 vsoCharacters1.Copy
Dim vsoCharacters2 As Visio.Characters Set vsoCharacters2 = Application.ActiveWindow.Page.Shapes.ItemFromID(2).Characters vsoCharacters2.Begin = 0 vsoCharacters2.End = 0 ActiveWindow.SelectedText = vsoCharacters2 ActiveWindow.SelectedText.Paste
End Sub Индексы и позиции будут немного отличаться. В этом примере 19 символов с сохранением форматирования переносятся из первого во второй шейп. Но тут много всего написано. Для понятности можно слегка упростить пример.
Если бы форматирование нас не волновало, то текст переносится гораздо проще. Например, ActiveWindow.Selection(1).Text = ActivePage.Shapes(1).Text переносит текст из первого шейпа на активной странице в первый селектированный шейп. Но здесь текст берется только весь целиком. И форматирование не учитывается.
А тонкая работа с текстом производится через объект Characters (набор символов). Посмотрим вот такой пример: Sub ttt() ActivePage.Shapes(1).Characters.Copy ActiveWindow.Selection(1).Characters.Paste End Sub Здесь два объекта Characters. Один в первом шейпе на активной странице. Второй - в первом селектированном шейпе. Все знаки из одного копируются в буфер, затем из буфера помещаются во второй. Чтобы запустить такой макрос нужно открыть новую страничку в Visio. Нарисовать прямоугольничек (это будет первый шейп). Ввести в него текст и раскрасить его разным форматированием. Теперь можно нарисовать новый прямоугольниик и, оставляя его селектированным, выполнить макрос. Текст из первого шейпа скопируется в новый.
Это суть. А макрос из примера Brace отличается тем, что заводятся промежуточные объекты Characters; устанавливаются начало и конец копируемой последовательности символов (можно ведь копировать не все); устанавливается область во втором шейпе; и точно так же производится копирование через буфер. Да сами шейпы по-другому выбраны - жестко установлены индексы. Нужно отметить, что ActiveWindow.SelectedText - это тоже Characters. |
|
|
brace
Russia
358 Posts |
Posted - 03/21/2006 : 08:50:45
|
спасибо господин Туманов ! я не знаю VBA просто прочитал в хелпе для чего нужен macro recorder и подумал что это тот самый случай. |
|
|
elena
41 Posts |
Posted - 03/21/2006 : 11:17:36
|
В том то и дело, что нужно обойтись без макросов. Простой смертный должен вводить текст в определенной фигуре на листе и такой же должен появляться в другой. Причем первая фигура находится сразу на шаблоне, а вторая добавляется на лист пользователем позже, может быть, после ввода текста в первую фигуру, может быть после. |
|
|
elena
41 Posts |
Posted - 03/21/2006 : 11:26:08
|
И можно ли ссылаться на поля листа? |
|
|
Digitall
Russia
389 Posts |
Posted - 03/21/2006 : 11:47:40
|
quote: Originally posted by elena
И можно ли ссылаться на поля листа?
Если вы имеете ввиду ячейки ShapeSheet(ТаблицаФигур), то да, можно. =ThePage!Ячейка Или на другой лист. =Pages[Page-1]!ThePage!Ячейка
Вообще, я бы порекомендовал бы вам ознакомиться с DVS(Developing Visio Solutions). Многие вопросы отпали бы сами собой. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/21/2006 : 20:28:58
|
Без программных методов скорее всего обойтись не удастся. Может быть только вместо макросов использовать Add-On или Add-In... В этом случае то, что нужный шейп появляется позже, не очень влияет. В момент появления шейпа на листе будет формироваться событие, а его обработчик выполнит перенос текста описанным образом. Хотя и макросы тоже могут реагировать на события... А чем макросы мешают - требованиями к безопасности? |
|
|
immortal
Russia
391 Posts |
Posted - 03/22/2006 : 12:27:10
|
ну человек наверно хочет чтобы был уже готовый инструмент или его ктонибудь сделал, к сожелению лично мне не понятно что надо конкретно, для решения поставленной задачи необходима постановка собственно самой задачи, если конечно хотите чтобы я написал адд-он для этого, то мне необходимо подробно написать что вы хотите, можно в привате, а результаты потом сюда естественно.
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
|
|
elena
41 Posts |
Posted - 03/23/2006 : 10:17:07
|
quote: Originally posted by Digitall
quote: Originally posted by elena
И можно ли ссылаться на поля листа?
Если вы имеете ввиду ячейки ShapeSheet(ТаблицаФигур), то да, можно. =ThePage!Ячейка Или на другой лист. =Pages[Page-1]!ThePage!Ячейка
Вообще, я бы порекомендовал бы вам ознакомиться с DVS(Developing Visio Solutions). Многие вопросы отпали бы сами собой.
Я имею в виду ссылку на размеры правого, левого, верхнего и нижнего поля листа типа ThePage!LeftMargin , но в ShapeSheet листа нет такой ячейки. А нужно это, между прочим, для авторасположения штампа на листах разного формата. В типовых фигурах и чужих разработках я этого не обнаружила. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/23/2006 : 19:35:02
|
Боюсь, что через ShapeSheet такая ссылка невозможна. В объектной модели Visio эти поля являются свойством не страницы, а документа. Вот фрагмент из программы на VB, принимающий поля: Pleft = docObj.LeftMargin * 25.4 Pright = docObj.RightMargin * 25.4 Ptop = docObj.TopMargin * 25.4 Pbottom = docObj.BottomMargin * 25.4 docObj - это, естественно, документ. Кстати, программа, из которой взят пример, контролирует установки принтера перед печатью. То есть задача немного похожа на Вашу, но решается с другой стороны. Рисунок размещается "как положено", а перед печатью проверяется, правильно ли установлены поля, размер бумаги и т.д. И если нужно, то корректируются поля, а не перемещается штамп. |
|
|
elena
41 Posts |
Posted - 03/24/2006 : 09:38:44
|
большое спасибо за информацию |
|
|
immortal
Russia
391 Posts |
Posted - 03/27/2006 : 13:33:53
|
quote: А нужно это, между прочим, для авторасположения штампа на листах разного формата. В типовых фигурах и чужих разработках я этого не обнаружила.
с этого и надо было начинать, quote: и чужих разработках я этого не обнаружила
у меня есть аналогичное решение , скачать надо хотябы immortal.vss чтобы чтото понять http://www.immortal.vstu.edu.ru/index.php?name=Files&op=showcat&cid=1
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
Edited by - immortal on 03/27/2006 14:47:14 |
|
|
elena
41 Posts |
Posted - 03/28/2006 : 09:59:08
|
quote: Originally posted by immortal
quote: А нужно это, между прочим, для авторасположения штампа на листах разного формата. В типовых фигурах и чужих разработках я этого не обнаружила.
с этого и надо было начинать, quote: и чужих разработках я этого не обнаружила
у меня есть аналогичное решение , скачать надо хотябы immortal.vss чтобы чтото понять http://www.immortal.vstu.edu.ru/index.php?name=Files&op=showcat&cid=1
визио 2003 форэвер
...а вобще-то я белый и пушистый.
А проще-то было сообщить, что в VIsio 2003 есть секция Print Properties. А некоторым приходится работать в Visio 2002, а там такой секции нет. |
|
|
|
Topic |
|