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

Евгений

88 Posts

Posted - 01/10/2005 :  18:58:25
У меня очередной вопрос.
Есть список пропертей, он должен быть динамичным, т.е.:
Скажем, есть пропертя some_property_1. Ее значение пусто. Но если пользователь ввел значение, хотелось бы, чтобы появилась пропертя some_property_2, и так далее.
Причем обязательно новая пропертя должна появиться в списке сразу под предыдущей, а не, скажем, в конце списка.
Как это реализовать? МСДН молчит на эту тему.
Возможно, надо добавлять Cells с названием "Prop.[xxx]", где [xxx] - название проперти, но как конкретно это сделать - без понятия.
Подскажите, пожалуйста.

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  19:39:30
Похоже, Вы решили серьезно поработать с Visio. Тогда для начала надо скачать Visio 2002 SDK (или 2003).
Помимо документации там есть Code Librarian Viewer. А в нем, в том числе, вот такой пример:

This function creates a custom property and sets its prompt, label, format, sort key and other values, then adds it to the Visio shape specified in the function parameters.

Requires the SetCellValueToString procedure in the Cell Value As String sample.
=====================
' Copyright (c) Microsoft Corporation. All rights reserved.

Public Function AddCustomProperty(vsoShape As Visio.Shape, _
strLocalRowName As String, _
strRowNameU As String, _
strLabelName As String, _
Optional vsoPropType As VisCellVals, _
Optional strFormat As String, _
Optional strPrompt As String, _
Optional blnAskOnDrop As Boolean, _
Optional blnHidden As Boolean, _
Optional strSortKey As String) As Boolean

' AddCustomProperty
'
' Abstract - This function creates a custom property
' for the shape that is passed in as a parameter.
'
' Parameters
' vsoShape Reference to the Shape object
'
' strLocalRowName Specifies the local name for the row.
' This name will appear in the Custom
' properties dialog for users running
' in developer mode.
'
' strRowNameU Specifies the universal name (NameU)
' for the Custom Property row to be
' created.
'
' strLabelName Specifies the label for the Custom
' Property.
'
' vsoPropType Specifies the type of the value of
' the Custom Property. Not all VisCellVals
' constants are valid for this parameter.
' Only constants that start with visPropType make
' sense in this context.
'
' strFormat Specifies the format of the
' Custom Property.
'
' strPrompt Specifies the prompt for the
' Custom Property.
'
' blnAskOnDrop Specifies the value of the
' Ask On Drop check box of the
' Custom Property.
'
' blnHidden Specifies the value of the
' Hidden check box of the Custom Property.
'
' strSortKey Specifies the value of the
' Sort key of the Custom Property.
'
' Return Value True if successful, False otherwise.
'

Dim vsoCell As Visio.Cell
Dim intRowIndex As Integer

On Error GoTo AddCustomProperty_Err

' Add a named Custom Property row. In addition to
' adding a row with the local name (strLocalRowNname),
' this call will usually set the universal name of
' the new row to strLocalRowName as well.
' However, the universal row name will not be set
' if this shape already has a custom property row
' with the universal name (NameU) equal to strLocalRowName.
intRowIndex = vsoShape.AddNamedRow(visSectionProp, _
strLocalRowName, VisRowIndices.visRowProp)

' The columns of the properties that this functions
' sets are fixed, and can be accessed directly using
' the CellsSRC method and column index.

' Column 1: Prompt
' Get the Cell object.
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsPrompt)
SetCellValueToString vsoCell, strPrompt

' Any cell in the row can be used to set the
' universal row name. Only set the name if
' strRowNameU differs from the local name and
' is not blank.
If (strLocalRowName <> strRowNameU And _
Len(strRowNameU) > 0) Then
vsoCell.RowNameU = strRowNameU
End If

' Column 2: Label
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsLabel)
SetCellValueToString vsoCell, strLabelName

' Column 3: Format
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsFormat)
SetCellValueToString vsoCell, strFormat

' Column 4: Sort Key
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsSortKey)
SetCellValueToString vsoCell, strSortKey

