Многостраничный блокнот – компоненты TTabControl и TPageControl
В Палитре компонентов имеется два элемента управления, обеспечивающих создание многостраничных блокнотов. Это компоненты TTabControl и TPageControl. Переключение между страницами осуществляется при помощи закладок. Закладки могут выглядеть как "настоящие" в бумажном блокноте, а могут быть похожи на стандартные кнопки Windows. Кстати, сама Палитра компонентов Delphi является примером использования такого элемента управления.
Компонент TTabControl отличается тем, что представляет собой как бы "виртуальный" блокнот. Это – единый объект с одной фактической страницей. При переключении закладок осуществляется вызов метода-обработчика события:
property OnChange: TNotifyEvent;
Соответствующий код в котором может изменить набор видимых элементов управления и создать для пользователя иллюзию "переключения страниц".
Компонент TFageControl является контейнером для объектов TTabSheet, соответствующих отдельным страницам блокнота. Страницы в нем могут нести каждая свой набор дочерних компонентов; их можно переключать уже во время разработки.
Первый подход удобен, если на разных страницах у вас должны располагаться одни и те же компоненты, "начиненные" различными данными. Идеальный пример приводится самими разработчиками Delphi (папка Help\Samples\TabCntrl – обязательно посмотрите пример!). Здесь TTabControl используется для редактирования базы данных. Закладки для страниц создаются по одной для каждой записи в таблице. А на одной-единственной странице располагаются компоненты для отображения данных. При переключении закладок происходит навигация по таблице, содержимое полей меняется, и создается впечатление перехода на другую страницу.
Второй подход необходим, если у вас действительно разные страницы с различными наборами компонентов на них. Компонент TPageControl используют для создания редакторов свойств и настроек программы, а также для разного рода мастеров (Wizards).
Оба компонента в своей основе имеют общий элемент управления из библиотеки ComCtl32 (в документации Microsoft он называется Tab Control). Соответственно, в иерархии классов Delphi они оба произошли от класса TCustomTabcontrol, от которого унаследовали значительную часть свойств и методов. А вот механизмы работы отдельных страниц у каждого компонента свои. Поэтому сначала мы рассмотрим общие для двух компонентов свойства, а затем особенности использования страниц. Свойства и методы-обработчики класса-предка TCustomTabcontrol представлены в табл. 5.1 и 5.2 соответственно. Обратите внимание, что перечисленные свойства и методы в потомках объявляются как опубликованные (published).
Таблица 5.1. Основные свойства, общие для TTabControl и TPageContrli.
Объявление | Описание |
---|---|
property Tablndex: Integer; | Задает номер текущей страницы, начиная с 0 |
property TabHeight: Smallint; | Задает высоту закладок в пикселах. При значении 0 высота определяется автоматически так, чтобы вместить текст |
property TabWidth: Smallint; | Задает ширину закладок. При значении 0 ширина определяется автоматически так, чтобы вместить текст |
type TTabStyle = (tsTabs, tsButtons, tsFlatButtons); property Style: TtabStyle; |
Определяет стиль закладок компонента: tsTabs – стандартные закладки; tsButtons – объемные кнопки; tsFlatButtons – плоские кнопки |
type TTabPosition = (tpTop, tpBottom, tpLeft, tpRight); property TabPosition: TTabPosition; |
Определяет расположение закладок на компоненте. Расположение, отличное от tpTop, возможно только для стиля tsTabs |
property HotTrack: Boolean; | При значении True названия страниц выделяются цветом при перемещении над ними указателя мыши |
property Images: TCustomlmageList; | Указывает на список картинок, появляющихся на закладках страниц |
property RaggedRight: Boolean; | При значении True ширина закладок изменяется таким образом, чтобы они не занимали всю сторону блокнота |
property MultiLine: Boolean; | При значении True закладки страниц могут располагаться в несколько рядов (если они не помещаются в один). При значении False в верхнем правом углу появляются кнопки, организующие прокрутку невидимых заголовков |
property ScrollOpposite: Boolean; | При значении True, если закладки расположены в несколько рядов, при переходе к закладке следующего ряда все остальные ряды перемещаются на противоположную сторону блокнота. Действительно только при MultiLine=True |