Author |
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 нужно: - вызывать эту форму; - читать из свойств страницы пользовательские свойства и записывать в поля формы; - при закрытии формы скорректированные значения загонять обратно в пользовательские свойства активной страницы. Здесь ручной работы гораздо больше, но и результат более надежный.
|
|
|
Евгений
88 Posts |
Posted - 01/09/2005 : 13:47:51
|
Да, наверное так и сделаю - с формой. Просто думал, что может существует более автоматический способ.
Можно еще вопрос? Что такое проект, я ведь специально никакого проекта не создавал, просто сделал новый документ и записал его как темплейт.
Кстати, еще вопрос. В своем темплейте я сделал новый стенсил. Хочу распространять темплейт как один файл. А этот стенсил записан в отдельном файле, как мне его сынтегрировать с самим темплейтом?
Спасибо за советы, чувствую, что наконец попал в нужное место =) |
|
|
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. В принципе, этот трафарет может использоваться вместо внешнего. Он всегда с рисунком. Правда, внешний обычно заблокирован от изменений, а внутренний можно редактировать...
|
|
|
Евгений
88 Posts |
Posted - 01/09/2005 : 23:27:53
|
Просто первый способ мне не до конца подходит тем, что а) юзер должен ввести значения не для всех пропертей, а только некоторых, ключевых, вот их и надо ему показать; b) это окошко со всеми пропертями и так будет постоянно показано, но скорей лишь для возможности просмотра юзером данных. Вообще-то до этого я тоже не знал, как сделать, чтобы оно само выскочило, так что инфа об этом мне тоже пригодится =)
А никак нельзя, чтобы внешний стенсил каким-то образом содержался в одном файле вместе с самим темплейтом? Просто мне а) обязательно, чтобы все было в одном файле, b) желательно, чтобы стенсил нельзя было редактировать. |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 02:01:01
|
Кстати, а что конкретно делает application.DoCmd(1658)? Вернее догадываюсь, что оно показывает окно пропертей, но почему 1658? Это константа? Если так, где взять список констант для DoCmd()? |
|
|
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 Если адрес со временем мог измениться, то не сильно - можно посмотреть там рядом. По-моему потом где-то еще видел, но уже не помню. |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 11:50:32
|
Спасибо. А как насчет вопроса про стенсил? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 01/10/2005 : 12:04:01
|
Пока мыслей нет :( Может кто еще скажет... |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 12:19:37
|
Ну хорошо, пока это не критично. Но у меня еще один - ламерский вопрос. Я создал форму, но не знаю - как ее вызвать из sub-а... Просмотрел статьи на вашем сайте, но не нашел ответа, просмотрел мсдн, гугль, также не нашел. Наверное, плохо искал, но все же. Как? |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 12:21:06
|
Кстати, насчет стенсила - может, можно какую-нибудь простую инсталляшку создать - методами вижио/оффис/...? Тогда файлы пусть даже их будет несколько. |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 12:27:07
|
Извиняюсь, нашел ответ насчет формы.
Dim tableForm As New Table_data_form Table_data_form.Show |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 12:28:20
|
Вернее Dim tableForm As New Table_data_form tableForm.Show |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 13:16:59
|
Что-то не могу добраться до значений полей формы. Например, имею текстовое поле table_name, как из обработчика (одной кнопки) получить значение поля? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 01/10/2005 : 13:50:20
|
Если Вы форму вызываете из обработчика, то они непосредственно друг друга не видят. В этом случае к проекту надо добавить еще и модуль. Объявить в нем что-нибудь типа Public ss As String Теперь в обработчике можно обращаться к ней, например, как MsgBox Module1.ss А перед закрытием формы нужное поле забрасывается в эту переменную Module1.ss = TextBox1.Text Unload UserForm1 При открытии формы через ту же (те же) переменную можно передавать начальное значение... |
|
|
Евгений
88 Posts |
Posted - 01/10/2005 : 13:58:49
|
Саму форму я вызываю при открытии документа (document_document_opened), а действие происходит при нажатии кнопки ОК (которая находится на форме!), в обработчике которой хочу получить значения других полей формы. Разве в этом обработчике поля не видны? |
|
|
Topic |
|
|
|