Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 09 апр 2020, 08:57

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !
Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 20 фев 2020, 17:36 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Добрый вечер спецы. Наткнулся на интересную проблему.
Написал макрос, который запускается через Events/EventXFMod при изменении габаритов фигуры по горизонтали и делает возврат в исходное состояние положения средней линии (visSectionControls, 0, visCtlX) для фигуры типа зигзаг _|¯ . То есть при перемещении точки BeginX средняя линия меняет положение (в зависимости от режима visCtlXCon) в соответствии с новыми габаритами, а макрос возвращает ее в первоначальное относительно страницы положение. Так как секции visCtlXCon нельзя установить режим ориентации маркера-ползунка средней линии относительно окружающего мира, только относительно точки фигуры (я использую режим 2 = visCtlOffsetMin).
Дело в том, что EventXFMod при этом запускает макрос 5 раз и CALLTHIS без останова в теле макроса корректно не выполняется. Поэтому использую RUNMACRO с аргументами НомерСтраницы, IDшейпа. Но никак не получилось передать два аргумента.

Следующий код НЕ работает:
Код:
Events/EventXFMod = RUNMACRO("Module3.LineControlReturner("&PAGENUMBER(),ID()&")","v400")


Следующий код НЕ работает:
Код:
Events/EventXFMod = RUNMACRO("Module3.LineControlReturner("&PAGENUMBER()&","&ID()&")","v400")


Вышел из положения объединив числовые значения в одно дробное число. Следующий код работает:
Код:
Events/EventXFMod = RUNMACRO("Module3.LineControlReturner("&PAGENUMBER()&"."&ID()&")","v400")

что конечно же добавило лишних операций по их дальнейшему разделению.

Как нибудь можно передать через RUNMACRO два аргумента? Либо подскажите как отложенно (с задержкой) запустить макрос через CALLTHIS.
П.С. В другом макросе который заменяет линии (нужно было шейпы поменять) пришлось поставить задержку 0.01 секунды через таймер с DoEvents, чтобы этот макрос корректно выполнялся. Этого времени хватает чтобы геометрия фигуры пришла в норму после изменения.


Последний раз редактировалось TheHeat 25 фев 2020, 09:24, всего редактировалось 1 раз.

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 20 фев 2020, 18:39 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1571
Очков репутации: 100611

Добавить очки репутацииУменьшить очки репутации
Это называется - создать себе проблему, чтобы было, что преодолевать.
Цитата:
Дело в том, что EventXFMod при этом запускает макрос 5 раз

EventXFMod запускает макрос один раз. Повторные запуски порождаются уже Вашими действиями.
1. Шейп изменился и пошел первый запуск. Это нормально.
2. В ходе выполнения макроса идет повторное изменение шейпа (во время работы VBA), которое приводит к следующему запуску макроса. Шаг 2 может повторяться бесконечно и непредсказуемо. Это уже криминал.
-----
Если уж очень нравятся извращения, то нужно хотя бы исключить запуск макроса в макросе.
Например, по EventXFMod просто взводить какой-то флаг, записывать в переменную данные о причине срабатывания. Потом ждать завершения макроса и только после этого запускать другой макрос для отработки (и сбрасывания) флага.
Вторичный обработчик нужно привязывать не к EventXFMod, а к таймеру или VisioIsIdle.
----
А что, формулами никак не удается добиться нужного поведения линии?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 10:59 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
EventXFMod запускает макрос один раз. Повторные запуски порождаются уже Вашими действиями.
1. Шейп изменился и пошел первый запуск. Это нормально.
2. В ходе выполнения макроса идет повторное изменение шейпа (во время работы VBA), которое приводит к следующему запуску макроса. Шаг 2 может повторяться бесконечно и непредсказуемо. Это уже криминал.

Это не так. Макрос не запускает макрос 100%. И я не согласен что это "мои действия". Действие у меня одно - изменение координаты BeginX,BeginY или EndX,EndY, но количество запусков EventXFMod зависит от количества движения шейпа по сетке в реальном времени, но почему-то с запуском после окончания движения, что по моему мнению никому не нужно.
Простой пример навесим на EventXFMod запуск RUNMACRO("Module3.Example","v400")
Код:
Sub Example()
Debug.Print "launch"
End Sub

