Алгоритм позиционирования

Различные геометрические алгоритмы.
dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Алгоритм позиционирования

Сообщение dr.MIG » 21.12.2007 (Пт) 21:22

На форме есть много элементов управления (OptionButton), расположенных в ряд на одинаковом расстоянии друг от друга. Некоторые из них при определённых условиях могут быть невидимы, в результате между видимыми соседними элементами управления остаётся "пустое место". Как сдвинуть видимые элементы управления налево, на место невидимых? Ничего не приходит в голову, кроме чудовищного количества If...Else... А есть чувство, что можно как-то упростить код. Подскажите, пожалуйста, как.
Salus populi suprema lex

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.12.2007 (Пт) 21:35

не очень силен с коллекциями в VB, но может стоит подумать в эту сторону? То есть если ты можешь работать с всеми option'aми как с массивом, то перебрав все ты сможешь увидеть их свойство visible и соответственно ставить координату x в соответствии с уже выстроиными элементами.
ХЎ

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 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.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 21.12.2007 (Пт) 21:57

А если сделать Enable = False? Ничего сдвигать не надо и пользователь не будет пугаться внезапно появившегося контрола.:D
При этом и дизайн интерфейса страдать не будет, что не маловажно.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 21.12.2007 (Пт) 22:06

Спасибо всем откликнувшимся. Хакер, да, это универсальный метод, но неохота ради одного места в программе этим заниматься, имхо, в моём случае подойдёт и способ d3drm -- работать с массивом элементов как-то так:

Код: Выделить всё

    For i = 1 To optF.Count - 1
        If optF(i - 1).Visible Then
            optF(i).Left = optF(i - 1).Left + 440 ' промежуток между э.у.
        Else
            optF(i).Left = optF(i - 1).Left
        End If
    Next


Enable=False -- надо будет предложить тому, кто будет работать с программой... Может и действительно это подойдёт. :)
Salus populi suprema lex

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 21.12.2007 (Пт) 22:18

dr.MIG писал(а):Enable=False -- надо будет предложить тому, кто будет работать с программой... Может и действительно это подойдёт. :)

А почему и нет? Возьмем классический пример с меню какой-нибудь программы, того же VB. Если какая функция работы не доступна, меню просто не активно. Все просто. Ну если заказчики программы так захотели, то конечно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.12.2007 (Пт) 22:52

Не удержался.
Вложения
groups_ctr.rar
(2.42 Кб) Скачиваний: 137
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 21.12.2007 (Пт) 23:14

Хакер писал(а):Не удержался.


Хакер - Неудержимый :D

Сорри ))))))))))
ХЎ

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 22.12.2007 (Сб) 12:19

Хакер, а пример-то скорее всего пригодится, только в другой части программы :) Спасибо.
Salus populi suprema lex


Вернуться в Геометрия

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList