- Сообщения
- 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 во время работы макроса.