Если проектируется окно, размеры которого пользователь может изменять во время выполнения приложения, то необходимо принять меры, чтобы компоненты в окне при этом тоже изменяли свои размеры или местоположение, равномерно распределяясь по площади окна и не оставляя пустых мест.
Пусть, например, проектируя форму, окно которой содержит панель Panel1, на которой будут размещаться какие-то управляющие компоненты и список ListBox1, панель Panel2, в середине которой будет размещаться некоторая надпись в метке StaticText1, и компонент Memo1, в котором будут редактироваться тексты. Если, разместив все это на форме и не приняв мер для того, чтобы при изменении размеров окна компоненты изменялись, то при том размере формы, который проектировалось, все будет выглядеть нормально. Но если пользователь растянет размеры формы, надеясь увеличить площадь редактирования и длину списка, то приложение приобретет нелепый вид. Увеличение формы просто приводит к увеличению на ней пустого места.
Чтобы избежать таких неприятностей, у многих компонентов и, в частности, у панелей, есть свойство Align (выравнивание). По умолчанию оно равно alNone, что означает, что никакое выравнивание не осуществляется. Но его можно задать равным alTop, или alBottom, или alLeft, или alRight, что будет означать, что компонент должен занимать всю верхнюю, или нижнюю, или левую, или правую часть клиентской области компонента-контейнера. Под клиентской областью понимается вся свободная площадь формы или другого контейнера, в которой могут размещаться включенные в этот контейнер компоненты. Можно также задать свойству Align компонента значение alClient, что приводит к заполнению компонентом всей свободной клиентской области. Во всех этих случаях размеры компонента будут автоматически изменяться при изменении размеров контейнера. В C++Builder 6 добавлено еще одно возможное значение alCustom (заказное). В этом случае положение компонента определяется вызовами CustomAlignInsertBefore и CustomAlignPosition.
В приведенном выше примере логично для панели Panel2 задать значение Align, равным alTop, чтобы ширина панели автоматически менялась с изменением ширины окна. Панель займет всю верхнюю часть формы, а ее высота будет такой, какая необходима. Для панели Panel1 следует задать значение Align, равным alLeft, так как увеличение ее ширины не имеет смысла, а увеличение высоты позволяет увидеть большую часть списка ListBox1. Компонент Panel1 займет всю левую часть клиентской области, оставшейся свободной после размещения Panel2. Для компонента Memo1 следует задать значение Align, равным alClient, что позволит компоненту увеличиваться и в высоту, и в ширину, увеличивая площадь редактирования. При этом компонент Memo1 займет всю площадь клиентской области, оставшуюся после размещения Panel1 и Panel2.
Задавать компонентам соответствующие значения свойства Align в приведенном примере надо именно в указанной выше последовательности: alTop для Panel2, alLeft для Panel1, alClient для Memo1. Если, например, начать с задания alClient для Memo1, то компонент Memo1 займет всю площадь формы, и остальные компоненты вообще не будут видны.
Значения свойства Align имеют определенный приоритет: значения alTop и alBottom имеют более высокий приоритет, чем значения alLeft и alRight. Поэтому не любые варианты размещения и выравнивания панелей можно реализовать непосредственно. Например, пусть нужно создать форму, причем надо, чтобы при изменении размеров окна панель Panel1 продолжала занимать всю левую часть формы (т.е. надо задать Align = alLeft), Panel3 занимала бы всю нижнюю часть площади, свободной от Panel1 (т.е. для Panel3 надо задать Align = alBottom), а Panel2 занимала бы всю оставшуюся часть клиентской области (т.е. для Panel2 надо задать Align = alClient). Напрямую все это сделать невозможно. Если задать для Panel1 значение alLeft, а затем для Panel3 задаете значение alBottom, то в силу приоритета alBottom панель Panel3 займет всю нижнюю часть формы, вытеснив оттуда Panel1.
В подобных случаях приходится вводить дополнительные панели-контейнеры. В приведенном примере на форме сначала надо разместить Panel1 и дополнительную панель Panel4. Для Panel1 задается alLeft, а для Panel4 задается alClient. Затем панели Panel2 и Panel3 размещаются на Panel4 и для них задаются значения: alBottom для Panel3 (поскольку клиентской областью для Panel3 является область панели Panel4, то Panel3 займет нижнюю часть правой половины экрана) и значение alClient для Panel2, В результате получим нужное выравнивание всех панелей.