Juri Shutenko Personal Homepage. Visual FoxPro.

Коллекции - как много в этом слове!

Разберем еще один случай, когда очень удобно применение коллекции. Предположим, что у нас имеется какой-то контейнер, в который мы можем добавлять другие объекты-члены и при необходимости удалять ненужные. Положим, что в качестве этих членов в контейнер были введены элементы управления класса "Label". И теперь, часть этих меток надо удалить за ненадобность. Казалось бы, чего проще - перебрать члены в коллекции контейнера Objects и удалить ненужные по условию. Например, так:

Lparameters lpcLabelForReport
For Each loMember In This.Objects
   If Lower(loMember.BaseClass)='label'
      If lpcLabelForReport $ loMember.Name
         this.RemoveObject(loMember.Name)
      Endif
   Endif
Endfor

А вот так и не выйдет. Дело в том, что цикл "For Each ... In" внутренне использует счетчик членов коллекции Objects, который динамически обновляется при удалении какого-то члена, в результате чего при массовом удалении мы не можем гарантировать, что все искомые члены коллекции будут удалены. Как поступить в таком случае? Можно использовать массив и заполнять его, но проще создать объект коллекции и ввести в него все объекты, которые нужно удалить, а затем пройтись по членам этой новой коллекции и безопасно удалить все ненужные элементы управления. Корректный код для такого примера может выглядеть так:

Lparameters lpcLabelForReport
LOCAL loObejctToRemove
loObejctToRemove=CREATEOBJECT('Collection')
For Each loMember In This.Objects
   If Lower(loMember.BaseClass)='label'
      If lpcLabelForReport $ loMember.Name
         loObejctToRemove.Add(loMember.Name)
      Endif
   Endif
Endfor
FOR lni=1 TO loObejctToRemove.Count
   This.RemoveObject(loObejctToRemove.Item(lni))
ENDFOR
Cелектор для быстрого перехода на сайты, связанные с Visual FoxPro.