Различия между VBA и VB.Net

Автор Тема: Различия между VBA и VB.Net  (Прочитано 11708 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Различия между VBA и VB.Net
« : 02-06-2015, 08:36:33 »
В VBA я достаточно часто в сборках для Dim sDoc As AssemblyDocument использовал обращение  sDoc.ComponentDefinition...
В часности для проверки  If oDoc.ComponentDefinition.iAssemblyMember Is Nothing ThenНо в VB.Net так не получается!? Debug в VS показывает, что такое обращение нельзя реализовать.

Как это можно обойти?

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Различия между VBA и VB.Net
« Ответ #1 : 02-06-2015, 10:44:50 »
В VBA я достаточно часто в сборках для Dim sDoc As AssemblyDocument использовал обращение
filat, Так можно делать, но правильно будет:
Код - Visual Basic [Выбрать]
  1. If oDoc.ComponentDefinition.IsiAssemblyMember = False Then

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #2 : 03-06-2015, 11:37:55 »
C ComponentDefinition для сборок вообще какие-то странные вещи творятся: то он существует и код работает, то он не существует - и хоть ты тресни...
Четко заметил, что для VS в режиме Debug после загрузки компа код при первом запуске срабатывет нормально, а потом ComponentDefinition перестает вычеслятся до полной перезаргузки компа!

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #3 : 16-06-2015, 15:06:15 »
Получилось побороть пропадание ComponentDefinition с помощью дополнительной строки oDoc.Update - как ни странно помогло, но продвинуться далеко не получилось. Далее сохраняю документ через SaveAs с параметром True и обращаюсь через oDoc = m_inventorApplication.Documents.ItemByName(oName)  - документ oDoc есть, новый, все чин-чинарем, но вот только к параметрам ComponentDefinition уже нелья - происходит ошибка и Update в этом случае тоже уже не помогает...

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Различия между VBA и VB.Net
« Ответ #4 : 16-06-2015, 17:45:48 »
и обращаюсь через oDoc = m_inventorApplication.Documents.ItemByName(oName)  - документ oDoc есть, новый, все чин-чинарем, но вот только к параметрам ComponentDefinition уже нелья - происходит ошибка
Ты на эту строку поставь в отладке останов и посмотри объект oDoc, че там в ComponentDefinition находится...

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #5 : 17-06-2015, 08:40:23 »
Сваял такой участок кода ( речь идет об iAssembly и AddI VB.Net - похоже это имеет особое значение!):
Код - vb.net [Выбрать]
  1.                     Try
  2.                         If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  3.                         End If
  4.                     Catch ex As Exception
  5.                         MsgBox("5 ComponentDefinition не существует. Аварийное отключение программы!")
  6.                         Exit Sub
  7.                     End Try
  8.                     m_inventorApplication.SilentOperation = True ' Блокирует все запросы подтверждения
  9.                     Call oDoc.SaveAs(noName, True) ' Сохраняем элемент под новым именем
  10.                     Try
  11.                         If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  12.                         End If
  13.                     Catch ex As Exception
  14.                         MsgBox("6 ComponentDefinition не существует. Аварийное отключение программы!")
  15.                         Exit Sub
  16.                     End Try
  17.                     If m_inventorApplication.ActiveDocument.FullFileName = noName Then
  18.                         oDoc = m_inventorApplication.ActiveDocument
  19.                     Else
  20.                         Try
  21.                             oDoc = m_inventorApplication.Documents.ItemByName(noName) ' теряет ComponentDefinition
  22.                             Try
  23.                                 If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  24.                                 End If
  25.                             Catch ex1 As Exception
  26.                                 MsgBox("7 ComponentDefinition не существует. Аварийное отключение программы!")
  27.                                 Exit Sub
  28.                             End Try
  29.                         Catch ex As Exception
  30.                             oDoc = m_inventorApplication.Documents.Open(noName, False)
  31.                             Try
  32.                                 If oDoc.ComponentDefinition.IsiAssemblyMember = False Then
  33.                                 End If
  34.                             Catch ex1 As Exception
  35.                                 MsgBox("8 ComponentDefinition не существует. Аварийное отключение программы!")
  36.                                 Exit Sub
  37.                             End Try
  38.                         End Try
  39.                     End If

Код показывает, что перед сохранением параметрической сборки  ComponentDefinition у переменной существует. После SaveAs с параметром True  в переменной  oDoc остается прежний файл у которого продолжает существовать  ComponentDefinition. А вот при обращении к новому файлу  ItemByNameм (по сигналу ошибка срабатывает сообщение №7)  в перменной oDoc появляется новая параметрическая сборка у которой просто отсутствует пространство переменных  ComponentDefinition. Остановка кода в этом месте показала тоже самое - причину понять не могу - как такое может быть!? Видимо действительно нужно изобритать велосипед и пытаться организовать код через сохранение файла средствами винды...
P.S. Простые сборки проходят через этот код без проблем...

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #6 : 17-06-2015, 09:30:39 »
Похоже мой вопрос не правомочен...
Я удалил все имеющиеся в коде отработчики событий  и код стал работать нормально... Сейчас буду пытаться отследить какой именно участок кода убивает ComponentDefinition в iAssembly.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #7 : 17-06-2015, 12:02:05 »
Но все это очень не понятно: как можно убить пространство имен ComponentDefinition!?
И при этом, для данного файла, в этот же момент в VBA ComponentDefinition продолжает существовать и с ним можно нормально работать!
Интересно, а есть ли способ его восстановить без перезапуска программы?

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #8 : 18-06-2015, 09:22:28 »
Продолжая расследовать это темное дело, я заметил, что в событиях Открытия, Закрытия, Сохранения документа у переменной ByVal DocumentObject As Inventor._Document при открытии детали присутствует член ComponentDefinition, а вот у сборок в этой переменно, почему-то член ComponentDefinition отсутствует и нужно выполнять сначало передачу специальной соответствующей переменной, для нормального продолжения работы кода...
Прошу выполнить проверку следующих вариантов кода и высказать свои соображения:
Код - vb.net [Выбрать]
  1.         Private Sub m_ApplicationEvents_OnOpenDocument(ByVal DocumentObject As Inventor._Document, ByVal FullDocumentName As String, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_ApplicationEvents.OnOpenDocument
  2.             If BeforeOrAfter = EventTimingEnum.kAfter Then
  3.                 If DocumentObject.DocumentType = DocumentTypeEnum.kPartDocumentObject Then
  4.                     Try
  5.                         If DocumentObject.ComponentDefinition.iPartMember Is Nothing Then
  6.                         End If
  7.                     Catch ex As Exception
  8.                         MsgBox("Not found ComponentDefinition OnOpenDoc Part: " & DocumentObject.FullFileName)
  9.                     End Try
  10.                 ElseIf DocumentObject.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
  11.                     Try
  12.                         If DocumentObject.ComponentDefinition.IsiAssemblyMember = False Then
  13.                         End If
  14.                     Catch ex As Exception
  15.                         MsgBox("Not found ComponentDefinition OnOpenDoc Assembly: " & DocumentObject.FullFileName)
  16.                     End Try
  17.                 End If
  18.             End If
  19.         End Sub

Код - vb.net [Выбрать]
  1.         Private Sub m_ApplicationEvents_OnOpenDocument(ByVal DocumentObject As Inventor._Document, ByVal FullDocumentName As String, ByVal BeforeOrAfter As Inventor.EventTimingEnum, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_ApplicationEvents.OnOpenDocument
  2.             If BeforeOrAfter = EventTimingEnum.kAfter Then
  3.                 If DocumentObject.DocumentType = DocumentTypeEnum.kPartDocumentObject Then
  4.                     Try
  5.                         If DocumentObject.ComponentDefinition.iPartMember Is Nothing Then
  6.                         End If
  7.                     Catch ex As Exception
  8.                         MsgBox("Not found ComponentDefinition OnOpenDoc Part: " & DocumentObject.FullFileName)
  9.                     End Try
  10.                 ElseIf DocumentObject.DocumentType = DocumentTypeEnum.kAssemblyDocumentObject Then
  11.                     Dim sDoc As AssemblyDocument
  12.                     sDoc = DocumentObject
  13.                     Try
  14.                         If sDoc.ComponentDefinition.IsiAssemblyMember = False Then
  15.                         End If
  16.                     Catch ex As Exception
  17.                         MsgBox("Not found ComponentDefinition OnOpenDoc Assembly: " & DocumentObject.FullFileName)
  18.                     End Try
  19.                     sDoc = Nothing
  20.                 End If
  21.             End If
  22.         End Sub

Отмечено как Решение filat 18-06-2015, 13:58:07

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #9 : 18-06-2015, 13:58:05 »
Чтоб небыло подобных проблем, нужно соблюдать принципы наследования!

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Различия между VBA и VB.Net
« Ответ #10 : 19-06-2015, 06:55:55 »
Чтоб небыло подобных проблем, нужно соблюдать принципы наследования!
Филат хотел сказать, что нужно строже следить за приведением типов.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #11 : 24-06-2015, 10:23:31 »
Я вот сейчас отрабатываю ошибки проверки сужающих преобразований и осталось полторы сотни, которые я не пойму как можно устранить. Например:

И есть еще длиные формулировки, которые программа считает проблемными:
Код - vb.net [Выбрать]
  1. oPropSet = oOcc.ReferencedDocumentDescriptor.ReferencedDocument.PropertySets.Item("{32853F0F-3444-11D1-9E93-0060B03C1CA6}")
Их нужно дробить и вводить дополнительные промежуточные переменные?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Различия между VBA и VB.Net
« Ответ #12 : 24-06-2015, 10:56:25 »
проверки сужающих преобразований
Сдается мне, что ты m_Comp не привел к PartComponentDefinition
Либо:

CType(m_Comp, PartComponentDefinition)

либо
DirectCast(m_Comp, PartComponentDefinition)

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #13 : 24-06-2015, 11:27:25 »
Сдается мне, что ты m_Comp не привел к PartComponentDefinition
У меня именно так и было...
А оказывается, что ему нужно:
Код - vb.net [Выбрать]
  1. Dim m_Comp As SheetMetalComponentDefinition
  2. m_Comp = CType(PartDoc.ComponentDefinition, SheetMetalComponentDefinition)

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Различия между VBA и VB.Net
« Ответ #14 : 24-06-2015, 11:32:21 »
А что программе может не нравиться в строке:
Код - vb.net [Выбрать]
  1. oText  = CreateObject("WScript.Network").userName ' Получаем имя пользователя