Author |
Topic |
|
SunFlame
4 Posts |
Posted - 05/06/2005 : 17:35:38
|
Здравия желаю всем просматривающим! Вопрос у меня большой и (на мой взгляд) сложный! Вот, решил я заняться визио вплотную! тем более некоторый опыт общения с ним уже имел - пару лет назад бился над той же задачей. в тот раз (давно это было) победить я его не смог! ну да, надо честно признаться: Си++ фореве, а вижуал бэйсик - будь он проклят!!! уже несколько раз пытался завязаться с этим языком и каждый раз прихожу только к одному выводу - "убыв бы" всех разработчиков объектных связей для него. хотя, может я с чем не разобрался, конечно, так что не судите сгоряча! Но, перейдем ближе к теме. Итак, я захотел создать групповой объект, из простого прямоугольника с текстом и строки заголовка! не спорю - это легко! :) но дальше! во внутреннем шейпе, который прямоугольник - есть текст. задача - напротив каждой строки по левой и правой стороне этого шейпа сделать по соединительной точке! причем делать это надо динамически! то есть бросив групповой шейп на страницу и при изменении текста во внутреннем шейпе создавать или удалять соединительные точки! сам попытался сделать это через событие TheText в этом внутреннем шейпе, но обнаружил, что во первых - не могу узнать из которого группового шейпа на странице возникло событие, а во вторых - что называется "вчера это событие отрабатывало, а сегодня нет!!! ниче не менял!". а еще - не смог добраться до внутреннего шейпа. как? число строк в тексте считаю по количеству vbLf (при этом в нужных местах вписана guard-функция). подскажите, кто что может!!! буду БЕЗМЕРНО благодарен! :)
|
Edited by - SunFlame on 05/07/2005 01:13:56 |
|
Digitall
Russia
389 Posts |
Posted - 05/06/2005 : 17:43:14
|
quote: Originally posted by SunFlame
Здравия желаю всем просматривающим! Вопрос у меня большой и (на мой взгляд) сложный! Вот, решил я заняться визио вплотную! тем более некоторый опыт общения с ним уже имел - пару лет назад бился над той же задачей. в тот раз (давно это было) победить я его не смог! ну да, надо честно признаться: Си++ фореве, а вижуал бэйсик - будь он проклят!!! уже несколько раз пытался завязаться с этим языком и каждый раз прихожу только к одному выводу - "убыв бы" всех разработчиков объектных связей для него. хотя, может я с чем не рабобрался, конечно, так что не судите ! Но, перейдем ближе к теме. Итак, я захотел создать групповой объект, из простого прямоугольника с текстом и строки заголовка! не спорю - это легко! :) но дальше! итак во внутреннем шейпе, который прямоугольник - есть текст. задача - напротив каждой строки по левой и правой стороне этого шейпа сделать по соединительной точке! причем делать это надо динамически! то есть бросив групповой шейп на страницу и при изменении текста во внутреннем шейпе создавать или удалять соединительные точки! сам попытался сделать это через событие TheText в этом внутреннем шейпе, но обнаружил, что во первых - не могу узнать из которого группового шейпа на странице возникло событие, а во вторых - что называется "вчера это событие отрабатывало, а сегодня нет!!! ниче не менял!". а еще - не смог добраться до внутреннего шейпа. как? число строк в тексте считаю по количеству vbLf (при этом в нужных местах вписана guard-функция). подскажите, кто что может!!! буду БЕЗМЕРНО благодарен! :)
А решение должно быть обязательно в VB. Я примерно такую задачу решил подручными средствами... Добавление соединительных точек при изменении размера объекта... вроде решение то же, только касательно текстового блока. |
|
|
SunFlame
4 Posts |
Posted - 05/07/2005 : 00:57:37
|
quote: Originally posted by Digitall А решение должно быть обязательно в VB. Я примерно такую задачу решил подручными средствами... Добавление соединительных точек при изменении размера объекта... вроде решение то же, только касательно текстового блока.
Спасибо, что откликнулись! однако на вашей домашней страничке (если я правильно понял, то именно там нужно искать) ничего подобного этому:
quote: Добавление соединительных точек при изменении размера объекта
я не увидел. но может я плохо смотрел? не могли бы вы указать адресок этой статьи поконкретней??? или подсказать как разрешить все те мною встреченные, неприятные мелочи? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/07/2005 : 10:06:04
|
Выделяем задачи: 1. напротив каждой строки по левой и правой стороне этого шейпа сделать по соединительной точке 2. при изменении текста во внутреннем шейпе создавать или удалять соединительные точки 3. узнать из которого группового шейпа на странице возникло событие 4. как добраться до внутреннего шейпа
Чуть было не начал по запарке макрос писать, Но вовремя остановился :) Есть ведь похожее красивое решение среди поставляемых шейпов. Может проще действовать по его принципу? В трафарете Title Blocs (Metric) есть шейп 5 ruled column. Этот шейп в зависимости от числа строк текста изменяет свою геометрию, прорисовывает дополнительные прямоугольнички. Принцип следующий: в шейп-листе вся геометрия создана на 5 строк (по максимуму), а при изменении текста изменяются координаты линий. В результате линии "проявляются" в нужном месте. Аналогичный шейп есть и с ограничением в 15 строк. Расчет числа строк и размеров строки в аналоге сделан хорошо. Так что можно практически не придумывать своих расчетных формул, а воспользоваться готовыми результатами. VBA становится ненужным, а при этом и задачи 3 и 4 тоже отпадают :) Единственное условие - задача должна допускать решение с ограничением на число строк! Правда, соединительные точки будут на внутреннем шейпе, а не на группе, но это вроде ничему не должно помешать... ------------- Ну, а если это не подойдет, то по поводу задач 3 и 4 (первые две, как я понимаю, решены): 3. Перейти вверх можно через метод Parent. Вот такой обработчик после завершения редактирования текста внутреннего шейпа выдаст имя шейпа-группы Private Sub Document_ShapeExitedTextEdit(ByVal Shape As IVShape) MsgBox Shape.Parent.Name End Sub 4. Страница имеет коллекцию Shapes - с ней все ясно. Но каждая группа (включая любой уровень вложения) тоже имеет свою коллекцию Shapes. Так что влезть в шейп на третьем уровне группировки можно примерно так ActivePage.Shapes("Группа").Shapes("ВнутренняяГруппа").Shapes("ИскомыйШейп") |
|
|
SunFlame
4 Posts |
Posted - 05/08/2005 : 15:39:51
|
quote: Originally posted by Tumanov
Выделяем задачи: 1. напротив каждой строки по левой и правой стороне этого шейпа сделать по соединительной точке 2. при изменении текста во внутреннем шейпе создавать или удалять соединительные точки 3. узнать из которого группового шейпа на странице возникло событие 4. как добраться до внутреннего шейпа
список задач действительно таков, но при одном условии - я не могу рассматривать их по отдельности. то есть в рамках одной общей задачи эти подзадачи для меня не делимы! :) но если все же это сделать, то замечу, что задачу 2 я еще не решил! потому как написание обработчиков событий в вижуал бейсике для меня остается загадкой. я вообще не вижу, где в редакторе ВБ есть события, которым можно было бы назначить метод!!! все, что я имею (то есть, все что я сумел найти) - это ShapeSheet и функцию RUNADDON для события TheText. в связи с чем мне немгого не ясен смысл описания процедуры:
quote:
Private Sub Document_ShapeExitedTextEdit(ByVal Shape As IVShape) MsgBox Shape.Parent.Name End Sub
в чем радость добавления входного параметра (правда я еще не выяснил, что это за тип - IVShape - нет рядом доки), если я не знаю, что в него передать?! у меня ведь все выглядит так:
RUNADDON("ThisDocument.MySubName") на ShapeSheet'е внутреннего шэйпа
Может дело в самом редакторе? я пользуюсь редактором по умолчанию - Microsoft Visual Basic 6.3
по поводу задачи 4 - она возникла как следствие попытки сделать все это путем обработки ActiveWindow.Selection.Item(1) из которого мне и не удалось добраться до внутреннего шейпа (invalid section получил)
плюс ко всему остальному получил сообщение unexpected end of file при выполнении процедуры из редактора. связать ни с чем эту ошибку не смог. может кто-либо знает что она может значить (ее непосредственный смысл понятен)?
А на счет
quote: Title Blocs (Metric) есть шейп 5 ruled column
обязательно взгляну! очень интересно. хотя ограничение по числу строк все же не желательно. |
Edited by - SunFlame on 05/08/2005 19:26:42 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/08/2005 : 18:37:29
|
Для начала проще работать не с Add-on'ами, а с макросами. А уж потом, при наличии опыта и необходимости, писать экзешники. В этом случае будем говорить не о VB, а о VBA - тот же VB, только встроенный в Visio. Ему и документ ближе и все его события. Так вот, при открытии Visual Basic Editor по умолчанию наверху над правой поляной имеются два окошка. В левом из них, предназначенном для объектов, написано (General), а по стрелочке можно выдернуть еще один - Document. При этом в том окошке, что поправее, становятся доступны события объекта документ. В том числе и событие ShapeExitedTextEdit. Если его выбрать, то VBA оформит шаблон для обработчика: Private Sub Document_ShapeExitedTextEdit(ByVal Shape As IVShape) End Sub Вот туда и надо встраивать свой код. Этот обработчик будет вызываться автоматически при завершении редактирования текста любого шейпа данного документа. А для того, чтобы можно было разобраться, что же редактировали, Visio передает в качестве параметра ссылку на редактируемый шейп. А вообще-то, надо хотя бы Help'ом пользоваться, если уж SDK скачивать не хочется. Это значительно сократит время на освоение программирования в Visio. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/08/2005 : 18:41:29
|
Да, по поводу ошибки... У ActivePage нет свойства Selection. Selection бывает только у ActiveWindow. |
|
|
SunFlame
4 Posts |
Posted - 05/08/2005 : 19:17:13
|
quote: Originally posted by Tumanov
Да, по поводу ошибки... У ActivePage нет свойства Selection. Selection бывает только у ActiveWindow.
Упс! это случайность! я имел в виду ActiveWindow - я ведь все пошагово проверял! и уж поверьте мне, хелп я не только читаю, я вообще только с ним и работаю. но вот встал в тупик с визио. точнее с ВБ. про метод понятно! Благодарю, все нашел! раньше даже понять не мог, зачем там эти списки выпадающие. теперь попробую, как до Визио доберусь - далеко он от меня - послезавтра. посмотрим, что получится... |
Edited by - SunFlame on 05/08/2005 19:41:02 |
|
|
|
Topic |
|
|
|