Author |
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
|
|
|
immortal
Russia
391 Posts |
Posted - 01/11/2005 : 09:20:31
|
добавляем проперти след образом: берем визио 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 форэвер
...а вобще-то я белый и пушистый. |
|
|
Евгений
88 Posts |
Posted - 01/13/2005 : 12:07:28
|
Извиняюсь, что долго не отвечал, было много дел в другой сфере. Но я опять с вами :)
Попробую сконкретизировать проблему. Есть мастер, у которого есть разные проперти. Некоторый вид пропертей может появляться в разном кол-ве. К примеру, есть шейп "человек", у которого может быть разное кол-во автомобилей, по дефолту ноль. Но он может оказаться Биллом Гейтсом и иметь 473 машины. Но не творить же сразу на запас 1000 пропертей car_1, car_2... Естественным решением является введение первой проперти этого типа - car_1 - и добавление следующих при потребности. А потребность возникает, когда пользователь заполнил последнюю пропертю.
Мы тут только что посоветовались и решили идти самым простым путем, т.е., как вы указывали, создать заранее максимальное кол-во пропертей и сделать их невидимыми.
Г-н Туманов, а вообще зачем нужно Visio SDK? Неужели в самом Вижио + VB-editor не даются все возможности, и нужно это расширять? |
|
|
Евгений
88 Posts |
Posted - 01/13/2005 : 12:10:18
|
Кстати, а как при редактировании списка пропертей менять их порядок? Не только посортировать по столбцу, а поменять произвольным образом, например перетянуть мышью наверх? Просто иногда забываю добавить нужную пропертю в нужное место, а потом уже поздно, т.к. она добавляется в конец и ничего с этим сделать нельзя... |
|
|
immortal
Russia
391 Posts |
Posted - 01/13/2005 : 12:51:57
|
в ручную никак, нужно переименовывать все проперти и переставлять значения, когдато я над этим думал, но решил что нет мне смысла этого делать, т.к. это нужно только при разработке, а конечный пользователь этим пользоваться не будет, поэтому обхожусь сортировкой, а так надо писать макрос (программу) с примерно след. алгоритмом: задаем: номер по порядку проперти перемещаемой = р1 номер куда надо поместить = р2
далее вставляем в конец еще одну пропертю копируем туда значенияи имя проперти р1 (причем надо учесть что имя пропертей не должны совпадать, при получении значения имени р1 измените имя р1 на другое) делаем цикл смещения пропертей от р1-1 до р2 на р1 до р2+1 соотв. переписываем из последней проперти в р2 и всего-то удачи
да забыл, не забудьте удалить последнюю пропертю которую создали можно конечно и не создавать её, а хранить все в переменных, или вобще вставлять сразу в середину с помощью программы.
визио 2003 форэвер
...а вобще-то я белый и пушистый. |
Edited by - immortal on 01/13/2005 12:55:47 |
|
|
Евгений
88 Posts |
Posted - 01/13/2005 : 13:04:47
|
Спасибо, но я тоже вдруг подумал, как и вы - мне при разработке это, хоть и не всегда удобно, но не критично, а юзеру и так все равно. Пусть тогда будет, как есть :) |
|
|
Digitall
Russia
389 Posts |
Posted - 01/13/2005 : 13:18:11
|
quote: Originally posted by immortal
в ручную никак, нужно переименовывать все проперти и переставлять значения, когдато я над этим думал, но решил что нет мне смысла этого делать, т.к. это нужно только при разработке, а конечный пользователь этим пользоваться не будет, поэтому обхожусь сортировкой, а так надо писать макрос (программу) с примерно след. алгоритмом: задаем: номер по порядку проперти перемещаемой = р1 номер куда надо поместить = р2
далее вставляем в конец еще одну пропертю копируем туда значенияи имя проперти р1 (причем надо учесть что имя пропертей не должны совпадать, при получении значения имени р1 измените имя р1 на другое) делаем цикл смещения пропертей от р1-1 до р2 на р1 до р2+1 соотв. переписываем из последней проперти в р2 и всего-то удачи
да забыл, не забудьте удалить последнюю пропертю которую создали можно конечно и не создавать её, а хранить все в переменных, или вобще вставлять сразу в середину с помощью программы.
визио 2003 форэвер
...а вобще-то я белый и пушистый.
Заметил интересное поведение. Допустим у фигуры есть 10 Custom Properties. Если просто зайти в ShapeSheet и вставить строку, то программа поставит новое свойство в конец списка, но если удалить, к примеру, 5-е свойство и вставить строку, то в этом случае программа поставит новую строку взамен старой, равно как и следующую строку, т.е. будет выполнена вставки строки в середину списка. Я пока не знаю, можно ли это сделать программно, но ручками возможно. |
|
|
immortal
Russia
391 Posts |
Posted - 01/13/2005 : 14:00:14
|
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 форэвер
...а вобще-то я белый и пушистый. |
|
|
Евгений
88 Posts |
Posted - 01/13/2005 : 15:31:02
|
>к стати всех с наступающим новым годом
Вас с тем же :) |
|
|
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 версии.
Тужибаев Тимур |
|
|
|
Topic |
|
|
|