Тема: Перебор пользовательских словарей выдаёт ошибку

Вот две процедурки, при запуске под отладкой обе проходят цикл первый раз успешно, а во второй - выдают ошибку 13 "Type mismatch" на первом операторе цикла (это важно, впрочем, можете сами запустить, увидите).

Sub search_my_dict()
  Dim d As AcadDictionary
  For Each d In ActiveDocument.Dictionaries
    If d.Name = "MY_DICT" Then
      'bla-bla-bla
      Exit For
    End If
  Next d
End Sub
Sub search_my_dict_2()
  Dim d As AcadDictionary
  Dim i As Integer
  For i = 0 To ActiveDocument.Dictionaries.Count - 1
    Set d = ActiveDocument.Dictionaries.Item(i)
    If d.Name = "MY_DICT" Then
      'bla-bla-bla
      Exit For
    End If
  Next i
End Sub

Ну при чём ТУТ несовпадение типов ? и главное, первый словарь обрабатывается без проблем... я дымлюсь...

Re: Перебор пользовательских словарей выдаёт ошибку

Что, никто со словарями не работал blush  ?

Re: Перебор пользовательских словарей выдаёт ошибку

Дело в том, что в коллекции из пяти словарей чертежа dwg по необъяснимым причинам только два словаря - ACAD_MLINESTYLE end ACAD_PLOTSTYLENAME имеют чистый тип IAcadDictionary. Можете проверить индексы i=2,i=4.
Простейший способ обойти проблему - использовать более общий тип Object:

Sub search_my_dict_2()
 [b] Dim d As Object[/b]
  Dim i As Integer
  For i = 0 To ActiveDocument.Dictionaries.Count - 1
    Set d = ActiveDocument.Dictionaries.Item(i)
   ' If d.Name = "MY_DICT" Then
      'bla-bla-bla
   '   Exit For
   ' End If
  Next i
  MsgBox i
End Sub

Re: Перебор пользовательских словарей выдаёт ошибку

Спасибо, причина ясна, но на свойство Name всё равно выскакивает ошибка "object does not support that property or method", вот в этом коде:

Sub search_my_dict_2()
  Dim d As [b]Object[/b]
  Dim i As Integer
  For i = 0 To ActiveDocument.Dictionaries.Count - 1
    Set d = ActiveDocument.Dictionaries.Item(i)
    If d.Name = "MY_DICT" Then '<<<< здесь >>>>
      MsgBox "Num is " & i
      Exit For
    End If
  Next i
  MsgBox i
End Sub

Re: Перебор пользовательских словарей выдаёт ошибку

А как узнать тип "неправильных" словарей ? Через Лисп ?

Re: Перебор пользовательских словарей выдаёт ошибку

Вот список словарей которые обязательно содержит любой чертеж DWG:
Named Object Dictionary
1.ACAD_GROUP   type -     IAcadGroups
2.ACAD_LAYOUT               IAcadLayouts
3.ACAD_MLINESTYLE         IAcadDictionary
4.ACAD_PLOTSETTINGS    IAcadPlotConfigurations
5.ACAD_PLOTSTYLENANE  IAcadDictionary
Получил я его из двух источников:
-открыл в отладчике объект ActiveDocument.Dictionaries
-просмотрел базу данных чертежа в Database Viewer
Насколько я понимаю, с именами словарей ситуация проблематичная, т.к. Словари 1,2 и 4 имени в VBA не имеют вообще. И, кажется, в ЛИСПе  тоже... зто надо проверить.

Re: Перебор пользовательских словарей выдаёт ошибку

-открыл в отладчике объект ActiveDocument.Dictionaries
-просмотрел базу данных чертежа в Database Viewer

Пожалуйста, поподробнее, очень интересно, что это за отладчик и вьювер.

Re: Перебор пользовательских словарей выдаёт ошибку

Вопрос по отладчику не очень понятен, неужели вы им не пользуетесь?!... В данном случае я просматривал  ActiveDocument.Dictionaries в окне Quick Watch.
Database Viewer удобная утилита для просмотра БД чертежа, ее применение неоднократно упоминалось на форуме, например в этой ветке:
https://www.caduser.ru/forum/topic5690.html
По поводу имен словарей - к конкретному словарю в коллекции
Dictionaries  можно обратиться по имени, например:

Const ACAD_LAYOUT = "ACAD_LAYOUT"
  Set d = ActiveDocument.Dictionaries(ACAD_LAYOUT)

Возможно, вам это поможет.
Удачи!

Re: Перебор пользовательских словарей выдаёт ошибку

> Leonid
Спасибо за Quick Watch, я, к своему стыду, им не пользовался раньше. И за Database Viewer тоже спасибо, хотя я ещё его не посмотрел.