[CDR X5-X8] Макрос выдает ошибку при дублировании объекта на листе

  • Автор темы Автор темы Erchizo
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Erchizo

Участник
Топикстартер
Сообщения
58
Реакции
1
Добрый день!
Снова к вам за помощью.
Суть макроса в том что он собирает файлы из нескольких папок файлы (обработчик подсказан splxqf и _МВК_) и помещает их в один файл. Изображение на листе дублируется, и представляет собой 3 вида: с битмапом, обрисованный и инверт (рисунок 1).
В исходных файлах присутствкет битмап, который надо обрисовать, и сама обрисовка.
Вся ерунда в том, что ошибка всплывает когда в импортируемом файле всего 2 объекта - битмап и векторный объект (рис 1 - 150) ! Если число объектов больше 2-х (рис 1 - 149) все проходит замечательно.
Код:
...
    ActiveLayer.Import sFile, cdrCDR
   
    ActiveSelection.UngroupAll
    ActiveSelection.Group
    Set sht = ActiveShape
        sht.GetSize xs, ys
   
        For Each item In sht.Shapes
          If item.Type = cdrBitmapShape Then
            item.ConvertToBitmapEx cdrRGBColorImage, True, True, 200, 1
            bitm = True
          ElseIf item.Type = cdrEllipseShape Then
            elips = True
          End If
        Next item
   
    If bitm = True Then
      sht.SetPositionEx 3, x, y + ys * 2 + 3
      Set sht = sht.Duplicate(0, -ys - 3)
        For Each item In sht.Shapes
          If item.Type = cdrBitmapShape Then
            item.Delete
          End If
        Next item
    Else
      sht.SetPositionEx 3, x, y + ys
    End If

      Set sht = sht.Duplicate(0, -ys - 19)   <- Вот здесь ругается и вываливается
...
Ни клонирование, ни копирование и вставка - не помогают вылезает одна и та же ошибка (рисунок 2). 2 дня уже мучаюсь ((((((
 

Вложения

  • рисунок 1.jpg
    рисунок 1.jpg
    168.1 КБ · Просм.: 885
  • рисунок 2.jpg
    рисунок 2.jpg
    54.2 КБ · Просм.: 520
В принципе, вполне предсказуемо - вы перебираете элементы коллекции, одновременно ее модифицируя. Даже не вдаваясь в подробности, Кэп подсказывает, что после первого же удаленного элемента все ссылки в ней перестают быть актуальными.
 
Хорошо (в смысле плохо). Подскажите как мне быть в это ситуации. Я так понимаю надо весь этот алгоритм прибить к чертям.
Как Вы считаете если после импорта - вырезать объект -> вставить -> переместить -> обработать. И всю эту процедуру повторить еще 2 раза (меняя место расположения), ошибка не повториться ?
 
Ну я, честно говоря, особо не вникал в постановку задачи, но IMHO, если хотите что-то удалить, то удаляйте это не по одному элементу, перебирая коллекцию, а сразу все (не)нужные шейпы оптом
 
Ну а в чем вопрос? поставить отладчик на item.Delete и ловить что будет показывать sht.
Потом много думать.
 
Ну а в чем вопрос? поставить отладчик на item.Delete и ловить что будет показывать sht.
Потом много думать.
Зачем ловить? Там и без отладчика все понятно - объект убирается, коллекция рассыпается, следующий дубль применяется к невалидному элементу
 
Вроде все правильно вы говорите, но есть одно но. На рисунке 1 первое размножение из папки 149 прошло удачно, а вот из папки 150 - нет. Если "удалить" эту папку из общего списка, то все дальше идет как надо. Затык именно в этом файле. Отличие этого файла от всех остальных файлов - 2 объекта, во все остальных более двух. ((((
 
Если "удалить" эту папку из общего списка, то все дальше идет как надо.
Ну там идеологически сделано неправильно, значит будет работать непредсказуемо, вплоть до того, что на одном и том же файле иногда затыкаться а иногда нормально проходить. Делать изначально по уму надо. В конце концов, помечайте как то объекты на удаление а потом отдельным циклом их удаляйте. Но не в том же цикле где дублируете
 
Ок, спасибо, буду думать.
 
Статус
Закрыто для дальнейших ответов.