Тема: ПОМОГИТЕ! Почему происходит зацикливание?

Почему данный цикл иногда зацикливается?
Dim Y As Integer
Dim SSName As String
Do Until ThisDrawing.SelectionSets.Count = 0
    SSName=ThisDrawing.SelectionSets.Item(ThisDrawing.SelectionSets.Count - 1).Name
   If InStr(1, SSName, "MySSet", 1) = 1 Then
   Y = CInt(Right$(SSName, Len(SSName) - 6))
                 ThisDrawing.SelectionSets.Item(ThisDrawing.SelectionSets.Count - 1).Delete
   End If
Loop
Можно написать аналогичное по-другому?

Re: ПОМОГИТЕ! Почему происходит зацикливание?

А что нужно-то? Убить все наборы, имя которых начинается на "MySSet", и выдать значение "прицепленного" к имени набора числа?
Может, так пойдет:

Dim objSelSet As AcadSelectionSet
Dim objSelCol As AcadSelectionSets
Set objSelCol = ThisDrawing.SelectionSets
For Each objSelSet In objSelCol
  If Left(objSelSet.Name,6) = "MySSet" Then
    Y = Val(Replace(objSelSet.Name, "MySSet",""))
    objSelSet.Delete
  End If
Next

Если таких наборов много, то Y будет соответствовать последенему найденному.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

Объясните еще пожалуйста что проверяет этот if
If InStr(1, SSName, "MySSet", 1) = 1 Then

Re: ПОМОГИТЕ! Почему происходит зацикливание?

:)) Это по-моему не из моего кода, а из вашего... Я, собственно, этой функцией InStr раньше не пользовался, судя по справке - она дает "определение положения первого возникновения одной последовательности символов в пределах другой строки". Ну и вы можете открыть справку в редакторе VBA, да и почитать подробнее.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

> Olga
Не вдаваясь в прочие причины, примите во внимание что количество наборов в рисунке никогда не бывает равно нулю, так как существуют два неуничтожаемых набора: CURRENT и PICKFIRST.
Можете проверить:

Dim td As AcadDocument
    Set td = ThisDrawing
    Y = ThisDrawing.SelectionSets.Count
    MsgBox Y

И еще один момент. Бывают проблемы с определением того, к какому именно рисунку относится данный экземпляр объекта ThisDrawing. Поэтому проверяйте в отладчике.

> AlexV
Не бывает в одном чертеже большого количества наборов с одинаковым именем. Поэтому после "убийства" первого же можно спокойно выходить из цикла:

If Left(objSelSet.Name,6) = "MySSet" Then
    Y = Val(Replace(objSelSet.Name, "MySSet",""))
    objSelSet.Delete
    [b]Exit For[/b]
  End If

А вообще для такой простой вещи как убийство есть соответствующие очень простые способы:

On Error Resume Next
    ThisDrawing.SelectionSets("MySSet").Delete

Re: ПОМОГИТЕ! Почему происходит зацикливание?

LeonidSN пишет:

Не бывает в одном чертеже большого количества наборов с одинаковым именем. Поэтому после "убийства" первого же можно спокойно выходить из цикла:

Ну так ведь не

If objSelSet.Name = "MySSet" Then

If Left(objSelSet.Name,6) = "MySSet" Then

Я так понял, исходя из предыдущего кода > Olga (2008-12-22 14:58:55), в чертеже есть какое-то кол-во наборов, имя которых начинается на "MySSet", типа "MySSet1", "MySSet2" и т.д.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

> AlexV
А, не досмотрел...
Тогда другое дело, нужно гонять цикл до конца.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

дак на сколько я понимаю, зацикливание будет происходить всегда, когда кроме набора с именем MySSet будет ещё один какой нить с любым другим именем

Re: ПОМОГИТЕ! Почему происходит зацикливание?

> ssn
Цикл For Each не зацикливается никогда (пардон за каламбур или тавтологию), если имеется конечное число элементов (объектов) в наборе.
Если же говорить о бесконечных циклах типа Do Until - то это целая отдельная тема.
В двух словах:
- никогда не используй бесконечный цикл без крайней необходимости
- если все таки используешь, то ставь запасной вариант выхода из цикла, например, предельное значение счетчика.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

> ssn
Да, увлекся темой и ответил не шибко конкретно...
Если говорить о цикле Olga , то у нее условие выхода из цикла построено на счетчике набора Do Until ThisDrawing.SelectionSets.Count = 0, а не на совпадении или несовпадении имен.

Re: ПОМОГИТЕ! Почему происходит зацикливание?

LeonidSN пишет:

...Если говорить о цикле Olga , то у нее условие выхода из цикла построено на счетчике набора Do Until ThisDrawing.SelectionSets.Count = 0...

+

...количество наборов в рисунке никогда не бывает равно нулю...

То есть, "выхода нет!" :)

Re: ПОМОГИТЕ! Почему происходит зацикливание?

просто у ольги при несовпадении имен цикл переходит на начало, т.е. зацикливается...