Author |
Topic |
zz 5
Russia
54 Posts |
Posted - 12/18/2006 : 11:07:49
|
Здраствуйте ! Имеется проблема, решиния которой я пока не нашел, хотя имеется пару вариантов. Имеется шаблон Database Model Diagram, в нем для шейпа, допустим, "Entity" имеется в пункте контекстного меню дополнительная строчка, при щелчке по которой вызывается редактор сущности или таблицы, если хотите, где пользователь может определить поля таблицы, их тип, размер и т.п. Необходимо сделать похожее и для своего шейпа, только в несколько упрощенном виде. Соответственно, имеется куча вопросов, как это лучше сделать.
1. Где сидит информация (поля, тип, размер, ключи) конкретного элемента ? В специальных свойств я не нашел ? Тогда где еще может быть ? 2. Можно ли как-нибудь добыть код этой формочки, чтобы заново не придумывать велосипед ? Это бы съэкономило бы много сил и времени. 3.Пока вижу два варианте решения этой проблемы.
Первый: беру шаблон Database Model Diagram, добавляю в него свои шейпы, макросы и т.п., т.е. перелопачиваю под себя, при этом сохраняя (а изменить то нельзя :) ) всю начинку родительского шаблона. Здесь я вижу две трудности. Во-первых, вряд ли я смогу избавиться от лишних элементов (главное меню, окно просмотра и т.д.). И во-вторых, пока не знаю, как получить программно данные таблиц в виде отчета, не зная структуру их хранения.
Второй:здесь, вроде, все понятно. Ручная реализация с нуля, а именно создание окна, вызова его, редактирование и хранение. Главная загвоздка состоит в отсутвии необходимых компонентов в VBA, такиъ как список с переменным количество строк, таблицы. В общем, в бедности компонентной палитры.
Какие будут идеи ? Спасибо за внимание.
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
Tumanov
Russia
1198 Posts |
Posted - 12/18/2006 : 19:06:21
|
Информация в таких случаях часто сидит в специальном (возможно невидимом) мастер-шейпе в Document Stencil в виде встроенного объекта. Поищите где-нибудь там - найдете. Но, так как структура этой информации, естественно, не раскрывается, решение 1 явно отпадает :) Второе решение подходит больше. Не хватает компонентов в VBA (что странно), так можно писать Add-On на VB, C или даже на Delphi. |
|
|
zz 5
Russia
54 Posts |
Posted - 12/19/2006 : 21:07:10
|
quote: Originally posted by Tumanov
Информация в таких случаях часто сидит в специальном (возможно невидимом) мастер-шейпе в Document Stencil в виде встроенного объекта. Поищите где-нибудь там - найдете. Но, так как структура этой информации, естественно, не раскрывается, решение 1 явно отпадает :) Второе решение подходит больше. Не хватает компонентов в VBA (что странно), так можно писать Add-On на VB, C или даже на Delphi.
С первым решением понятно, нет, так нет Теперь насчет второго. Не удалось найти место хранения значений. Например, для элемента Entity шаблона Database Model Diagram так и не нашел. Сам элемент состоит из двух шейпов, но ни у одного из них специальные настройки вообще не определены. Так где же "собака зарыта" (с) Известный политик ? Насчет написание аддона: наверно, это единственный выход. Буду разбираться. Кстати, впервые вижу, чтобы советовали писать аддон на Дельфи ? Разве это возможно ? Везде рекомендуют VB или С++.
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/19/2006 : 21:30:48
|
Я тоже на Дельфи не рекомендую, но в принципе это должно быть возможно. Насчет места хранения - не нашли, потому что не там ищете. Не в отдельных элементах! Хранится вся модель базы. Создайте рисунок на основе этого шаблона. Откройте Document Stencil Видите в нем квадратик, называющийся Database Model? Вот там и сидят данные. В свойствах написано "Database Model master stores embedded model information". То есть этот мастер-шейп используется для хранения данных всего рисунка. Они туда засунуты в виде встроенного объекта и через интерфейс никак не просматриваются. Программно доступ к ним получить можно, но только как к блобу - чистая двоичка, в которой неизвестно что где. |
|
|
zz 5
Russia
54 Posts |
Posted - 12/20/2006 : 06:45:12
|
Нашел :) Странно, но пока нигде не удалось найти примерчика или статьи по написанию addon-ов. Странно это. Может кто-нибудь поделится ? Пока попробую изложить свой видимый алгоритм написания Addon: 1. Создается новое приложение в VB или С++ 2. В нем по любом, определенному разработчику событию, вызывается метод, который посредством команд общается с Визио как с COM-сервером. Например, пример кода merc:
Function UpdateScheme(strPath)
Dim visApp
Set visApp = WScript.CreateObject("Visio.InvisibleApp")
visApp.AlertResponse = 1
visApp.Documents.Open strPath
visApp.ActiveWindow.SelectAll
For Each shp In visApp.ActiveWindow.Selection
If shp.CellExists("User.ODBCConnection", 0) Then
If shp.Cells("EventDrop").Formula = "RUNADDON(""DBR"")" Then
shp.Cells("EventDrop").Trigger
End If
End If
Next
if visApp.ActiveDocument.Saved=false Then visApp.ActiveDocument.Save
visApp.Quit
End Function Вот. Таким же образом идет работа с открытым документом в Визио. Непонтно только, как указать шейп. 3. После создания Addon, полученный exe-файл кладется в папку, указанную в соотвествующем поле настройки (Tools). 4. И последнее, в нужном месте данный аддон вызывается процедурой RunAddon("Имя моей аддона").
Коллеги, верной я иду дорогой или где-то ошибся ?
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
brace
Russia
358 Posts |
|
zz 5
Russia
54 Posts |
Posted - 12/20/2006 : 10:07:33
|
quote: Originally posted by brace
извини пишу о том чего не понимаю...
http://search.msdn.microsoft.com/search/default.aspx?siteId=0&tab=0&query=visio+add+on
К сожалению, на работе нет доступа к сайтам Microsoft. Только дома. Нашел статейку в Visio SDK, буду разбираться. А примерчиков не найдется ?
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/20/2006 : 13:01:52
|
Если стоит Visual Studio, а потом устанавливается SDK Visio 2003, то SDK добавляет в Visual Studio шаблоны для создания Visio Add-On и Add-In. То есть получаешь не просто пример, а готовый к использованию пустой Add-On. Остается только при запуске Visual Studio ткнуть на нужный тип приложения. Изобретать велосипед уже не нужно... |
|
|
zz 5
Russia
54 Posts |
Posted - 12/20/2006 : 13:06:27
|
quote: Originally posted by Tumanov
Если стоит Visual Studio, а потом устанавливается SDK Visio 2003, то SDK добавляет в Visual Studio шаблоны для создания Visio Add-On и Add-In. То есть получаешь не просто пример, а готовый к использованию пустой Add-On. Остается только при запуске Visual Studio ткнуть на нужный тип приложения. Изобретать велосипед уже не нужно...
Не стоит , значит, поехал покупать. Спасибо.
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
zz 5
Russia
54 Posts |
Posted - 12/26/2006 : 16:38:18
|
quote: Originally posted by Tumanov
То есть этот мастер-шейп используется для хранения данных всего рисунка. Они туда засунуты в виде встроенного объекта и через интерфейс никак не просматриваются. Программно доступ к ним получить можно, но только как к блобу - чистая двоичка, в которой неизвестно что где.
Как создать нечто подобное ? Сейчас работаю над создание Add-on, в котором идет редактирование данных. После закрытия add-on надо отредактированные данные куда-то записать. Единственный вариант, который я придумал - в custom property, но не уверен насчет размера данных, которые можно помещать в ячейку с типом string.
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/26/2006 : 18:43:17
|
В Custom не стоит - там они могут случайно повредиться пользователем. Лучше складывать в User. Длина строки - что-то типа 65000 символов. Сейчас не помню, где это конкретно написано... В тех табличках, что попадаются под руку, написано Unlimited, но это неправда. |
|
|
zz 5
Russia
54 Posts |
Posted - 12/27/2006 : 16:17:27
|
Спасибо, все получилось. Не понимаю только, почему все советуют C++ или VB для написания Addon ? По-моему, что-то похожее встречал в статье в SDK. Для меня казалось кошмаром, учить новый язык программирования (С++) лишь только для того, чтобы написать простенький аддон. Хотя сам не первый год профессионально программирую на Delphi.
Но случайно на работе пришла в голову мысль: создать пустое приложение в Delphi и попробывать его запустить как Addon из Visio. Заработало !. Огромные трудности на начальном этапе вызвал еще тот факт, что сколько-нибудь рабочих примеров аддона я так не нашел Только exe-шники без исходных текстов.
2Tumanov: Могу "сварганить" простенький примерчик аддона на Дельфи, который можно выложить на сайте с исходными текстами, чтобы облегчить путь ищущим. На крайний случай можно небольшую статью написать, где будет рассказываться не только написание аддона, но и рассматриваться его подключение в Visio. Как вам такая идея ?
------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он ! |
|
|
brace
Russia
358 Posts |
Posted - 12/27/2006 : 18:12:08
|
вот пример адона...
'This Microsoft Visual Basic for Applications (VBA) macro demonstrates 'adding Document objects such as templates,stencils, and drawings 'to the Documents collection. 'It demonstrates adding pages, masters, layers, styles, events, and 'add-ons to their corresponding collection. 'It also demonstrates drawing a rectangle and grouping, selecting, and 'duplicating shapes. 'Before running this macro, replace "Myfile.vsd" with a valid .vsd file 'and references to "c:\My Documents\MyAddon.exe" and "MyAddon.exe" with 'a valid path and/or file name.
Public Sub Add_Example()
Dim mastersObj As Visio.Masters Dim addonsObj As Visio.Addons Dim pagesObj As Visio.Pages Dim eventListObj As Visio.EventList
Dim layersObj As Visio.Layers Dim layerObj As Visio.Layer Dim stylesObj As Visio.Styles
Dim documentObj As Visio.Document Dim windowObj As Visio.Window Dim eventObj As Visio.Event Dim masterObj As Visio.Master Dim pageObj As Visio.Page Dim shapeObj As Visio.Shape Dim shapeGrpObj As Visio.Shape, shapeGrpObj2 As Visio.Shape Dim styleObj As Visio.Style Dim addonObj As Visio.Addon
'Add a document based on the Basic Diagram template. Set documentObj = Documents.Add("Basic Diagram.vst")
'Add a document based on a drawing (creates a copy of drawing). Set documentObj = Documents.Add("Myfile.vsd")
'Add a document based on a stencil (creates a copy of the stencil). Set documentObj = Documents.Add("Basic Shapes.vss")
'Add a document object based on no template. Set documentObj = Documents.Add("")
'Get the Pages collection and add a page to the collection. Set pagesObj = documentObj.Pages Set pageObj = pagesObj.Add
'Get the Masters collection and add a master to the collection. Set mastersObj = documentObj.Masters Set masterObj = mastersObj.Add
'Get the Layers collection and add a layer named "MyLayer" 'to the collection. Set layersObj = pageObj.Layers Set layerObj = layersObj.Add("MyLayer")
'Draw two rectangles. Set shapeObj = pageObj.DrawRectangle(3, 3, 5, 6) Set shapeObj = pageObj.DrawRectangle(4, 4, 6, 7)
'Select the two rectangles and group them. ActiveWindow.SelectAll ActiveWindow.Selection.Group
'Duplicate the group and set each group as a Shape object. Set shapeGrpObj = pageObj.Shapes(1) shapeGrpObj.Duplicate Set shapeGrpObj2 = pageObj.Shapes(2)
'Add a shape to the layer. 'This group's component shapes are added to the layer. layerObj.Add shapeGrpObj, False
'Add a shape to the layer. 'This group's component shapes are added to the layer. layerObj.Add shapeGrpObj2, True
Set stylesObj = documentObj.Styles 'Add a style named "My FillStyle" to the Styles collection. 'This style is based on the style Red Fill and includes only a Fill style. Set styleObj = stylesObj.Add("My FillStyle", "Red Fill", False, False, True)
'Add a style named "My NoStyle" to the Styles collection. 'This style is based on no style and includes 'Text, Line, and Fill styles. Set styleObj = stylesObj.Add("My NoStyle", "", True, True, True)
'Add the add-on "MyAddon.exe" to the Addons collection. Set addonsObj = Visio.Addons Set addonObj = addonsObj.Add("c:\My Documents\MyAddon.exe")
'Add a BeforeDeleteSelection event to the EventList collection 'of the document. The event will start "MyAddon.exe", which 'takes no arguments. Set eventListObj = documentObj.EventList Set eventObj = eventListObj.Add(visEvtCodeBefSelDel, visActCodeRunAddon, _ "MyAddon.exe", "")
End Sub
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/27/2006 : 18:53:21
|
quote: Не понимаю только, почему все советуют C++ или VB для написания Addon.
C++ - это единственный язык, на котором можно написать vsl. vsl отличается тем, что сочетает лучшие качества Add-On и Add-In. Он работает InProcess (как Add-In), значит все связи с Visio короткие и быстрые. Вызывается как Add-On (отовсюду). Может обрабатывать события, установленные по AddAdvise (как Add-In), то есть можно очень точно спозиционировать обработчики. В плане безопасности ближе к Add-In, то есть его можно выполнять на тех уровнях безопасности, когда exe Add-On уже запрещен. Единственный недостаток - C++ это кошмар для новичков :) Вообще, очень хотелось бы видеть на этом форуме хотя бы одного хорошего специалиста по C++... Начать писать на VB на порядок легче, тем более, что VB - это почти то же, что VBA, а на VBA есть не только куча примеров, но и система записи макросов в Visio 2003.
quote: 2Tumanov: Могу "сварганить" простенький примерчик аддона на Дельфи, который можно выложить на сайте с исходными текстами, чтобы облегчить путь ищущим. На крайний случай можно небольшую статью написать, где будет рассказываться не только написание аддона, но и рассматриваться его подключение в Visio. Как вам такая идея ?
Приветствуется! В идеале хорошо бы еще и Add-In на Дельфи создать, но это можно и попозже... :) |
|
|
NRM
Russia
9 Posts |
Posted - 01/15/2007 : 13:01:06
|
quote: Originally posted by zz 5
2Tumanov: Могу "сварганить" простенький примерчик аддона на Дельфи, который можно выложить на сайте с исходными текстами, чтобы облегчить путь ищущим. На крайний случай можно небольшую статью написать, где будет рассказываться не только написание аддона, но и рассматриваться его подключение в Visio. Как вам такая идея ?
Не знаю как другие а я зАААА:) очень нехватает примеров от которым можно было бы прыгать. |
|
|
NRM
Russia
9 Posts |
Posted - 01/15/2007 : 13:07:50
|
quote: Originally posted by Tumanov C++ - это единственный язык, на котором можно написать vsl. vsl отличается тем, что сочетает лучшие качества Add-On и Add-In. Он работает InProcess (как Add-In), значит все связи с Visio короткие и быстрые. Вызывается как Add-On (отовсюду). Может обрабатывать события, установленные по AddAdvise (как Add-In), то есть можно очень точно спозиционировать обработчики. В плане безопасности ближе к Add-In, то есть его можно выполнять на тех уровнях безопасности, когда exe Add-On уже запрещен.
Подскажите где можно найте хорошее опсисание что же такое add-in add-on и этот загадочный vsl сочетающий + обоих методов |
|
|
Topic |
|
|
|