' Column 5: Type
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsType)
vsoCell.ResultIU = vsoPropType

' Column 6: Hidden
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsInvis)
vsoCell.ResultIU = blnHidden

' Column 7: Ask to drop
Set vsoCell = vsoShape.CellsSRC(visSectionProp, _
visRowProp + intRowIndex, visCustPropsAsk)
vsoCell.ResultIU = blnAskOnDrop

AddCustomProperty = True

Exit Function

AddCustomProperty_Err:
MsgBox Err.Description

End Function
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/11/2005 :  09:20:31  Visit immortal's Homepage
добавляем проперти след образом: берем визио 2003, жмем "записать макрос" и добавляем проперти в ручную, далее останавливаем макрос и анализируем
сортировка: добавляет проперти всегда в конец, исключение составляет лишь случай если проперти удалены (допустим 2-я, 5-я и 8-я, будут дорбавляться соотв. сначала 2, потом 5, потом 8-я), есть свойства у пропертей "SortKey" проперти имеют расположение в соотв. с нумерацией сортировки потом по порядку, если SortKey у пропертей №1,№2,№3,№4,№5,№6,№7,№8,№9 имеют значение 1,2,3,1,1,3,1,1,No Formula, то видеть вы их будете в следю порядке №1,№4,№5,№7,№8,№2,№3,№6,№9,
в этом случае надо запускать макрос на выполнение по какомуто событию, пока не знаю
можно не добавлять проперти, а заранее создать несколько штук, тогда макросы не понадобяться, а достаточно написать в свойстве "invisible" prop.row_2 формулу =if(lookup(prop.row_1,""),0,1), в этом случае она просто будет вам открываться
если описать подробнее проблему, то могу конкретизировать как сделать
например не понятно что требуется при изменении значения?

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

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

Евгений

88 Posts

Posted - 01/13/2005 :  12:07:28
Извиняюсь, что долго не отвечал, было много дел в другой сфере. Но я опять с вами :)

Попробую сконкретизировать проблему. Есть мастер, у которого есть разные проперти. Некоторый вид пропертей может появляться в разном кол-ве. К примеру, есть шейп "человек", у которого может быть разное кол-во автомобилей, по дефолту ноль. Но он может оказаться Биллом Гейтсом и иметь 473 машины. Но не творить же сразу на запас 1000 пропертей car_1, car_2... Естественным решением является введение первой проперти этого типа - car_1 - и добавление следующих при потребности. А потребность возникает, когда пользователь заполнил последнюю пропертю.

Мы тут только что посоветовались и решили идти самым простым путем, т.е., как вы указывали, создать заранее максимальное кол-во пропертей и сделать их невидимыми.

Г-н Туманов, а вообще зачем нужно Visio SDK? Неужели в самом Вижио + VB-editor не даются все возможности, и нужно это расширять?
Go to Top of Page

Евгений

88 Posts

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

immortal

Russia
391 Posts

Posted - 01/13/2005 :  12:51:57  Visit immortal's Homepage
в ручную никак, нужно переименовывать все проперти и переставлять значения, когдато я над этим думал, но решил что нет мне смысла этого делать, т.к. это нужно только при разработке, а конечный пользователь этим пользоваться не будет, поэтому обхожусь сортировкой,
а так надо писать макрос (программу) с примерно след. алгоритмом:
задаем:
номер по порядку проперти перемещаемой = р1
номер куда надо поместить = р2

далее вставляем в конец еще одну пропертю
копируем туда значенияи имя проперти р1 (причем надо учесть что имя пропертей не должны совпадать, при получении значения имени р1 измените имя р1 на другое)
делаем цикл смещения пропертей от р1-1 до р2 на р1 до р2+1 соотв.
переписываем из последней проперти в р2
и всего-то удачи

да забыл, не забудьте удалить последнюю пропертю которую создали
можно конечно и не создавать её, а хранить все в переменных, или вобще вставлять сразу в середину с помощью программы.

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

...а вобще-то я белый и пушистый.

Edited by - immortal on 01/13/2005 12:55:47
Go to Top of Page

