Шаг 15.
Вкладка Win32. Компонент THeaderControl

    На этом шаге мы рассмотрим компонент THeaderControl.

    Компонент THeaderControl (Панель заголовков) позволяет разместить в форме заголовки произвольных элементов. Порядок и размеры этих заголовков можно изменять. Простой алгоритм работы данного компонента позволяет подстраивать размеры других объектов под размеры разделов заголовка. Для настройки в процессе проектирования используются следующие свойства.

    Свойства компонента THeaderControl.

Таблица 1. Свойства компонента THeaderControl
Свойство Описание
property DragReorder: Boolean; При значении True разрешено менять порядок разделов заголовка с помощью метода перетаскивания
property FullDrag: Boolean; При значении True в ходе перетаскивания рисуется не граница раздела, а весь раздел целиком
property HotTrack: Boolean; При значении True наведение указателя на заголовок изменяет его цвет
property Images: TCustomImageList; Ссылка на объект ImageList, содержащий изображения для разделов заголовка
property Style: THeaderStyle; Вид разделов заголовка. Возможные значения:
  • hsButtons (Объемный),
  • hsFlat (Плоский).
property Sections: THeaderSections Содержит секции заголовка

    Разделы задаются в редакторе, который вызывается двойным щелчком на панели заголовков или на поле для свойства Sections (класс THeaderSections). Каждый из разделов заголовка может работать как кнопка, реагирующая на щелчки, если свойство AllowClick имеет значение True. Номер изображения указывается в свойстве ImageIndex, ширина раздела - в свойстве Width. Заголовок хранится в свойстве Text. Раздел можно создавать программно, тогда в свойстве Style указывается значение hsOwnerDraw.

    Использовать панель заголовков можно, только обрабатывая предназначенные для нее сообщения. Таких сообщений четыре.

Таблица 2. Сообщения
Сообщение Условие генерации
property OnDrawSection: TDrawSectionEvent; Прорисовка раздела, если значение его свойства Style равно hsOwnerDraw
property OnSectionDrag: TSectionDragEvent; Перетаскивание раздела в новую позицию
property OnSectionResize: TSectionNotifyEvent; Изменение размеров раздела
property OnSectionTrack: TSectionTrackEvent; Идет процесс изменения размера раздела

    Небольшая программа продемонстрирует работу с компонентом THeaderControl. Компонент THeaderControl используется для управления положением и линейными размерами трех других компонентов.


Рис.1. Пример использования компонент THeaderControl для управления положением и линейными размерами трех других компонентов

    Для реализации программы выполните следующую последовательность шагов.

    1. Поместите на пустую форму компонент THeaderControl, TEdit, TMemo и TButton. По умолчанию должно выполняться условие HeaderControl1.Aligh = alTop - убедитесь в этом и установитек свойство Align, если это не так.

    2. Создайте обработчик событий OnCreate для формы, а также OnResize и OnSectionResize для компонента HeaderControl1.

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    HeaderControl1: THeaderControl;
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure HeaderControl1SectionResize(HeaderControl: THeaderControl;
      Section: THeaderSection);
    procedure HeaderControl1Resize(Sender: TObject);
   private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
{$R *.dfm}

const
  Delta = 10;

procedure TForm1.FormCreate(Sender: TObject);
var
  HSection : THeaderSection;
  k : Integer;
begin
   //Создаем три секции заголовка
   with HeaderControl1 do
    for k := 0 to 2 do
    begin
      HSection := Sections.Add;
      HSection.Text := 'Секция № '+IntToStr (k);
      HSection.Width := Form1.Width div 3;
      HSection.MinWidth := 3*Delta;
    end;
end;

procedure TForm1.HeaderControl1SectionResize(HeaderControl: THeaderControl;
  Section: THeaderSection);
begin
  HeaderControl1Resize (Self)
end;

procedure TForm1.HeaderControl1Resize(Sender: TObject);
//Устанавливаем положение и размеры компонентов.
begin
  with HeaderControl1 do
  begin
    Edit1.Left := Delta;
    Edit1.Top := HeaderControl1.Height + 1;
    Edit1.Width := Sections.Items [0].Width -2*Delta;
    Memo1.Left := Sections.Items [1].Left + Delta;
    Memo1.Top := HeaderControl1.Height + 1;
    Memo1.Width := Sections.Items [1].Width - 2*Delta;
    Button1.Left := Sections.Items [2].Left + Delta;
    Button1.Top := HeaderControl1.Height +1;
    Button1.Width := Sections.Items [2].Width -2*Delta;
  end;
end;
end.
Текст этого примера можно взять здесь.

    Для заголовка создается объект класса THeaderSections, определяющий секции заголовка. Следующее свойство этого объекта открывает доступ к индексированным объектам-секциям класса THeaderSections:

property Items[Index: Integer]: THeaderSection;

    Свойства класса THeaderSections перечислены в таблице 3.

Таблица 3. Свойства класса THeaderSections
Свойство Описание
property Alignment: TAlignment; Определяет выравнивание текста:
  • taLeftJustify - выравнивание влево;
  • taCenter - текст центрирован по горизонтали;
  • taRightJustify - выравнивание вправо.
property AllowClick: Boolean; Разрешает/запрещает генерацию события OnSectionClick при щелчке на секции
property Left: Integer; Определяет положение левой границы секции относительно границ компонента (в пикселях)
property MaxWidth: Integer; Определяет максимальную ширину секции в пикселях
property MinWidth: Integer; Определяет минимальную ширину секции в пикселях
property Right: Integer; Определяет положение правой границы секции относительно границ компонента (в пикселях)
property THeaderSectionStyle = (hsText, hsOwnerDraw);
property Style: THeaderSectionStyle;
Определяет способ формирования секции:
  • hsText - секция содержит только текст и изображается автоматически;
  • hsOwnerDraw - секция прорисовывается программой.
property DisplayName: String; Имя заголовка секции
property Text: String; Содержит текст секции
property Width: Integer; Содержит текущую ширину секции в пикселях

    Следующий метод добавляет очередную секцию заголовка:

function THeaderSections.Add: THeaderSection;

    На следующем шаге мы рассмотрим компонент TStatusBar.




Предыдущий шаг Содержание Следующий шаг