Yurich » 05.08.2003 (Вт) 23:54
Не совсем так! Декларация On Error внутри процедуры то же действует только внутри ее, никак не далее! Тут вопрос, собственно, не столько в том, чем отличаются On Error от On Local Error. Существуют еще какие-нибудь средства, для отлова этих самых ошибок? Например, есть процедура удаления фрейма из сцены. Процедура вызывается циклично. Первый вызов проходит благополучно, второй приводит к зависанию, т.к. фрейм в сцене уже не существует (потратил около двух часов, пока допер в чем дело). Не хочется вводить дополнительные поля данных для контроля наличия фреймов, да и не всегда это помогает.
Другой завалящий пример:
' деталь
Public Type Detail
DeleteFromScene As Boolean ' фрейм удален?
Frame As Direct3DRMFrame3
SP As D3DVECTOR ' исходная позиция детали
MB As D3DRMBOX ' минимумы и максимумы в боксе детали
End Type
Public Detal(1 To 25) As Detail
' Взять деталь в руки (удалить фрейм из сцены)
Public Sub TakeDetal(Number As Integer)
If MyHand.TakeDetail Then Exit Sub ' если в руках уже есть деталь, выход из SUB
With Detal(Number)
' просто убираем из сцены
If Not .DeleteFromScene Then
.DeleteFromScene = True
Scene.DeleteVisual .Frame
End If
End With
End Sub
Этот участок кода выдает номер объекта, на котрый направлен взор (работает благополучно, но выдает номер детали и после удаления фрейма)
For i = 1 To 25
With Detal(i)
If Vx > (.SP.x + .MB.Min.x) And Vx < (.SP.x + .MB.Max.x) And _
Vz > (.SP.z + .MB.Min.z) And Vz < (.SP.z + .MB.Max.z) And _
Vy > (.SP.y + .MB.Min.y) And Vy < (.SP.y + .MB.Max.y) Then
DetalView = i '
Exit For
Else
DetalView = 0
End If
End With
Next i
А этот благополучно виснет после процедуры удаления фрейма
For i = 1 To 25
With Detal(i)
If (Not .DeleteFromScene) And _
Vx > (.SP.x + .MB.Min.x) And Vx < (.SP.x + .MB.Max.x) And _
Vz > (.SP.z + .MB.Min.z) And Vz < (.SP.z + .MB.Max.z) And _
Vy > (.SP.y + .MB.Min.y) And Vy < (.SP.y + .MB.Max.y) Then
DetalView = i
Exit For
Else
DetalView = 0
End If
End With
Next i
Во втором случае добавлена проверка того самого поля (тип Bool).
Все остальные поля заполнены предварительно и для обеих случаев одинаковы.
Где кроется глюк, ума не приложу!