| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Нарушение блокировки.

VBA. Нарушение блокировки.

Ответ
Поиск в этой теме
Непрочитано 16.09.2015, 07:26 #1
VBA. Нарушение блокировки.
art_rrc
 
Минск
Регистрация: 28.01.2013
Сообщений: 379

Доброго времени суток. Столкнулся со следующей проблемой. Имеется небольшой макрос, который манипулирует отрезками. И все вроде бы хорошо и корректно работает, но где-то при каждом 10м запуске он выдает ошибку - "Нарушение блокировки", причем если нажать debug и просто продолжить выполнение программы, то все корректно завершается. Ругается на строчки типа "lineObj.startPoint = intPoints", очень редко на "BlockZ.Delete". В общем по ходу программы и тот и другой объект многократно перезаписывается и иногда удаляется. Помогает даже примерно вот такой костыль:
Код:
[Выделить все]
On Error Resume Next
lineObj.startPoint = intPoints
If Err Then
Err.Clear
lineObj.startPoint = intPoints
End If
Но мне это кажется уж как-то слишком безграмотным.
А еще реже, выдает ошибку "Catastrophic failure", тут я вообще в замешательстве, но мне кажется, что она появлялась только после того когда я с Err.clear баловался.
Поиск по форумам и ресурсам типа https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx результатов не дал, так что может кто-то в личной практике сталкивался? И знает, что и зачем блокирует автокад?

Миниатюры
Нажмите на изображение для увеличения
Название: Нарушение блокировки.png
Просмотров: 32
Размер:	24.4 Кб
ID:	156998  Нажмите на изображение для увеличения
Название: Catastrophic failure.png
Просмотров: 25
Размер:	27.1 Кб
ID:	156999  

Просмотров: 4890
 
Непрочитано 16.09.2015, 09:08
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


А код показать полностью?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.09.2015, 15:48
#3
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А код показать полностью?
В силу различных обстоятельств, опубликовать его тут не могу. Если есть необходимость, могу выслать например по почте или в личные сообщения. Чуть позже постараюсь на базе текущего кода воспроизвести данную ошибку и тогда опубликую.
art_rrc вне форума  
 
Непрочитано 16.09.2015, 16:19
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Это надо не мне.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.09.2015, 23:43
#5
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


Код:
[Выделить все]
Sub МояПрограмма()
'Dim объявляем всякую фигню
On Error GoTo КосякСотрезком
    lineObj.startPoint = intPoints
'код 
'код 
'код
Exit Sub
КосякСотрезком:
    lineObj.startPoint = intPoints
    Resume Next
End Sub
или в обработчике проверку
Код:
[Выделить все]
Exit Sub
КосякСотрезком:
If Err.Number = Номер Ошибки Then
   чето делаем
