Author |
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. А зачем Вам отсоединять коннектор перед удаленим? Просто удаляйте его, сам отсоединится. |
|
|
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 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/17/2007 : 20:12:06
|
Могу ошибиться, поэтому последующее воспринимайте как версию :) Имена обработчиков образуются от имен объектов во всех случаях, кроме Document. Причем в этом случае под Document понимается как раз ThisDocument, то есть документ, в котором расположен VBA проект. Если Вам понадобится прицепить обработчик к событию другого документа, то нужно будет использовать другой объект. А теперь расскажите, зачем Вам понадобилось самому писать имена обработчиков. Почему просто не выбирать их из списка? В этом случае имена формируются сами и голову ломать не надо... Ведь как только Вы объявляете WithEvents некий объект, список его событий тут же становится доступен в окне редактора VBA. |
|
|
hunt
4 Posts |
Posted - 03/18/2007 : 20:04:13
|
насчет выбора из списка я знаю, я спрашивал как раз про то, когда указывается имя объекта, а когда имя класса, т.е. я не мог понять, почему в одних случаях указывается класс, в других объект. Просто тут что руками пиши, что из списка выбирай, все одно непонятно, максимум - можно ошибиться в имени самого события (после "_") Из Вашей версии выходит, что в любом случае указывается объект. Из логики так тоже следует Собственно, больше я пока трудностей с сосбытиями, кроме этого thisDocument, не встречал, и действительно, в остальных случаях имя переменной как префикс обработчика работает. Спасибо за ответ Правда, у меня еще много вопросов, но не хочу больше мучать людей. Может, потом... |
|
|
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, задав в него несколько новых свойств, и связать этот класс с шейпами. Но как это сделать, я совершенно не представляю - если Вы дадите мне пример, буду сердечно благодарен =)
З.Ы. извините за назойливость |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/22/2007 : 20:15:13
|
По поводу строки наверное уже успели разобраться (что-то много времени прошло...) Там надо дополнительные кавычки добавлять. Типа = Chr(34) & str & Chr(34) А по поводу класса, дочернего от Shape, ничего не скажу. Не пробовал. |
|
|
hunt
4 Posts |
Posted - 03/23/2007 : 09:02:17
|
да, разобрался, но все равно спасибо за ответ. Просто после си и других языков странно для меня выглядит =)
Насчет классов - я сделал обходной путь. Сделал коллекцию. Туда при добавлении шейпа добавляю экзмепляр класса, который я хотел связать с шейпом. У шейпа ставлю в DataN индекс элемента в этой коллекции (у меня это раньше было уже сделано, я тогда говорил о пересчете индексов и сплошной индексации). Так вот, в классе есть все необходимые свойства, а чтобы объект, связанный с шейпом, получить, я делаю myCollection(myShape.DataN). Соответственно, при сохранении документа создаю файл, куда запихиваю все объекты из myCollection. При открытии документа я из файла их в myCollection назад переношу. В итоге получился весьма странный, но вполне рабочий способ расширения стандартного класса Shape.Я не знаю, можно ли сохранить все переменные как-нить более быстро, пока сделал так...
Если не убил, еще несколько пустых вопросов... =) Не получилось привязать макрос к кнопке (хотя я сам мб все-таки разберусь =)) на панели инструментов. И если я выбираю шейп на листе, ему на дабл клик можно поставить макрос, а если лезу в мастер шейпа, и там хочу какой-нить его части поставить этот же макрос, его в списке нет, там только аддоны. И самое главное - допустим, я написал события, функции и процедуры, файл работает. Как теперь мне сделать это шаблоном, чтобы для всех вновь создаваемых фйлов применялся этот же код и эта же коллекция шейпов?
когда достану, забаньте Просто я отхожу уже от созданной темы, а новую создавать для каждого вопроса - я так весь форум засорю. |
|
|
|
Topic |
|
|
|