[CDR X5-X8] При оптимизации проблемы с обновлением экрана

SeYV1970

Участник
Топикстартер
Сообщения
13
Реакции
0
Есть макрос

Sub s()
ActiveDocument.SaveSettings
ActiveDocument.PreserveSelection = False

Application.Optimization = True '<- !!!
...
UseForm.show
...
End Sub

Из формы при изменении значения полей вызывается

Private sub Shape_show()
...
Application.Optimization = False ' Если от сюда начать отладку - все работает как надо
ActiveWindow.Refresh

If x1 + x2 + y1 + y2 = 0 Then
ActiveWindow.ActiveView.ToFitPage
Else
ActiveWindow.ActiveView.ToFitArea x1, y1, x2, y2
End If

ActiveWindow.Refresh ' Это от отчаяния пробовал ставить везде :)

Application.Optimization = True ' Если убрать эту строку, то ActiveWindow.ActiveView.ToFitArea будет работать
End sub

Проблема следующая
Если в конце процедуры оставить Application.Optimization = True
То окно не обновляется , если убрать всё работает
Но потом соответственно работа макроса замедляется

В режиме отладки все работает как надо
 
Не пойму суть проблемы.
Optimization=true - исключительно для оптимизации скорости работы макроса за счет отрисовки
 
  • Спасибо
Реакции: zollinger
Вот я тоже ему ответ написал, потом подумал, что не совсем понимаю, что не устраивает, и стёр
 
Во время выполнения макроса иногда надо показывать промежуточный результат
и спрашивать пользователя, что делать дальше
Проблема в том , что результат не отображается
Даже в таком случае

Sub()
ActiveDocument.SaveSettings
ActiveDocument.PreserveSelection = False

Application.Optimization = True
...

Application.Optimization = False ' Если от сюда начать отладку - все работает как надо
ActiveWindow.Refresh

ActiveWindow.ActiveView.ToFitArea x1, y1, x2, y2 ' Не покажет изменения
ActiveWindow.Refresh ' Это от отчаяния пробовал ставить везде :)

Application.Optimization = True ' Если убрать эту строку , то ActiveWindow.ActiveView.ToFitArea будет

UseForm.show
...
End Sub

такое впечатление, что ActiveView.ToFitArea отрабатывает только после открытия формы
потому что если
Application.Optimization = True убрать или поставить после UseForm.show
то всё работает как надо (идет обновление экрана)

Но даже если этого не делать. а посмотреть в режиме отладки, то тоже всё работает как надо (идет обновление экрана)
 
А если, просто в порядке бреда, в углу рисовать маааленький кружок и тут же его удалять? Вот после Application.Optimization = False
 
Отдельным постом т.к. тот уже не дает редактировать

Это упрощенно, на самом деле есть процедура. которая по идее должна
запомнить Optimization
показать пользователю объект
восстановить Optimization
Но если Optimization изначально был True, то объект не показать
Хотя в режиме отладки работает
 
я пользуюсь вот таким набором для активации окна


Код:
ActiveWindow.Activate
Application.Refresh
DoEvents
 
о время выполнения макроса иногда надо показывать промежуточный результат
и спрашивать пользователя, что делать дальше
... а иногда - это как? По какому-то условию?
Попробуйте в коде формы задать нечто подобное - с промежуточным старт/стопом оптимизации

Код:
Dim Response
EventsEnabled = False
Optimization = True
.
'что-то происходит, но ничего не отображается
...
If (какое-то условие и не надо спрашивать) Then
GOTO net:
Else
   Optimization = False
   EventsEnabled = True
   Application.Refresh
   ActiveWindow.Refresh
   Response = MsgBox (" Что дальше, любезнейший?", vbYesNoCancel)
   If Response = vbYes Then
       EventsEnabled = False
       Optimization = True
'       обработка кнопка YES
   Else If Response = vbNo Then
       EventsEnabled = False
       Optimization = True
'       обработка кнопка NO
   Else
       EventsEnabled = False
       Optimization = True
'      обработка кнопка CANCEL
  End If
End If
net:
.

Optimization = False
EventsEnabled = True
Application.Refresh
ActiveWindow.Refresh
 
такое впечатление, что ActiveView.ToFitArea отрабатывает только после открытия формы
Открытие формы подразумевает внутреннюю обработку событий. В вашем случае попробуйте написать отдельную процедуру, вида
Sub FitArea(x1#, y1#, x2#, y2#)
Application.Optimization = False
ActiveWindow.ActiveView.ToFitArea x1, y1, x2, y2
ActiveWindow.Refresh
DoEvents
Application.Optimization = True
End Sub
 
  • Спасибо
Реакции: SeYV1970
Спасибо
В принципе практически строка в строчку было
DoEvents - добавил - заработало

PS: Пойду увлекаться чтением