Author |
Topic |
|
mers
Russia
159 Posts |
Posted - 03/28/2007 : 10:05:07
|
Здравствуйте. Задача следующая. Есть два шейпа: главный и вспомогательный. PinX и PinY вспомогательного задаются через координаты главного шейпа. Каким образом через шейпшит можно сделать удаление второстепенного шейпа при удалении главного? Т.е. выглядит это так: лежит два шейпа, один "привязан" к другому. При удалении главного, "привязанный" тоже удаляется.
То что это можно сделать обрабатывая программно удаление главного шейпа, я понимаю. Проблема именно в том что бы найти решение задачи использую только шейпшиты этих объектов. |
|
mers
Russia
159 Posts |
Posted - 03/28/2007 : 13:31:59
|
Отловить событие удаление главного объекта в шейпшите привязанного я могу. Вопрос теперь как можно удалить объект через его шейпшит. Может функция какая-нибудь есть? |
|
|
mers
Russia
159 Posts |
Posted - 04/03/2007 : 09:45:30
|
Если кому-то интересно. Ответ: сделать этого нельзя. Можно только сделать объект невидимым.
Поэтому вопрос несколько изменился. Необходимо удалить объект из его шейпшита. Насколько я понимаю по событию можно вызывать какую-либо пользовательскую функцию. Каким образом я могу программно создать такую функцию? Или может быть имеет смысл ее создать раньше, а потом вызывать? Подскажите как лучше? А то что-то не соображу. |
Edited by - mers on 04/03/2007 09:52:15 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/04/2007 : 10:57:02
|
Например создать макрос или AddOn, удаляющий шейп. А из шейп-листа вызывать его. Макрос будет совсем простенький. Типа такого sub ttt() sh.Delete end sub Надо только умудриться передать ему ссылку на удаляемый шейп. А в AddOn шейп должен передаться автоматикой при вызове, но AddOn будет посложнее. Сам вызов в шейп-листе будет примерно таким =RUNMACRO("ThisDocument.ttt") или RUNADDON Как передать ссылку в макрос, надо подумать... Один из вариантов (может и не лучший, но работающий) вот такой: На странице заводим CustomProperties целого типа и через нее передаем ID удаляемого шейпа. Тогда макрос чуть усложнится Sub ttt() i = ActivePage.PageSheet.Cells("Prop.Row_1") ActivePage.Shapes("Sheet." & i).Delete End Sub В первой строке достается индекс, во второй - собственно удаление. Вызов будет таким =SETF(GetRef(ThePage!Prop.Row_1),ID())&RUNMACRO("ThisDocument.ttt") Здесь объединены две команды. Первая записывает ID шейпа в свойство страницы, вторая вызывает макрос. |
|
|
mers
Russia
159 Posts |
Posted - 04/04/2007 : 12:46:45
|
Замечательно. А можно ли создать макрос программно? Насколько я понимаю подключить сделанный нельзя? |
Edited by - mers on 04/04/2007 14:34:16 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/04/2007 : 19:01:52
|
Не понял... Скорее наоборот. Вот создать макрос на ходу - проблематично по причинам безопасности. А использовать ранее сделанный - без проблем. Это и делается в примере. Если Вы хотите сделать что-то программно, то программа у Вас уже выполняется, значит она существует. Значит в ней или рядом с ней может находиться нечто похожее на приведенное выше Sub ttt(). Вот и вызывайте его. |
|
|
mers
Russia
159 Posts |
Posted - 04/08/2007 : 12:16:09
|
Насколько я понимаю макрос привязывается к документу. А можно ли создать макрос "где-то там" и потом привязать его к текущему документу и вызвать его. Т.е. на момент создания макроса я не знаю в каких документах он будет мне нужен. Я хочу подключать его динамически к необходимым документам и использовать в них. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/08/2007 : 16:30:05
|
"Где-то там" работают Add-On'ы. Они к документу не привязываются. Еще можно записать макрос в шаблон и создавать нужные документы на основе этого шаблона. Вам ведь макрос нужен будет не в совершенно произвольных документах, а в нацеленных на решение какой-то задачи... Вот и создавать их все по этому шаблону. |
|
|
|
Topic |
|