End If
либо нумеруем строки кода и в обработчике используем Erl, и в зависимости от номера ошибки, номера строки где это произошло, ее обрабатываем.
Обработчик ставить когда программа готова и настроена, иначе сложно отлаживать код (обработчики ставить либо везде либо нигде(( ((
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 16.09.2015, 23:53
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Извини, но ты ничего не показал. insPoints где и как вычисляется / назначается - это для начала.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.09.2015, 16:58
#7
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Если есть необходимость, могу выслать например по почте или в личные сообщения
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это надо не мне.
Алексей, разумеется, надо это мне. Просто не хочется быть навязчивым, поэтому так и написал. Если же у тебя все таки есть пара минут, которые ты готов на меня потратить, сбрось пожалуйста в ЛС адрес эл. почты - пришлю все. Также разумеется готов отблагодарить любыми средствами..)
Цитата:
Сообщение от doctorraz Посмотреть сообщение
Обработчик ставить когда программа готова и настроена
На мой взгляд, ваш вариант не многим лучше того, что я описал в посте #1, просто вид сбоку. И как я уже писал, этот вариант считаю не подходящим. Обработчики ошибок нужны когда в них есть необходимость по логике программы, в моем же случае, программа может десятки раз работать нормально, а потом выдать вышеописанные ошибки, тут мне кажется проблема более глобальная... как будто остается какое-то "эхо" от предыдущих выполнений программы.
ps Извиняюсь за поздние ответы, очень не хватает времени. Чуть позже выложу тестовый вариант кода, пока пытаюсь хотя бы поймать из-за какого фрагмента вылазит ошибка.
art_rrc вне форума  
 
Непрочитано 17.09.2015, 18:58
#8
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


конечно не подходит
но для предоставленной строчки кода самое то:-)
как задан вопрос, так и получен ответ.
тут телепатов нет.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 17.09.2015, 21:53
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Сильно подозреваю, что надо просто прекращать удалять и потом восстанавливать объекты.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.09.2015, 14:54
#10
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Сильно подозреваю, что надо просто прекращать удалять и потом восстанавливать объекты.
Да, так и есть. Отказ от "Ctrl+z" в модели при отладке программы сводит вероятность возникновения ошибки практически к нулю.
Еще мне кажется, что я что-то некорректно делаю при использовании GoTo (Наверное не очень корректно, например, "выпрыгивать" из оператора With и т.п.):
Код:
[Выделить все]
Sub zxc123()
Set SelSet1 = ThisDrawing.SelectionSets.Add("zxc123")
START:
SelSet1.SelectOnScreen 
If SelSet1.Count = 0 Then GoTo DavayDoSvidaniya
On Error Resume Next
nPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Точка:")
If Err Then
    Err.Clear
    GoTo DavayDoSvidaniya
End If
On Error GoTo 0
With ThisDrawing
<ТЕКСТ ПРОГРАММЫ>
GoTo START
DavayDoSvidaniya:
SelSet1.Delete
End With
End Sub
Код:
[Выделить все]
'Попытка воспроизвести ошибку
Sub zxc123()
Dim SelSet1 As AcadSelectionSet
Dim nPnt  As Variant
Dim lineObj As AcadLine
Set SelSet1 = ThisDrawing.SelectionSets.Add("zxc123")
START:
SelSet1.SelectOnScreen 'FilterType, FilterData
If SelSet1.Count = 0 Then GoTo DavayDoSvidaniya
On Error Resume Next
nPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Óêàæèòå öåíòð:")
If Err Then
    Err.Clear
    GoTo DavayDoSvidaniya
End If
On Error GoTo 0
With ThisDrawing
For Each Entry In SelSet1
    If Entry.ObjectName = "AcDbLine" Then
    Set lineObj = Entry
        lineObj.startPoint = nPnt

    End If
Next
GoTo START
DavayDoSvidaniya:
SelSet1.Delete
End With
End Sub

Подводя итог: при отказе от "Ctrl+z" при отладке и от "GoTo Start" полностью избавился от возникновения ошибок. Всем спасибо, кто откликнулся!
art_rrc вне форума  
 
Непрочитано 18.09.2015, 16:10
#11
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


Offtop: использование GoTo кроме как для обработки ошибок, говорит о плохо продуманном алгоритме программы.
Кроме этого код становится практически неконтролируемым и неуправляемым. (несколько переходов по GoTo из циклов и получаем обезьяну с гранатой.
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 18.09.2015, 16:12
#12
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


Че-то я не до конца понял настолько странных конструкций... Может, так будет попроще:
Код:
[Выделить все]
Option Explicit

Public Sub test()
Dim sSSName As String
Dim SelSet As AcadSelectionSet
Dim pt As Variant
Dim ft(0) As Integer
Dim fd(0) As Variant
Dim entity As AcadEntity
Dim objLine As AcadLine

  sSSName = "qwerty123"
On Error GoTo lErrorGetPoint

  pt = ThisDrawing.Utility.GetPoint(, vbCr & "Укажите точку <Отмена> : ")
  On Error GoTo 0

  On Error Resume Next
  ThisDrawing.SelectionSets(sSSName).Delete
  ft(0) = 0: fd(0) = "LINE"
  Set SelSet = ThisDrawing.SelectionSets.Add(sSSName)
  SelSet.SelectOnScreen ft, fd
  For Each entity In SelSet
    Set objLine = entity
    objLine.StartPoint = pt
  Next

  ThisDrawing.Regen acActiveViewport
  
  Exit Sub
lErrorGetPoint:
  ThisDrawing.Utility.Prompt Chr(10) & Chr(13) & "Ошибка указания точки"
  Exit Sub

End Sub
----- добавлено через ~1 мин. -----
По хорошему надо было бы еще добавить обработку заблокированных слоев
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.09.2015, 19:57
#13
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от doctorraz Посмотреть сообщение
использование GoTo кроме как для обработки ошибок, говорит о плохо продуманном алгоритме программы
Смотрите, задача была в следующем (не из практических соображений, а для красоты демонстрации)... Нужно выполнить макрос неизвестное за ранее количество раз. Мне в голову пришел такой алгоритм.
Код:
[Выделить все]
Sub artSub()
START:
   <Текст программы с возможностью прервать ее выполнение>
goto START
endsub
Разве это выполнимо без GoTo? Другой вопрос, что у меня в виде "возможностью прервать ее выполнение" используется GoTo на метку перед EndSub, по всей видимости грамотнее использовать Exit Sub.
След. пост Алексея, кстати, наглядно демонстрирует вариативность подходов при решении задачи, между которыми я пока разницы не вижу. Но очевидно, что один из вариантов предпочтительнее (и что-то мне подсказывает, что это не мой ) . Итак, теперь подробнее:
У меня:
Код:
[Выделить все]
On Error Resume Next
nPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Введите точку:")
If Err Then
    Err.Clear
    GoTo DD
End If
<Текст программы>
DD:
End Sub
У Алексея:
Код:
[Выделить все]
On Error GoTo lErrorGetPoint
pt = ThisDrawing.Utility.GetPoint(, vbCr & "Укажите точку <Отмена> : ")
On Error GoTo 0
<Текст программы>
lErrorGetPoint:
Exit Sub
End Sub
Я считаю, что записи идентичны. При возникновении ошибки, идем в конец программы и завершаем ее. Но если есть разница, поясните пожалуйста какая? (Неужели правильный ответ такой: "Никакой, но лучше использовать Exit Sub! Прими это как аксиому." )
art_rrc вне форума  
 
Непрочитано 18.09.2015, 20:49
#14
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от art_rrc Посмотреть сообщение
Разве это выполнимо без GoTo?
можно
Код:
[Выделить все]
Do While покаТак
'делаем, чтобы было неТак
Loop
----- добавлено через ~7 мин. -----
Цитата:
Сообщение от art_rrc Посмотреть сообщение
Я считаю, что записи идентичны. При возникновении ошибки, идем в конец программы и завершаем ее. Но если есть разница, поясните пожалуйста какая? (Неужели правильный ответ такой: "Никакой, но лучше использовать Exit Sub! Прими это как аксиому." )
кроме Exit Sub,
может быть
Resume,
Resume НаМетку,
Resume Next
msgbox "Учи матчасть"

и прочие обработчики..... и они все будут выполнены если не произошло перехода на метку!!!! Но не факт, что они завершат процедуру...
спорить не надо, надо учить матчасть
PS перед меткой обязателен Exit Sub (иначе попадем неизвестно куда)
__________________
Мастерская СПДС

Последний раз редактировалось doctorraz, 18.09.2015 в 20:59.
doctorraz вне форума  
 
Автор темы   Непрочитано 18.09.2015, 21:16
#15
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от doctorraz Посмотреть сообщение
спорить не надо, надо учить матчасть
Перечитал тему. Спора не заметил... И не хотел никого задеть
По поводу матчасти. Вопрос ведь был не в том, как избавиться от ошибок, а попытаться понять из-за чего вылазят конкретные экземпляры.
Вы правы, телепатов тут нет. Ну так пришлите контакт, вышлю код, протестируете у себя.
Цитата:
Сообщение от art_rrc Посмотреть сообщение
И знает, что и зачем блокирует автокад?
art_rrc вне форума  
 
Непрочитано 18.09.2015, 21:59
#16
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


Цитата:
Сообщение от art_rrc Посмотреть сообщение
Неужели правильный ответ такой: "Никакой, но лучше использовать Exit Sub! Прими это как аксиому."
это не спор..
Цитата:
Сообщение от art_rrc Посмотреть сообщение
По поводу матчасти. Вопрос ведь был не в том, как избавиться от ошибок, а попытаться понять из-за чего вылазят конкретные экземпляры.
Вы правы, телепатов тут нет. Ну так пришлите контакт, вышлю код, протестируете у себя.
бесполезно, в автокад я пока не очень и в VB то же только делаю первые шаги...
пытаюсь помочь в меру сил, извините если порой категоричен
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 18.09.2015, 22:51
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848


On Error Goto 0 - это фактически очистка ошибки и продолжение работы в нормальном режиме, насколько я помню. Просто без прямого GoTo.
Выйти из процедуры / функции можно в любом месте, но я это делаю перед каждой меткой обработки ошибок: исхожу из принципа "если ошибка уже здесь, то дальше рыпаться смысла нет никакого". Возможно, ошибаюсь.
P.S. Учитывая пертурбации VBA, я бы на него забил и писал либо на VB.NET, либо на C#. Намного интереснее )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Нарушение блокировки.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лисп для блокировки видовых окон в пространстве листа. betonolom LISP 11 14.08.2018 12:05
Ответственность за нарушение инсоляции существующего жилого дома. Он же Архитектура 7 16.04.2015 12:15
Нарушения в строительстве, какое нарушение могут выписать? Senya88 Основания и фундаменты 4 13.11.2014 13:35
Обращение в семейству групп меню и последующий вызов диалога _CUI приводят к ошибке. Makswell Программирование 8 06.08.2010 08:08