FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9176
Вход
Ресайзер на базе свойства 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). Реализовать это дело оказалось до смешного простым:
  
    .nAnchor = iif(vartype(.nAnchor)='C' and type(.nAnchor) = 'N',;  
                    evaluate(.nAnchor), .nAnchor)  
                    

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (5.024) Вложение [39.9]kb
Дополнения пользователей
Ресайзер на базе свойства Anchor
[+][?]
DmGr
09.03.05 09:06:51

Штука отличная!
Только есть один вопрос
Как отменить изменение размеров колонок grid?
У меня колонки создаются программно и их размерами пользователь управляет сам.
А Resizer делает все по своему.
Может быть добавить какое-нибудь свойство для grid?
Олег Бляхеров
24.03.05 10:07:25

Если у колонки Resizable=.F., ее размеры не изменяются.
Удачи!
PS. Сорри за задержку ответа!
DmGr
25.03.05 10:39:38

Это я увидел из листинга, и уже закомментировал вызов 
изменения колонок, но у меня пользователь может менять размеры колонки, и после закрытия формы их
размеры сохраняются.

И еще вопрос.
У меня не получилось привязать верхнюю границу одного контрола к нижней границе другого.
Это возможно?
Олег Бляхеров
10.04.05 08:03:32

Привязать верхнюю границу одного контрола к нижней границе другого нельзя, привязка происходит
только к одноименной границе. Если вертикальные размеры нижнего контрола не изменяются, то для
достижения нужного эффекта связывайте нижние границы контролов. Если же вертикальные размеры обоих
контролов могут меняться, Вам нужен сплиттер (если я правильно понял задачу).
Удачи!
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика