Недавно в форуме возник вопрос - как пристроить пункт контекстного меню шейпа не сверху, а внизу. Что удивительно, вопрос провисел долго, выдержал несколько неточных ответов и был закрыт только после появления истинного корифея. Похоже, что тема освещена явно недостаточно. Попробую слегка раскрыть.

Итак, контекстное меню. Довольно простой и быстрый способ придать интерактивность своему произведению. Не требует знания программирования, только шейп-лист. Может быть навешено как на шейп, так и на страницу. Очень удобно, когда не хочется заморачиваться с риббоном.

Как добавить к шейпу свое меню

Краткий рецепт: открыть шейп-лист, добавить секцию Actions, добавить несколько строк по количеству требуемых пунктов меню, заполнить как минимум ячейки Action и Menu.

У шейпа или страницы уже существует контекстное меню. Пользовательские пункты пристраиваются к нему дополнительно. По умолчанию они пристраиваются сверху. Такое поведение получается автоматически после заполнения двух указанных ячеек.

Плюс существует еще почти десяток ячеек, распоряжающихся нюансами поведения меню. Вот на нюансах хотелось бы остановиться подробнее. Каким может быть меню и как этого достичь.

Есть у шейпа такой метод - AutoConnect. С его помощью один шейп присоединяет к себе другой.

Метод принимает также параметр, с помощью которого можно задать направление размещения для присоединяемого шейпа. Раньше как-то не приходилось задумываться, насколько сильно влияние этого параметра на скорость работы. Но вот неожиданно такой случай подвернулся.

Была у меня программка, которая выводит в графическом виде структуру модулей проектов VBA (входимость и структуру вызовов). И вот, когда понадобилось проанализировать структуру довольно сложного проекта, был поражен ее медлительностью. Естественно, начал искать причину.
В результате обнаружилось, что наибольшее замедление дает вот этот оператор

Sh1.AutoConnect Sh2, visAutoConnectDirRight, mas

Когда-то я подумал, что схема должна располагаться слева направо, поэтому особо не задумываясь, выбрал параметр visAutoConnectDirRight. Причем размещение все равно получается не оптимальным, поэтому в конце оно еще раз приглаживается с помощью ActivePage.Layout.

Ошибки, связанные с локализацией вообще не редкость. Думаю, каждый натыкался на случай, когда копируешь код из справки, а он не работает. А все потому, что в справке стоит точка, а по условиям локализации нужна запятая. Или запятая вместо точки с запятой.

Но еще неприятнее, когда нужен макрос, который должен работать в любой локализации. Здесь уже не обойдешься простой заменой символа в коде. Или как минимум такую замену нужно делать "на лету", во время исполнения макроса. Рассмотрим несколько примеров.

Десятичный разделитель

Предположим, имеется небрежно составленный файл Excel, в котором нас интересуют дробные числа. Небрежность состоит в том, что не соблюдается однообразие форматов. Например, имеются и ячейки, отформатированы как текстовые, и ячейки, отформатированные как числа. Ниже показано, как пользователь будет видеть такой файл на машинах с разной локализацией.

  

Иногда возникает необходимость выбрать некоторое подмножество шейпов на странице Visio. Сам поиск проблемой не является, но нужно ведь еще отобразить его результат, причем так, чтобы и пользователю было удобно, и рисунок не испортить. Особенно в том случае, когда найденных шейпов много и они разбросаны по всей странице.

Понятно, что методов индикации может быть множество. И чтобы при решении каждой задачи не вспоминать их все, можно собрать все или как минимум наиболее употребительные в один модуль, чтобы оставалось только выбрать нужный. Пока в такой модуль вошли четыре метода:

  • текстовое сообщение;
  • селектирование;
  • добавление маркера;
  • подкраска.