Оптимизация работы макросов

  • Автор темы Автор темы wOxxOm
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

wOxxOm

Участник
Топикстартер
Сообщения
798
Реакции
3
Чтобы макросы работали моментально -

перед началом работы вставляем
Код:
dim cs as object ' это для принудительной перерисовки в конце работы
   ActiveDocument.BeginCommandGroup "Описание действия для Undo"
   Optimization = True
   EventsEnabled = False
   ActiveDocument.SaveSettings
   ActiveDocument.PreserveSelection = False

после завершения -
Код:
   ActiveDocument.PreserveSelection = true
   ActiveDocument.RestoreSettings
   EventsEnabled = True
   Optimization = False
   Application.Refresh
   Set cs = CorelDRAW.CorelScript   ' это - принудительная перерисовка экрана
   cs.RedrawScreen                          ' это - принудительная перерисовка экрана
   ActiveWindow.Refresh ' можно взамен использовать это (если это будет обновлять статус строку в CorelDraw, что у меня происходит не всегда)
   ActiveDocument.EndCommandGroup

Я эти блоки вынес в отдельные процедуры и у меня ВСЕ макросы даже с тысячей объектов работают за секунду или меньше

Обратите внимание:
  • Строка ActiveDocument.PreserveSelection = False значительно ускоряет обработку большого количества объектов, т.к. она не сохраняет оригинальную селекцию, НО если нужно более одного цикла обработки объектов или нужно в конце работы восстановить пользовательское выделение объектов, то надо вручную его запомнить: dim origSel as new shaperange: set origSel=activeSelectionRange ...ДЕЙСТВИЯ МАКРОСА.....origSel.CreateSelection
  • Не используйте beginCommandGroup/endCommandGroup во время написания макроса, только когда он у уже отлажен. Если происходит неучтенная макросом ошибка, неустранимая на лету в отладчике, то сломается механизм отмены в CorelDraw и придется сохранять документ под новым именем и перезапускать CorelDraw.
  • Тот же подход должен быть и к EventsEnabled = False, она отключает обработку событий (в частности тех, по которым работают другие макросы)
  • Тот же подход должен быть и к Optimization = True, который отключает прорисовку экрана в CorelDraw во время работы макроса.
Итак, вышеуказанный код оптимизации вставляется в макрос только тогда когда все проверено, отлажено. Не забываем, что программные выходы из макроса по exit sub недопустимы без отключающего оптимизацию завершаещего кода (второй блок вверху этого сообщения)
 
  • Спасибо
Реакции: mnemonix
Ответ: Оптимизация работы макросов

При работе с конструкцией BeginCommandGroup/EndCommandGroup не забудьте встроить обработку ошибок, иначе можно попасть на сбой Undo, когда будет отменяться куча произведенный действий. Примеры и подробности см. в Help'е


Не по теме:
Вынес оптимизацию в отдельную тему во избежание каши
 
Статус
Закрыто для дальнейших ответов.