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

Евгений

88 Posts

Posted - 01/09/2005 :  02:43:13
Доброе утро, мне посоветовали обратиться с вопросом в ваш форум.
Вопрос следующий:

Создал документ-темплейт, на ней страница имеет проперти (custom properties), надо, чтобы при загрузке документа появлялось окно, в котором юзверь вводит значения пропертей (как например легко сделать с пропертями Shape при его положении на страницу - там достаточно обозначить галочку "ask on drop").
Как я понял, надо копнуть в сторону Private Sub Document_DocumentOpened(ByVal doc As IVDocument), но как и что конкретно оттуда вызывать, не пойму. Сейчас рою в мсдн, но там хрен сам черт ногу сломит (система каталогов и тем совершенно не прозрачная )

Заранее спасибо.

ЗЫ. Да, у меня Визио 2003, но я должен ориентироваться на 2002, т.к. не у всех будущих юзеров темплейта будет стоять 2003.

Tumanov

Russia
1198 Posts

Posted - 01/09/2005 :  12:53:05
1. Путь кривой и быстрый
В Visio есть команда меню View / Custom Properties Window. Она открывает окошко с пользовательскими свойствами. Значит при открытии и создании документа Visio можно проверить наличие этого окошка и открыть его, если оно еще не открыто.
То есть в оба обработчика
Private Sub Document_DocumentCreated(ByVal doc As IVDocument) и
Private Sub Document_DocumentOpened(ByVal doc As IVDocument)
вписать код

Flag = False
For Each wi In Application.Windows(1).Windows
If InStr(1, wi.Caption, "Custom Properties") > 0 Then
Flag = True
Exit For
End If
Next
If Not Flag Then Application.DoCmd (1658)

Тогда при создании или открытии документа будет выводиться окошко свойств, как бы приглашая заполнить их.

2. Путь длинный и нормальный
В проекте VBA (а если Вы добрались до DocumentOpened, то такой у Вас имеется) нужно создать свою форму для заполнения пользовательских свойств.
Так как форма делается самостоятельно, то нужно будет сделать столько же текстовых полей, сколько свойств у страницы. Если набор свойств изменится, то и форму нужно будет переделывать.
В обработчике DocumentOpened, а может быть и в DocumentCreated нужно:
- вызывать эту форму;
- читать из свойств страницы пользовательские свойства и записывать в поля формы;
- при закрытии формы скорректированные значения загонять обратно в пользовательские свойства активной страницы.
Здесь ручной работы гораздо больше, но и результат более надежный.
Go to Top of Page

Евгений

88 Posts

Posted - 01/09/2005 :  13:47:51
Да, наверное так и сделаю - с формой. Просто думал, что может существует более автоматический способ.

Можно еще вопрос? Что такое проект, я ведь специально никакого проекта не создавал, просто сделал новый документ и записал его как темплейт.

Кстати, еще вопрос. В своем темплейте я сделал новый стенсил. Хочу распространять темплейт как один файл. А этот стенсил записан в отдельном файле, как мне его сынтегрировать с самим темплейтом?

Спасибо за советы, чувствую, что наконец попал в нужное место =)
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/09/2005 :  16:24:27
Вот первый способ и есть более автоматический, потому что вместо самодельной формы используется стандартное окно Visio для пользовательских свойств. Может быть его и достаточно будет...

Проект появится вместе с первым макросом. Как только вы открываете редактор Visual Basic, тут и появляется "проект VBA". А Private Sub Document_DocumentOpened, о котором Вы упоминали, - это стандартный вход в обработчик события открытия документа Visio; он будет в этом проекте.

В Visio есть специальный Stencil - Document Stencil. Когда шейпы из внешнего трафарета перетаскиваются на рисунок, копия мастер-шейпа автоматически попадает в Document Stencil. В принципе, этот трафарет может использоваться вместо внешнего. Он всегда с рисунком. Правда, внешний обычно заблокирован от изменений, а внутренний можно редактировать...
Go to Top of Page

Евгений

88 Posts

Posted - 01/09/2005 :  23:27:53
Просто первый способ мне не до конца подходит тем, что а) юзер должен ввести значения не для всех пропертей, а только некоторых, ключевых, вот их и надо ему показать; b) это окошко со всеми пропертями и так будет постоянно показано, но скорей лишь для возможности просмотра юзером данных. Вообще-то до этого я тоже не знал, как сделать, чтобы оно само выскочило, так что инфа об этом мне тоже пригодится =)

А никак нельзя, чтобы внешний стенсил каким-то образом содержался в одном файле вместе с самим темплейтом? Просто мне а) обязательно, чтобы все было в одном файле, b) желательно, чтобы стенсил нельзя было редактировать.
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  02:01:01
Кстати, а что конкретно делает application.DoCmd(1658)? Вернее догадываюсь, что оно показывает окно пропертей, но почему 1658? Это константа? Если так, где взять список констант для DoCmd()?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  09:32:31
DoCmd - метод Application, выполняющий команды меню. 1658 - константа, соответствующая меню View / Custom Properties Window.
Список констант я брал в свое время на сайте у Digitall http://prodigitall.narod.ru/Visio2000/docmd.txt
Если адрес со временем мог измениться, то не сильно - можно посмотреть там рядом. По-моему потом где-то еще видел, но уже не помню.
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  11:50:32
Спасибо. А как насчет вопроса про стенсил?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  12:04:01
Пока мыслей нет :( Может кто еще скажет...
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  12:19:37
Ну хорошо, пока это не критично. Но у меня еще один - ламерский вопрос. Я создал форму, но не знаю - как ее вызвать из sub-а... Просмотрел статьи на вашем сайте, но не нашел ответа, просмотрел мсдн, гугль, также не нашел. Наверное, плохо искал, но все же. Как?
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  12:21:06
Кстати, насчет стенсила - может, можно какую-нибудь простую инсталляшку создать - методами вижио/оффис/...? Тогда файлы пусть даже их будет несколько.
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  12:27:07
Извиняюсь, нашел ответ насчет формы.

Dim tableForm As New Table_data_form
Table_data_form.Show
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  12:28:20
Вернее
Dim tableForm As New Table_data_form
tableForm.Show
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  13:16:59
Что-то не могу добраться до значений полей формы. Например, имею текстовое поле table_name, как из обработчика (одной кнопки) получить значение поля?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  13:50:20
Если Вы форму вызываете из обработчика, то они непосредственно друг друга не видят.
В этом случае к проекту надо добавить еще и модуль. Объявить в нем что-нибудь типа
Public ss As String
Теперь в обработчике можно обращаться к ней, например, как
MsgBox Module1.ss
А перед закрытием формы нужное поле забрасывается в эту переменную
Module1.ss = TextBox1.Text
Unload UserForm1
При открытии формы через ту же (те же) переменную можно передавать начальное значение...
Go to Top of Page

Евгений

88 Posts

Posted - 01/10/2005 :  13:58:49
Саму форму я вызываю при открытии документа (document_document_opened), а действие происходит при нажатии кнопки ОК (которая находится на форме!), в обработчике которой хочу получить значения других полей формы. Разве в этом обработчике поля не видны?
Go to Top of Page
Previous Topic Topic Next Topic  
Next Page
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)