All Forums
 Категория Visio
 Форум Вопросы и ответы
 автоматическая индексация
Author Previous Topic Topic Next Topic  

hunt

4 Posts

Posted - 03/13/2007 :  23:06:59
Здравствуйте. Есть такая проблема - надо сделать так, чтобы элементы одного типа (мастера, или как он называется...) нумеровались при создании в порядке их добавления на лист. При удалении элемента должен происходить пересчет индексов. Я это сделал, но работает не супер быстро, несмотря на то, что обновляются при удалении не все элементы, а только начиная с того, который был удален. Вобщем, не быстро (при 100 элементах при удалении 1-го уже заметно, что обновление 99-ти подтормаживает). Может, у шейпа есть уже готовое свойство, которое считает визио? И второй вопрос. Мне надо, чтобы на событие "перед удалением группы" при удалении коннекторов у шейпов, с ними связанных, удалялись элементы из массива FromConnects (так, кажется, он называется). А он только для чтения... и у класса Connects нет метода удаления... Вобщем, надо как-то отсоединить коннектор от шейпа до удаления коннектора. События "после того как удалено выделение" не катит, потому что в нем не удается менять текст шейпов, пишет ошибку. Мб сам успею найти способ, но если кто поможет, заранее спасибо =) сорри, если чего не так объяснил или сказал, просто голова уже квадратная

Tumanov

Russia
1198 Posts

Posted - 03/16/2007 :  21:02:53
1. Такого готового свойства нет.
2. А зачем Вам отсоединять коннектор перед удаленим? Просто удаляйте его, сам отсоединится.
Go to Top of Page

hunt

4 Posts

Posted - 03/17/2007 :  16:06:41
Спасибо большое

И, если не достал, еще один вопрос =) Не подскажете, почему не работает ThisDocument_событие, ведь ThisDocument существует? При этом Document_событие работает, но тут Document, как я понимаю, это класс, а в первом случае - объект. Например, если написать thisPage_событие, то все будет работать, если thisPage объявлена и задана. Но ведь и ThisDocument определен как объект... Или, если несложно, может быть объясните в двух словах, по какому принципу пишутся имена обработчиков событий? А то я уже запутался...

З.Ы. Оказалось, что удалять коннектор при текущем алгоритме нельзя. Делаю SetBegin и SetEnd, оба в позицию 1,1, для всех линий

Edited by - hunt on 03/17/2007 17:20:11
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/17/2007 :  20:12:06
Могу ошибиться, поэтому последующее воспринимайте как версию :)
Имена обработчиков образуются от имен объектов во всех случаях, кроме Document. Причем в этом случае под Document понимается как раз ThisDocument, то есть документ, в котором расположен VBA проект.
Если Вам понадобится прицепить обработчик к событию другого документа, то нужно будет использовать другой объект.
А теперь расскажите, зачем Вам понадобилось самому писать имена обработчиков. Почему просто не выбирать их из списка? В этом случае имена формируются сами и голову ломать не надо...
Ведь как только Вы объявляете WithEvents некий объект, список его событий тут же становится доступен в окне редактора VBA.
Go to Top of Page

hunt

4 Posts

Posted - 03/18/2007 :  20:04:13
насчет выбора из списка я знаю, я спрашивал как раз про то, когда указывается имя объекта, а когда имя класса, т.е. я не мог понять, почему в одних случаях указывается класс, в других объект. Просто тут что руками пиши, что из списка выбирай, все одно непонятно, максимум - можно ошибиться в имени самого события (после "_") Из Вашей версии выходит, что в любом случае указывается объект. Из логики так тоже следует Собственно, больше я пока трудностей с сосбытиями, кроме этого thisDocument, не встречал, и действительно, в остальных случаях имя переменной как префикс обработчика работает.
Спасибо за ответ Правда, у меня еще много вопросов, но не хочу больше мучать людей. Может, потом...
Go to Top of Page

hunt

4 Posts

Posted - 03/19/2007 :  21:02:32
Как-то быстро настало это "потом" =)
Если нетрудно, растолкуйте, как мне записать (программно, конечно) строку в Cell некоторого Row секции visSectionProp. Когда я создавал Row (NamedRow), указал 0 последним параметром. Я посмотрел через окно свойств, там созданный Row имеет тип String (0). После этого я пишу

newShape.Section(visSectionProp).Row(2).Cell(0).Formula = txtTest.Text

соответственно txtText - поле ввода. И вот если я в поле ввода пишу "string", то значение в окне свойств - string, а вот если я пишу string без кавычек, он пишет ошибку "#NAME?" (как я понял, он думает, что это число). То ли я неправильно указал тип Row при создании, то ли не в Formula писать надо, но все равно ничего другого не выходит.
И еще я не нашел в списке компонент таблицу (Grid) =) но это уже, как я понял, проблемы моего Визио.

Просто у меня стоит задача хранить много свойств шейпов, в том числе - таблицы или массивы, которые я в данном случае меняю на строку. У меня была мысль описать класс, дочерний от Shape, задав в него несколько новых свойств, и связать этот класс с шейпами. Но как это сделать, я совершенно не представляю - если Вы дадите мне пример, буду сердечно благодарен =)

З.Ы. извините за назойливость
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 03/22/2007 :  20:15:13
По поводу строки наверное уже успели разобраться (что-то много времени прошло...)
Там надо дополнительные кавычки добавлять. Типа = Chr(34) & str & Chr(34)
А по поводу класса, дочернего от Shape, ничего не скажу. Не пробовал.
Go to Top of Page

hunt

4 Posts

Posted - 03/23/2007 :  09:02:17
да, разобрался, но все равно спасибо за ответ. Просто после си и других языков странно для меня выглядит =)

Насчет классов - я сделал обходной путь. Сделал коллекцию. Туда при добавлении шейпа добавляю экзмепляр класса, который я хотел связать с шейпом. У шейпа ставлю в DataN индекс элемента в этой коллекции (у меня это раньше было уже сделано, я тогда говорил о пересчете индексов и сплошной индексации). Так вот, в классе есть все необходимые свойства, а чтобы объект, связанный с шейпом, получить, я делаю myCollection(myShape.DataN). Соответственно, при сохранении документа создаю файл, куда запихиваю все объекты из myCollection. При открытии документа я из файла их в myCollection назад переношу. В итоге получился весьма странный, но вполне рабочий способ расширения стандартного класса Shape.Я не знаю, можно ли сохранить все переменные как-нить более быстро, пока сделал так...

Если не убил, еще несколько пустых вопросов... =) Не получилось привязать макрос к кнопке (хотя я сам мб все-таки разберусь =)) на панели инструментов. И если я выбираю шейп на листе, ему на дабл клик можно поставить макрос, а если лезу в мастер шейпа, и там хочу какой-нить его части поставить этот же макрос, его в списке нет, там только аддоны.
И самое главное - допустим, я написал события, функции и процедуры, файл работает. Как теперь мне сделать это шаблоном, чтобы для всех вновь создаваемых фйлов применялся этот же код и эта же коллекция шейпов?

когда достану, забаньте Просто я отхожу уже от созданной темы, а новую создавать для каждого вопроса - я так весь форум засорю.
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)