Евгений

88 Posts

Posted - 01/13/2005 :  13:04:47
Спасибо, но я тоже вдруг подумал, как и вы - мне при разработке это, хоть и не всегда удобно, но не критично, а юзеру и так все равно. Пусть тогда будет, как есть :)
Go to Top of Page

Digitall

Russia
389 Posts

Posted - 01/13/2005 :  13:18:11  Visit Digitall's Homepage
quote:
Originally posted by immortal

в ручную никак, нужно переименовывать все проперти и переставлять значения, когдато я над этим думал, но решил что нет мне смысла этого делать, т.к. это нужно только при разработке, а конечный пользователь этим пользоваться не будет, поэтому обхожусь сортировкой,
а так надо писать макрос (программу) с примерно след. алгоритмом:
задаем:
номер по порядку проперти перемещаемой = р1
номер куда надо поместить = р2

далее вставляем в конец еще одну пропертю
копируем туда значенияи имя проперти р1 (причем надо учесть что имя пропертей не должны совпадать, при получении значения имени р1 измените имя р1 на другое)
делаем цикл смещения пропертей от р1-1 до р2 на р1 до р2+1 соотв.
переписываем из последней проперти в р2
и всего-то удачи

да забыл, не забудьте удалить последнюю пропертю которую создали
можно конечно и не создавать её, а хранить все в переменных, или вобще вставлять сразу в середину с помощью программы.

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

...а вобще-то я белый и пушистый.


Заметил интересное поведение.
Допустим у фигуры есть 10 Custom Properties. Если просто зайти в ShapeSheet и вставить строку, то программа поставит новое свойство в конец списка, но если удалить, к примеру, 5-е свойство и вставить строку, то в этом случае программа поставит новую строку взамен старой, равно как и следующую строку, т.е. будет выполнена вставки строки в середину списка. Я пока не знаю, можно ли это сделать программно, но ручками возможно.
Go to Top of Page

immortal

Russia
391 Posts

Posted - 01/13/2005 :  14:00:14  Visit immortal's Homepage
quote:
Допустим у фигуры есть 10 Custom Properties. Если просто зайти в ShapeSheet и вставить строку, то программа поставит новое свойство в конец списка, но если удалить, к примеру, 5-е свойство и вставить строку, то в этом случае программа поставит новую строку взамен старой, равно как и следующую строку, т.е. будет выполнена вставки строки в середину списка. Я пока не знаю, можно ли это сделать программно, но ручками возможно.

опоздал
quote:
исключение составляет лишь случай если проперти удалены (допустим 2-я, 5-я и 8-я, будут дорбавляться соотв. сначала 2, потом 5, потом 8-я),


на мой взгляд хуже нету (я имею в виду для программы) чем удаление из середины и вставка вновь, т.к замечено что у меня обращение из программы идет по номеру строки, и при удалении 5- й строки, номер строки 6 становиться 5-м, а ссылка на 6 строку останется на 6
...CellsSRC(visSectionUser,6,visUserValue).formulaU

так-что думаю что трудновато отследить, а тем более задать, т.к. при задании командой не указывается номер строки, если удалены 5 и 6, то невозможно вставить сначала 6 а потом 5
програмно будут добавляться 5 потом 6 потом в конец
к стати всех с наступающим новым годом

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

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

Евгений

88 Posts

Posted - 01/13/2005 :  15:31:02
>к стати всех с наступающим новым годом

Вас с тем же :)
Go to Top of Page

TuzhibaevTA

Russia
85 Posts

Posted - 01/17/2005 :  09:41:05
Ну и запросы у Вас, сказала база данных и зависла :).
Я тоже начал сурьезно изучать Visio и его окошко с "пропертями".
И пришел к выводу что лучше бы мне его не трогать (так как мои запросы к этому окошку возрастали с каждым днем), а воспользоваться механизмами расширения через окошки Visio.
Вот что я нарыл сегодня в MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvisio00/html/visanchorwindows.asp
Пример так же работает и в 2003 версии.

Тужибаев Тимур
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)