Хакер » 21.12.2007 (Пт) 21:56
Я не понял, исчезают ли Option-ы группами или по-одному. Поэтому рассмотрим более-менее универсальное решение:
Создаём некий класс (CInteractiveOption или CInteractiveGroup - в зависимости от того, как у тебя и что). Объекты этого класса будут являться элементами односвязанный (или односвязный, как правильно?) списка (т.е. списка, в котором в каждом элементе есть ссылка на следующий, а в последнем нулевая ссылка (т.е. Nothing)).
В зависимости от того, работаем ли мы с группами Option-ов, или с каждым в отдельности, этот класс будет храниться или коллекцию ссылок на Option-ы, или одну переменную-ссылку на соотв. OptionBox.
У этого класса создаём методы Expand и Collapse (или Show и Hide) соотвественно для разворачивания и сворачивания групп/элементов, метод (желательно скрытый) Move, приватную переменную, храняющую свёрнуто-развёрнутое состояние объекта.
Итак, при вызове пойдём снизу-вверх. При вызове метода Move(byval lMovement as long) объект изменяет свою координату (и, разумеется, координаты каждого из OptionBox-ов, которые принадлежат группе) на lMovement, и если Not [ссылка на следующий элемент] Is Nothing, то вызываем этот же метод с этим же значением аргумента у своего соседа (получается рекурсия).
Если наше состояние = СКРЫТО, то никаких координат (собественных и своих внутре-группных объектов) метод Move изменять не должен - должен лишь тупо вызывать этот же метод у своего соседа (если он есть).
Теперь о методах Expand и Collapse. Expand должен вызывать Move Me.BoundingSize у самого же себя, а метод Collapse - Move -Me.BoundingSizee (тоже у самого себя). Ну и, разумеется, состояние они также должны писать.
Если нужно, могу сделать пример.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.