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

Oleg_B

Russia
3 Posts

Posted - 04/26/2008 :  11:52:12
Здравствуйте всем! :)

Может быть, кто-нибудь знает, как сделать следующую вещь:
Мне нужно в многостраничном документе на одной странице вывести (внутри какого-нибудь шейпа) надпись "См. на стр. <номер_страницы>", в которой номер_страницы ссылается на другую страницу, т. е. на первой странице мне надо, чтобы выводилась, например, надпись "См. на стр. 2". В принципе, достаточно выводить только номер страницы. Но необходимо, чтобы при изменении порядка следования страниц в документе, эти изменения автоматически отражались и в моей надписи, т. е. если страница, которая была второй, стала четвертой, то и надпись у меня стала "См. на стр. 4".
Нечто подобное происходит, когда в шейп всталяешь поле с номером страницы, но там привязка существует только к текущей странице, а вот чтобы к другой странице - такого я не смог найти.

Может быть, кто знает, возможно ли сделать такую вещь без использования VBA? Или здесь только VBA поможет?

Заранее спасибо! :))

Tumanov

Russia
1198 Posts

Posted - 04/26/2008 :  14:34:07
Пока не знаю, как сделать (времени нет подумать), но решение возможно.
Номер страницы получается функцией PageNumber().
Для вставки его в шейп в виде текста нужно с этим шейпом проделать Insert / Field / Page Info / Page Number.
Сходу не получилось сослаться на номер чужой страницы. Но криво можно сделать уже сейчас, используя то, что можно сослаться на шейп на чужой странице.
Разместить на чужой странице первый шейп (невидимый). В какую-нибудь его ячейку (да хоть в Width) вставить PageNumber(). А из шейпа на первой странице выбираться этот номер примерно так =Pages[Page-2]!Sheet.1!Width.
При перестановках страниц ссылка работет нормально.
Естественно, лучше использовать не Width, а какую-нибудь другую ячейку (она у меня просто первой под руку подвернулась :).
Go to Top of Page

Oleg_B

Russia
3 Posts

Posted - 04/26/2008 :  15:35:55
Спасибо большое, Геннадий! :)

Решение действительно прекрасно, особенно если учесть, что у меня на каждой странице есть шейп с номером этой страницы, так что необходимость в невидимом шейпе отпадает. Но есть одна неприятная особенность Visio 2003: он не любит русских названий страниц. :)) Если у меня страница называется Page-4, то формула вписывается без проблем, а вот если она называется Страница-4, то выдается сообщение об ошибке в формуле. Ну а пробелы в названиях страниц Visio не воспринимает не по-русски, не по-английски. :))

Но, думаю, не стоит больше заморачиваться над моим вопросом. Я буду обходить эти ограничения на язык и пробелы через VBA (без него, похоже, не обойтись, если я хочу делать минимум кликов :)) ). Кстати, если вставлять формулу через VBA, то эти проблемы не возникают. :)) К тому же, есть такой мастер "Off-page reference", который при бросании его на страницу сразу запрашивает на какую страницу ему ссылаться. Если мне удасться в моем мастере совместить поведение мастера "Off-page reference" и то решение, которые Вы предложили, но с вводом формулы через VBA, то моя проблема будет решена.

Еще раз большое спасибо! :)
Вопрос снят.

Edited by - Oleg_B on 04/26/2008 15:38:03
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 04/28/2008 :  18:48:57
У меня была похожая (даже более сложная задача) и я пошел примерно тем путем, который подсказывает Геннадий. Тогда я плохо знал Визио, поэтому сейчас я бы сделал так:
Завел бы в ShapeSheet страницы в секции User или Prop свою ячейку и прописал бы туда номер (а может завтра вам понадобится и не только номер).
После этого можно на него сослаться, кажется как-то так
Pages[Page-20]!ThePage!Prop.number
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 04/28/2008 :  18:50:39
Естественно, номер нужно прописывать не константой, а функцией PageNumber
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 04/28/2008 :  18:53:18
Кстати, а не пробовали использовать Insert\Hyperlink (Ctrl-K) ?
Go to Top of Page

Oleg_B

Russia
3 Posts

Posted - 04/29/2008 :  08:10:49
quote:
Originally posted by zhuravsky

...
Завел бы в ShapeSheet страницы в секции User или Prop свою ячейку и прописал бы туда номер (а может завтра вам понадобится и не только номер).
После этого можно на него сослаться, кажется как-то так
Pages[Page-20]!ThePage!Prop.number

Тоже вариант. Спасибо! Особенно, если нужен не только номер. Но у него есть один недостаток: для вновь добавляемых страниц необходимо открывать их ШейпЩит и добавлять туда нужную секцию и прописывать формулу в строку (во всяком случае, я не нашел возможности наследовать юзер_секции во вновь создаваемые страницы; может плохо искал). Положить же готовый шейп (с полем номера страницы) на страницу гораздо быстрее.

quote:
Originally posted by zhuravsky

...
Кстати, а не пробовали использовать Insert\Hyperlink (Ctrl-K) ?

Гиперлинк пробовал, и даже использовал, но немного по-другому, поскольку в обычном варианте, о котором Вы говорите, линк на страницу разрывается, если целевая страница переименовывается. К тому же в этом случае при распечатке документа я не увижу номера нужной страницы.

Я на самом деле уже сделал все, что хотел, и все работает, как мне надо. :)) Поясню, что мне было надо:
Я занимаюсь сейчас тем, что разбиваю огроменную блок схему на отдельные кусочки, которые умещались бы на странице А4. Получается некая иерархия взаимосвязанных страниц. Для ускорения этого дела мне было нужно средство, которое позволило бы мне после распечатки документа, глядя на страницу с каким-нибудь узлом, знать, на какой странице (страницах) находится его детализация. Таким образом, мне была прежде всего необходима (1) нумерация страниц и (2) какой-нибудь шейп, в котом было бы написано "см. на стр. <номер_страницы>". Вручную прописывать все эти вещи можно, но опасно (не говоря о том, что просто муторно), потому что страниц в документе будет несколько десятков, если не зайдет за сотню, и они к тому же могут переименовываться и перемещаться, т.е. менять свой номер. Вручную отслеживать все эти изменения и править соответствующие шейпы - дело трудное, и вряд ли я избежал бы ошибок. Поэтому надо было все это автоматизировать. Так, я создал два МастерШейпа: шейп с номером страницы и более сложный шейп, который при бросании его на страницу делает следущие вещи:

1. Запрашивает, на какую страницу ему ссылаться.
2. Если нужна новая страница, то он создает ее и помещает на нее шейп с ее номером.
3. В своем текстовом поле формирует вышеупомянутую надпись и отслеживает актуальный номер целевой страницы, какие бы манипуляции с ней не происходили (кроме удаления, разумеется).
4. При двойном клике на нем открывает мне целевую страницу.
5. Бросает еще одну копию себя на целевую страницу.
6. Делает в своей копии на целевой странице ссылку на страницу текущую и формирует такую же надпись, но с номером текущей страницы.
7. И наконец указывает, что при двойном клике на шейпе-копии открывать текущую страницу.

Короче, образуется перекрестная ссылка между страницами, которая дает возможность, с одной стороны, быстро перемещаться между ними в электронном документе, а с другой стороны, дает возможность "перемещаться" между страницами и после их распечатки. И все это не зависит от фактического названия страниц и их порядка. Очень удобно.

Все это, конечно, делает не сам МастерШейп, а код VBA, который запускается по событию бросания_на_лист. Функциональность готового шейпа, о котором я писал в предыдущем посте, задействовать не удалось, поэтому пришлось быстро наваять форму для выбора\создания страницы. Сам шейп я все же использовал - очень он мне нравится , - но отключил его от его аддона. И еще я сделал одну большую функцию в документе, которая и выполняет все те шаги. Проблемы с русскими названиями и пробелами в VBA, похоже, отсутствуют и формулы вставляются без проблем. А проблема с гиперлинком, о которой я говорил выше, решается тоже просто: я использовал не секцию Гиперлинк, а в событие "ДвойнойКлик" прописал формулу HYPERLINK("", "имя_целевой_страницы", "", FALSE, "") - в этом случае переименование страницы не влияет на работу этой функции и я перемещаюсь на нужную страницу всегда. Пункты 3 и 6 сценария реализуются тем способом, который подсказал Геннадий, но из VBA.

Поскольку я, вообще, не работаю с Визио, и мне было все это нужно лишь для одного этого документа, то код писал очень быстро и не универсально, а потому, возможно, путано, поэтому не привожу его здесь, но если кому надо и кто готов разобраться в нем , то я выложу.
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 04/29/2008 :  17:15:56
Я решил похожую задачу: мне нужно рисовать компоновочные и электрические схемы контроллерных шкафов. Файлы тоже получаются по 50-100 страниц, плюс своя специфика (DIN, KKS и т.п.). На данный момент решение примерно как у вас.
Я только добавил на VBA обработчик события создания страницы, по которому необходимые шейпы вставляются автоматически. Собственно, поэтому и предлагал заводить все, что нужно прямо в самой странице (если есть обработчик события, то все-равно создавать нужные проперти или вставлять мастер-шейп).
Все это упаковано в шаблон VST.
Правда, проблему с разными языками не решил (за ненадобностью).
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)