Учись программированию на C++ Builder бесплатно!

В ряде случаев автоматического изменения размеров различных панелей оказывается недостаточно для создания удобного пространства для действий пользователя. Даже при увеличении окна на весь экран какая-то панель приложения может оказаться перегруженной информацией, а другая относительно пустой. В этих случаях полезно предоставить пользователю возможность перемещать границы, разделяющие различные панели, изменяя их относительные размеры. Пример такой возможности можно увидеть в программе Windows «Проводник».

В библиотеке C++Builder на странице Additional имеется специальный компонент Splitter, который позволяет легко осуществить это. При работе с ним надо соблюдать определенную последовательность проектирования. Если нужно установить Splitter между двумя панелями, первая из которых будет выровнена к какому-то краю клиентской области, а вторая займет всю клиентскую область, то сначала надо выровнять первую панель, например, влево. Затем надо перенести на форму Splitter и выровнять его в ту же сторону (тоже влево). Splitter прижмется к соответствующему краю первой панели. После этого можно задать выравнивание второй панели на всю оставшуюся площадь клиентской области. В результате Splitter окажется зажатым между двумя панелями и при запуске приложения он позволит пользователю изменять положение соответствующей границы между этими панелями.

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

Компонент Splitter имеет событие OnMoved, которое наступает после конца перемещения границы. В обработчике этого события надо предусмотреть, если необходимо, упорядочение размещения компонентов на панелях, размеры которых изменились: переместить какие-то метки, изменить размеры компонентов и т.д.

Свойство ResizeStyle компонента Splitter определяет поведение разделителя при перемещении его пользователем. Поэкспериментируйте с ним, чтобы увидеть различие в режимах перемещения разделителя. По умолчанию свойство Splitter равно rsPattern. Это означает, что пока пользователь тянет курсором мыши границу, сам разделитель не перемещается, и панели тоже остаются прежних размеров. Перемещается только шаблон линии, указывая место намечаемого перемещения границы. Лишь после того, как пользователь отпустит кнопку мыши, разделитель переместится, и панели изменят свои размеры. Практически такая же картина наблюдается, если установить ResizeStyle = rsLine. При ResizeStyle = rsUpdate в процессе перетаскивания границы пользователем разделитель тоже перемещается, и размеры панелей все время меняются. Это, может быть, удобно, если пользователь хочет установить размер панели таким, чтобы на ней была видна какая-то конкретная область. Но так как процесс перетаскивания в этом случае сопровождается постоянной перерисовкой панелей, наблюдается неприятное мерцание изображения. Так что этот режим можно рекомендовать только в очень редких случаях. Если установить ResizeStyle = rsNone, то в процессе перетаскивания границы не перемещается ни сама граница, ни изображающая ее линия. Вряд ли это удобно пользователю, поэтому невыгодно использовать этот режим.

Свойство MinSize компонента Splitter устанавливает минимальный размер в пикселах обеих панелей, между которыми зажат разделитель. Задание такого минимального размера необходимо, чтобы при перемещениях границы панель не сжалась бы до нулевого размера или до такой величины, при которой на ней исчезли бы какие-то необходимые для работы элементы управления. К сожалению, в версиях C++Builder, младше C++Builder 5, свойство MinSize не всегда срабатывает верно. В C++Builder 5 введено новое свойство компонента Splitter это AutoSnap. Если оно установлено в true (по умолчанию), то при перемещении границы возможны те же неприятности, что в младших версиях C++Builder. Но если установить AutoSnap в true, то перемещение границы панелей сверх пределов, при которых размер одной из панелей станет меньше MinSize, просто блокируется. Так что можно рекомендовать всегда устанавливать AutoSnap в true.

Впрочем, и это не решает всех задач, связанных с перемещением границ панелей. Дело в том, что свойство MinSize относится к обеим панелям, граница между которыми перемещается, а в ряде случаев желательно раздельно установить различные минимальные размеры одной и другой панели. Это проще сделать, задав в панелях соответствующие значения свойства Constraints.

Поделиться