Делаем операцию и после отпускания ЛКМ получаем результат:
Перетаскивание шейпа - 1 принт
Изменение BeginX и/или BeginY в N шагов (перетаскиваем ползунок из одной клетки в другую и затем в другую .. в N клетку) - N принтов
Изменение положения маркера-ползунка (visSectionControls, 0, visCtlX) - 0 принтов.

(интересно хранятся ли значения всей геометрии шейпа для каждого шага ее изменения :roll: )

Tumanov писал(а):
Если уж очень нравятся извращения, то нужно хотя бы исключить запуск макроса в макросе.
Например, по EventXFMod просто взводить какой-то флаг, записывать в переменную данные о причине срабатывания. Потом ждать завершения макроса и только после этого запускать другой макрос для отработки (и сбрасывания) флага.
Вторичный обработчик нужно привязывать не к EventXFMod, а к таймеру или VisioIsIdle.

Если это по поводу таймера задержки, то судя по описанию отложенный запуск не проще вставки задержки 0,01 сек после вызова call. Задержка в стороннем макросе нужна единожды после изменения координат начала и перед изменением координат конца. Не критично в принципе.

Tumanov писал(а):
А что, формулами никак не удается добиться нужного поведения линии?

А как? visCtlXCon - статично (рисует линию на расстоянии от BeginX). Чтобы visCtlXCon вернуть в прежнее положение на сетке после изменения BeginX нужно знать предыдущее значение BeginX до эвента. Я сохраняю значение BeginX в ячейку visCtlTip и затем восстанавливаю оттуда, вычисляю новое visCtlXCon и снова сохраняю изменившееся BeginX в visCtlTip на будущее .

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


Последний раз редактировалось TheHeat 21 фев 2020, 11:37, всего редактировалось 1 раз.

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 11:34 
Не в сети
Глав-тролль

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3815
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Сбор вторичного сырья
Должность: Безработный
Уровнь квалификации: Отсутствует
TheHeat писал(а):
для фигуры типа зигзаг _|¯ .
вы имеете в виду штатную фигуру коннектор (соединительная линия)?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 11:35 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Ща пришло в голову, что должен быть режим запрета динамической отрисовки геометрии шейпа. И нашел :D
Shape.CellsSRC(visSectionObject, visRowMisc, visNoLiveDynamics).FormulaU = "TRUE"
После чего макрос запускается единожды.
Но топик не об этом был вообще-то)))

Повторю вопрос: как передать два и более аргумента в RUNMACRO?


Последний раз редактировалось TheHeat 21 фев 2020, 11:42, всего редактировалось 1 раз.

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 11:41 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
TheHeat писал(а):
для фигуры типа зигзаг _|¯ .
вы имеете в виду штатную фигуру коннектор (соединительная линия)?

Нет не "Dynamic connector". Его логика намного сложнее и излишня для моих целей. Шейп создан мной с нуля и ничего такого не умеет.


Вложения:
Screenshot_1.png
Screenshot_1.png [ 34.94 Кб | Просмотров: 132 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 12:40 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1571
Очков репутации: 100611

Добавить очки репутацииУменьшить очки репутации
Цитата:
Но топик не об этом был вообще-то)))
Повторю вопрос: как передать два и более аргумента в RUNMACRO?

По официальной документации в RUNMACRO нельзя передать ни одного аргумента. Все остальное - попытка обмана Visio с непредсказуемым результатом.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 12:43 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1571
Очков репутации: 100611

Добавить очки репутацииУменьшить очки репутации
Цитата:
Перетаскивание шейпа - 1 принт

С этим согласен
Цитата:
Изменение положения маркера-ползунка (visSectionControls, 0, visCtlX) - 0 принтов.

С этим тоже согласен, так как при перемещении ползунка положение шейпа не меняется.
Цитата:
Изменение BeginX и/или BeginY в N шагов (перетаскиваем ползунок из одной клетки в другую и затем в другую .. в N клетку) - N принтов

А это просто непонятно. Причем здесь клетки и какую именно операцию выполняет пользователь. Скорее всего просто несколько элементарных операций почему-то обозвали одной. То есть "N шагов" - это N перемещений. Естественно, будет N срабатываний.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 13:02 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Цитата:
Изменение BeginX и/или BeginY в N шагов (перетаскиваем ползунок из одной клетки в другую и затем в другую .. в N клетку) - N принтов

А это просто непонятно. Причем здесь клетки и какую именно операцию выполняет пользователь. Скорее всего просто несколько элементарных операций почему-то обозвали одной. То есть "N шагов" - это N перемещений. Естественно, будет N срабатываний.

ну навесьте простой макрос на шейп из моего примера
Пока я ЛКМ не отпуская двигаю маркер я считаю что операция одна. Визио считает что эвентов столько сколько раз он перерисовывал шейп на экране, но выполняет он их почему то только после отпускания ЛКМ. И перетаскивание считается за одно действие перерисовки, почему то. Сетка в данном случае и определяет сколько раз шейп перерисовывается, потому что я не могу мышкой попасть из точки А в точку Б минуя промежуточные деления сетки.

Еще раз. Если не перерисовывать шейп Shape.CellsSRC(visSectionObject, visRowMisc, visNoLiveDynamics).FormulaU = "TRUE" , то эвент один всегда. Что доказывает мою правоту


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 13:12 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Цитата:
Но топик не об этом был вообще-то)))
Повторю вопрос: как передать два и более аргумента в RUNMACRO?

По официальной документации в RUNMACRO нельзя передать ни одного аргумента. Все остальное - попытка обмана Visio с непредсказуемым результатом.

Это печально. Ну ладно хоть не закрыли такую возможность.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 14:31 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 1571
Очков репутации: 100611

Добавить очки репутацииУменьшить очки репутации
Цитата:
Пока я ЛКМ не отпуская двигаю маркер я считаю что операция одна. Визио считает что эвентов столько сколько раз он перерисовывал шейп на экране

И как Вы думаете, кто при этом будет прав? :) Visio не переспоришь.
-------
Попробуем разобраться...
Visio скорее всего просто блокирует события, пока не закончит обработку очередного обращения. Это логично. Иначе ему приходилось бы учитывать, что пользователь своей программой может помешать ему в любой момент. А это на порядок усложняет программирование.
События при этом просто накапливаются в очереди, а потом выполняются.
Теперь что происходит при включенной перерисовке. Если у Вас включена привязка к сетке и динамическое отображение, то Visio обязан показать промежуточные положения. Чтобы показать, он должен пересчитать шейп на каждой промежуточной позиции. Раз шейп сдвинулся, значит позиция изменилась, значит есть событие. То что оно будет отложенным, это понятно. Но отложенным на время работы движка. К взаимодействию макросов между собой это не имеет отношения, а там ситуация может еще усложниться.
Так что я соглашусь. Можно включить такие настройки, что за одно перемещение шейпа получим несколько срабатываний EventXFMod.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса из ShapeSheet/Events с передачей аргументов
СообщениеДобавлено: 21 фев 2020, 15:02 
Не в сети
Бывалый

Зарегистрирован: 05 апр 2019, 12:47
Сообщений: 115
Использую Visio c: 2013
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Цитата:
Пока я ЛКМ не отпуская двигаю маркер я считаю что операция одна. Визио считает что эвентов столько сколько раз он перерисовывал шейп на экране

И как Вы думаете, кто при этом будет прав? :) Visio не переспоришь.
-------
Попробуем разобраться...
Visio скорее всего просто блокирует события, пока не закончит обработку очередного обращения. Это логично. Иначе ему приходилось бы учитывать, что пользователь своей программой может помешать ему в любой момент. А это на порядок усложняет программирование.
События при этом просто накапливаются в очереди, а потом выполняются.
Теперь что происходит при включенной перерисовке. Если у Вас включена привязка к сетке и динамическое отображение, то Visio обязан показать промежуточные положения. Чтобы показать, он должен пересчитать шейп на каждой промежуточной позиции. Раз шейп сдвинулся, значит позиция изменилась, значит есть событие. То что оно будет отложенным, это понятно. Но отложенным на время работы движка. К взаимодействию макросов между собой это не имеет отношения, а там ситуация может еще усложниться.
Так что я соглашусь. Можно включить такие настройки, что за одно перемещение шейпа получим несколько срабатываний EventXFMod.

Можно то можно, но использовать все предыдущие изменения все равно не получится. Это глупость или недочет.
Я пока оставил так же как было с динамичной прорисовкой, иначе выглядит это убого.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB