All Forums
 Категория Visio
 Форум Вопросы и ответы
 Как вставить программно текст?
Author Previous Topic Topic Next Topic  

elena

41 Posts

Posted - 03/20/2006 :  13:16:06
Как вставить программно текст из одной фигуры в другую с сохранением формата, если он заранее неизвестен,н-р сколько-то символов Arial, сколько-то Symbol и т.д.? Как сслылаться на поля листа в формулах?

brace

Russia
358 Posts

Posted - 03/20/2006 :  13:28:37

для начала пока народ думает что ответить
попробуйте сделать все руками = не программно
и включите макрос на запись
по идее получите макрос = программу которя вам нужна.
Go to Top of Page

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.
Go to Top of Page

brace

Russia
358 Posts

Posted - 03/21/2006 :  08:50:45

спасибо господин Туманов !
я не знаю VBA просто прочитал в хелпе для чего нужен
macro recorder
и подумал что это тот самый случай.
Go to Top of Page

elena

41 Posts

Posted - 03/21/2006 :  11:17:36
В том то и дело, что нужно обойтись без макросов. Простой смертный должен вводить текст в определенной фигуре на листе и такой же должен появляться в другой. Причем первая фигура находится сразу на шаблоне, а вторая добавляется на лист пользователем позже, может быть, после ввода текста в первую фигуру, может быть после.
Go to Top of Page

elena

41 Posts

Posted - 03/21/2006 :  11:26:08
И можно ли ссылаться на поля листа?
Go to Top of Page

Digitall

Russia
389 Posts

Posted - 03/21/2006 :  11:47:40  Visit Digitall's Homepage
quote:
Originally posted by elena

И можно ли ссылаться на поля листа?


Если вы имеете ввиду ячейки ShapeSheet(ТаблицаФигур), то да, можно.
=ThePage!Ячейка
Или на другой лист.
=Pages[Page-1]!ThePage!Ячейка

Вообще, я бы порекомендовал бы вам ознакомиться с DVS(Developing Visio Solutions). Многие вопросы отпали бы сами собой.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/21/2006 :  20:28:58
Без программных методов скорее всего обойтись не удастся.
Может быть только вместо макросов использовать Add-On или Add-In... В этом случае то, что нужный шейп появляется позже, не очень влияет. В момент появления шейпа на листе будет формироваться событие, а его обработчик выполнит перенос текста описанным образом.
Хотя и макросы тоже могут реагировать на события...
А чем макросы мешают - требованиями к безопасности?
Go to Top of Page

immortal

Russia
391 Posts

Posted - 03/22/2006 :  12:27:10  Visit immortal's Homepage
ну человек наверно хочет чтобы был уже готовый инструмент или его ктонибудь сделал, к сожелению лично мне не понятно что надо конкретно, для решения поставленной задачи необходима постановка собственно самой задачи, если конечно хотите чтобы я написал адд-он для этого, то мне необходимо подробно написать что вы хотите, можно в привате, а результаты потом сюда естественно.

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Go to Top of Page

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 листа нет такой ячейки. А нужно это, между прочим, для авторасположения штампа на листах разного формата. В типовых фигурах и чужих разработках я этого не обнаружила.
Go to Top of Page

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 - это, естественно, документ.
Кстати, программа, из которой взят пример, контролирует установки принтера перед печатью. То есть задача немного похожа на Вашу, но решается с другой стороны. Рисунок размещается "как положено", а перед печатью проверяется, правильно ли установлены поля, размер бумаги и т.д. И если нужно, то корректируются поля, а не перемещается штамп.
Go to Top of Page

elena

41 Posts

Posted - 03/24/2006 :  09:38:44
большое спасибо за информацию
Go to Top of Page

immortal

Russia
391 Posts

Posted - 03/27/2006 :  13:33:53  Visit immortal's Homepage
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
Go to Top of Page

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, а там такой секции нет.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)