Как узнать окончание Refresh?

0 голосов
спросил 13 Окт, 08 от UVsevolod (2,040 баллов) в категории Программные продукты Esri
    Доброе время суток!
Судя по всему метод ActiveView.Refresh() выполняется асинхронно(по крайней мере тогда, когда в карте участвуют слои с гис сервера). А как узнать, что этот метод уже полностью выполнился?

4 Ответы

0 голосов
ответил 30 Окт, 08 от sschainik (4,900 баллов)
У MapControl есть событие OnViewRefreshed

Если же надо из vba точно не помню, но попробуй следующее:
Private mScreenDisplay pAV As ScreenDisplay

Private Sub mScreenDisplay_DisplayFinished(ByVal Display As esriDisplay.IDisplay)

End Sub

Private Sub Init()
     Dim pDoc As IMxDocument
     Dim pAV As IActiveView
     Set pDoc = ThisDocument
     Set pAV = pDoc.ActiveView
     Set mScreenDisplay = pAV.ScreenDisplay
End Sub
0 голосов
ответил 04 Ноя, 08 от Mitrich (13,680 баллов)
В продолжении темы. Попытался отследить момент завершения отрисовки лейблов, чтобы потом запустить другую процедуру.
Код вроде как работает, но странное дело. Событие DisplayFinished срабатывает 6 !!! раз, при этом флаг bFinished становится в True с первого раза , а цикл c  Do While bFinished  = false продолжает крутиться до самого конца, не обращая внимания на переменную.
Где засада? Может как-то по другому написать надо?

Вывод из окна Debug выглядин так:
------------ start-------------
finished True
finished True
finished True
finished True
finished True
finished True
doEvents
------------ stop-------------



Dim pMap As IMap
Dim pMxDoc As IMxDocument
Dim pAV As IActiveView
Private WithEvents pDisplayEvents As ScreenDisplay
Dim bFinished As Boolean

Public Sub foo()
Set pMxDoc = ThisDocument
Set pMap = pMxDoc.FocusMap
Dim pAV As IActiveView
Set pAV = pMap



Set pDisplayEvents = Nothing


Dim pGFLayer As IGeoFeatureLayer
Set pGFLayer = pMap.Layer(0)

bFinished = False
pGFLayer.Visible = True
pGFLayer.DisplayAnnotation = True

'start listening
Set pDisplayEvents = pAV.ScreenDisplay
pAV.Refresh


'start listening
'Set pDisplayEvents = pAV.ScreenDisplay

Do While bFinished = False
'waiting for labeling
DoEvents
Debug.Print "doEvents"
Loop

'stop listening
Set pDisplayEvents = Nothing


'Here I need to call sub ConvertLabeles, but only after labeling finished
Call ConvertLabeles


End Sub
Private Sub ConvertLabeles()
MsgBox "Start Convert"
End Sub

Private Sub pDisplayEvents_DisplayFinished(ByVal Display As IDisplay)
'this event occures more then 1 time
bFinished = True
Debug.Print "finished " & bFinished


End Sub

Private Sub UIButtonControl1_Click()
Debug.Print "------------ start-------------"
Call foo
Debug.Print "------------ stop-------------"
End Sub

0 голосов
ответил 05 Ноя, 08 от UVsevolod (2,040 баллов)
Сейчас я делаю с помощью отлавливания последней фазы прорисовки в OnAfterDraw, но может это и не совсем верно, т.к. фазы от версии к версии могут , наверное, меняться.Например их станет больше. Может приведенный _DisplayFinished  тоже выполниться для каждой фазы, поэтому и 6 раз.
0 голосов
ответил 05 Ноя, 08 от Mitrich (13,680 баллов)
возможно и так, но я в полной прострации, почему после первого события DisplayFinished  программа не продвигается дальше к циклу Do...Loop? а как-бы продолжает рекурсивно внутри себя вызываться. Результат получается правильный - вторая процедура вызывается после отрисовки всех лейблов. НО! Уверенности нет никакой.
Если убрать цикл и отслеживание события, то переход ко второй процедуре происходит незамедлительно после Refresh (а он то и не проработал полностью)
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...