Ресайзер на базе свойства Anchor

Эмуляция свойства Anchor, введенного в VFP9, для более ранних версий VFP с дополнениями, которые автору показались очень полезными.
Какое-то время назад в форуме по VFP9 обсуждалось введенное в VFP9 свойство Anchor. (См. http://forum.foxclub.ru/read.php?f=29&i=654&t=654 )

 К сожалению, я довольно редко бываю теперь на форуме и прочел его только недавно. У себя я использовал использовал похожий механизм, но он удовлетворял меня не слишком. Главная проблема - достаточно часто нужно привязать контрол не к границам контейнера, а к положению другого контрола. Например, если нужно привязать textbox с итогом по колонке grid'а к самой колонке. Все такие изыски приходилось прописывать руками.    Механизм с якорями мне понравился гораздо больше, а также идея Игоря Королева о 'приклеивании' к границам и, особенно, о реализации всего этого для ранних версий VFP (сам я до сих пор работаю на VFP6 SP4 и не жалуюсь, а 9-ка когда еще выйдет...). Пример Игоря меня, что называется, раззадорил и я решил на основе его решения реализовать привязку не только к границам родного контейнера, но к любому другому контролу на форме. Т.е. я предалагаю в пару к свойству nAnchor добавить еще свойство cAnchorControl, которое будет определять имя контрола-якоря. Привязка должна выполняться аналогично привязке к границам контейнера: левая грань контрола - к левой грани якоря и т.п. Я посмотрел свои формы на предмет применимости нового свойства и обнаружил, что количество сэкономленного кода измеряется десятками строк. Кстати, предваряя реакцию типа 'не усложняй без нужды', хочу заметить, что используя такие стандартные механизмы, я, конечно, усложняю инструмент, зато значительно упрощаю основной текст. Для чего, собственно, инструмент и делается:) Но аппетит приходит во время еды, к тому же выяснилось, что не все проблемы это новое свойство решает. Пример - контрол Mover, позволяющий отбирать элементы из одного списка в другой. В нем два listbox'a (исходный и целевой списки) и посередине кнопки Add и Remove. При растягивании/сжатии Mover'а хотелось бы, чтобы внешние границы listbox'ов оставались 'приклеенными' к границам Mover'а, а внутренние - к кнопкам. Значит, нужно еще одно свойство - nAnchorMask, которое бы в дополнение к nAnchor и cAnchorControl определяло какими гранями контрол цепляется к якорю, а какими - к родному контейнеру. Кроме того, такое свойство позволяет элементарно реализовать Splitter. Код самого Splitter'а получается минимальным, а все привязки деляются заданием свойств nAnchor, cAnchorControl и nAnchorMask для контролов слева и справа от Splitter'а. Задумано - сделано! Класс, который все это делает, перед Вами. И еще одно усовершенствование, которое я бы предложил для свойства Anchor. Как показал мой минимальный опыт при тестировании класса, высчитывать число, задающее нужную комбинацию привязок, - занятие чрезвычайно нудное. И через пять минут ты, естественно, забываешь исходные цифры и нужно решать обратную задачу. Вот я и предлагаю, чтобы значение Anchor задавалось не только числом (11), но и выражением (1+2+8). Реализовать это дело оказалось до смешного простым:

[code] .nAnchor = iif(vartype(.nAnchor)='C' and type(.nAnchor) = 'N',; evaluate(.nAnchor), .nAnchor) [/code]

Автор: Олег Бляхеров

Автор публикации

не в сети 20 лет

Олег Бляхеров

0
Комментарии: 0Публикации: 8Регистрация: 23-04-2001
0
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 39,90 КБ 452resizer
Оставить комментарий
Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
Генерация пароля