18.3. КОМПОНЕНТЫ СТРАНИЦЫ WIN32

18.3.1. TTabControl - набор закладок

Компонент TTabControl представляет собой контейнер с закладками. Свойство Tabs определяет названия и количество закладок. Событие onchange. возникает при выборе новой закладки и позволяет управлять содержимым окна компонента. Для примера на рис. 18.22 показано использование компонента для управления календарем (с помощью TTabControl созданы закладки с названиями месяцев).

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

property DisplayRect: TRect; | Определяет рабочую зону компонента, предназначенную для размещения других компонентов. Клиентская часть компонента содержит зону закладок и рабочую зону
property HotTrack: Boolean; | Если содержит True, название закладки автоматически выделяется цветом при перемещении над ней указателя мыши
property Images: TCustomImageList; | Определяет объект - хранилище изображений, которые будут прорисовываться слева от текста
property Multi-Line: Boolean; | Разрешает расположение закладок в несколько рядов. Если содержит False и закладки не умещаются в границах компонента, в зону закладок автоматически вставляются кнопки прокрутки
property OwnerDraw: Boolean; | Разрешает программную прорисовку закладок
property ScrollOpposite: Boolean; | Разрешает/запрещает перемещение неактивных рядов закладок на противоположную сторону компонента. Учитывается, если количество рядов больше 2
type TTabStyle = (tsTabs, tsButtons, tsFlatButtons) ; property Style: TTabStyle; | Определяет стиль закладок: tsTabs - обычные надписи; tsButtons -трехмерные кнопки; tsFlat Buttons - плоские кнопки
property TabHeight: Smallint; | Определяет высоту каждой закладки в пикселях. Если содержит 0, высота закладок выбирается автоматически в зависимости от выбранного шрифта
property Tablndex: Integer; | Определяет индекс выбранной закладки или содержит -1, если ни одна закладка не выбрана. Индексация начинается с 0
TTabPosition = (tpTop, tpBottom) ; property TabPosition: TTab Position; | Определяет положение зоны закладок относительно рабочей зоны компонента (tpTop - вверху, tpBottom - ВНИЗУ)
property Tabs: TStrings; | Определяет надписи на закладках и их количество. Чтобы добавить или удалить закладку, нужно добавить ее надпись к списку Tabs или удалить надпись из списка
property TabWidth: Smallint; | Определяет ширину каждой закладки в пикселях. Если содержит 0, ширина каждой закладки выбирается индивидуально в зависимости от длины ее надписи

Рис. 18.22. Управление календарем с помощью TTabControl

Помимо события OnChange, возникающего после выбора новой закладки, для компонента определено также событие OnChanging, которое возникает перед сменой закладки:

type TTabChangingEvent =

procedure (Sender: TObject;

var AllowChange: Boolean) of object;

property OnChanging: TTabChangingEvent;

Обработчик события может запретить выбор закладки, вернув в параметре Alliowchange значение False.

18.3.2. TPageControl - набор страниц с закладками

Компонент TPageControl в отличие от TTabControl может содержать несколько перекрывающих друг друга панелей класса ттаь-Sheet. Каждая панель выбирается связанной с ней закладкой и может содержать свой набор помещенных на нее компонентов.

Чтобы на этапе конструирования добавить новую панель или выбрать ранее вставленную, щелкните по компоненту правой кнопкой мыши и выберите New page (новая панель), Next page (следующая панель) или previous page (предыдущая панель). Смена панелей идет циклически, т. е. после показа последней показывается первая и наоборот.

Помимо свойств HotTrack, MultiLine, ScrollOpposite, TabHeight, TabPosition и TabWidth, которые аналогичны одноименным свойствам TTabcontrol, компонент имеет следующие специфичные свойства:

property ActivePage: TTab-Sheet; | Содержит ссылку на активную панель. Установка нового значения ActivePage размещает соответствующую панель поверх остальных. Для выбора новой панели следует использовать методы SelectNextPage и FindNextPage
property ActivePageIndex: Integer; | Содержит индекс активной панели
property PageCount: Integers; | Содержит количество панелей (только для чтения)
property Pages[Index: Integer] : TTabSheet; | Возвращает ссылку на панель по ее индексу (только для чтения)

Методы компонента:

function FindNextPage (CurPage: TTabSheet; GoFor-ward, CheckTabVisible: Boolean) : TTabSheet; | Ищет следующую панель: CurPage - текущая панель; GoForward - содержит True, если поиск идет от первой панели к последней; CheckTabVisible -содержит True, если из поиска исключаются панели с признаком Tabvisible=False. Возвращает ссылку на найденную панель. Если CurPage не принадлежит компоненту, возвращает ссылку на первую или последнюю панель в зависимости от параметра GoForward
procedure SelectNextPage (GoForward: Boolean); | Делает активной следующую панель. Если GoFor-ward=True, активизируется следующая панели, в противном случае - предыдущая

18.3.3. TImageList - хранилище изображений

Компонент класса TImageList представляет собой контейнер для хранения множества рисунков одинакового размера. Он может быть полезен при программном создании набора инструментальных кнопок, секций управляющего заголовка, при разработке программ, использующих анимационные эффекты, и вообще там, где требуется индексированный доступ к изображениям.

Компонент не имеет собственной канвы и поэтому не может самостоятельно отображать хранимые в нем картинки, которые могут быть растрами (bmp) или пиктограммами (ico). Его метод Draw получает канву от другого компонента и рисует изображение в клиентской области этого компонента. В компоненте есть множество специальных свойств и методов, упрощающих обслуживание набора картинок. Для получения дополнительной информации обратитесь к встроенной справочной службе. Пример использования компонента см. в п. 18.2.13.

18.3.4. TRichEdit - ввод и отображение RTF-текста

Компонент TRichEdit представляет собой многострочный редактор, работающий с расширенным текстовым форматом RTF. Текст формата RTF хранит дополнительную служебную информацию, управляющую свойствами каждого абзаца и сменой шрифта по ходу текста.

Рис. 18.23. Окно демонстрационной программы DEMOS | RICHEDIT | RICHED1T.EXE

На рис. 18.23 показан пример использования возможностей компонента. Полный текст программы, с помощью которой создан рисунок, приводится в папке demos | RICHEDIT | RICHEDIT.DPR, котораянаходится в каталоге размещения Delphi.

Компонент использует вспомогательные объекты класса TTextAt-tributes для хранения атрибутов шрифта. Эти атрибуты распространяются на весь текст через свойство редактора DefAttributes или на выделенную часть текста - через его свойство SeiAttributes.

Помимо обычных шрифтовых свойств CharSet, Color, Height, Name, Pitch, Size И Style (см. класс TFont) объект TTextAttributes содержит также свойства consistentAttributes и protected. Первое доступно только для чтения и содержит набор текстовых характеристик, общих как для всего текста, так и для его выделенной части. Свойство protected защищает весь текст или его части от редактирования. Попытка изменить текст, имеющий атрибут protected, вызывает обработчик события OnProtectChange, который может разрешить или запретить изменения. По умолчанию изменения запрещены.

Для каждого текстового абзаца создается объект класса трага-Attributes, в котором сохраняются атрибуты абзаца. Эти атрибуты доступны через следующие свойства класса TparaAttributes:

property Alignment: TAlignment; | Определяет горизонтальное выравнивание текста абзаца относительно границ компонента
property Firstlndent: Longint; | Указывает отступ текста абзаца в пикселях от предыдущего абзаца
property Leftlndent: Longint; | Указывает отступ текста абзаца в пикселях от левого края компонента
TNumberingStyle = (nsNone, nsBullet) ; property Numbering: TNum beringStyle; | Указывает, надо ли вставлять слева от абзаца символы списка. Если содержит nsBullet, символы списка вставляются
property Rightlndent: Longint; | Указывает отступ текста абзаца в пикселях от правого края компонента
property Tab[Index: Byte] : Longing; | Для табулостопа с индексом index содержит его позицию в пикселях от левого края компонента
property TabCount: Irteger; | Определяет количество табулостопов в строке абзаца

Свойства класса TRichEdit

property DefAttributes: TTextAttributes; | Определяет шрифтовые атрибуты всего текста
TConversionClass = class of TConversion; property DefaultConverter: TConversionClass; | Свойство указывает класс конвертора, использующегося для преобразования текстовых форматов причтении или записи текста. По умолчанию нет преобразования
property HideScroliBars: Boolean; | Определяет, будет ли редактор автоматически вставлять полосы прокрутки, если текст отсекается границами компонента. Игнорируется, если scrollBars содержит ssNone
property HideSelection: Boolean; | Указывает, будет ли убираться выделение текста, если компонент потеряет фокус ввода
property Lines: TStrings; | Содержит набор строк текста. С помощью его методов LoadFromFile и SaveToFile компонент может читать текст из файла или записывать в него текст
property PageRect: TRect; | Указывает размеры страницы при печати на принтере
property Paragraph: TParaAttributes; | Содержит атрибуты текущего абзаца, т. е. абзаца с выделением или с текстовым курсором. Программа не может изменить свойство paragraph, но может изменить свойства связанного с ним абзаца
property PlainText: Boolean; | Запрещает/разрешает записывать в файл или читать из него служебную информацию формата RTF (True -запрещает)
property SelAttributes: TTextAttributes; | Определяет шрифтовые атрибуты выделенного текста
property SelLength: Integer; | Задает длину в символах выделенной части текста
property SelStart: Integer; | Определяет номер первого символа выделенной части текста от начала текста (нумерация символов начинается с 0). Если нет выделения, указывает символ, перед которым располагается текстовый курсор
property SelText: String; | Содержит выделенный текст. Установка нового значения SelText заменяет выделенный текст на новый, а если нет выделения - вставляет его в позицию курсора

Методы компонента:

procedure Clear; TSearchType = (stWholeWord, stMatchCase) ; TSearchTypes = set of TSear chType ; function FindText(const SearchStr: String; StartPos, Length: Integer; Options: TSear chTypes) :Integer; | Удаляет весь текст Ищет в тексте строку SearchStr и возвращает индекс первого ее символа при удачном поиске: StartPos - начало поиска: Length-длина строки, options указывает, будет ли поиск идти по целым словам и надо ли учитывать высоту букв
function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; | Копирует не более BufSize символов выделенного текста в буфер Buffer и возвращает количество скопированных символов
procedure Print(const Caption: String) ; | Форматирует текст по границам листа бумаги и печатает его на умалчиваемом принтере, caption определяет заголовок печати
TConversionClass = class of TConversion; class procedure RegisterConver- sionFormat(const AExtension: String; AConversionClass: TConversionClass) ; | Устанавливает соответствие между расширением файла AExtension и конвертором текста

Для компонента определены такие события:

TRichEditProtectChange = procedure(Sender: TObject; Start Pos, EndPos: Integer; var AllowChange: Boolean) of object property OnProtectChange: TRichE ditProtectChange; | Возникает при попытке изменить текст, имеющий атрибут Protected: StartPos, EndPos - соответственно начальная и конечная позиции изменяемого текста. В параметре AllowChange обработчик возвращает True, если можно изменять текст
TRichE'ditResizeEvent = proce dure (Sender: TObject; Rect: TRect) of object property OnResizeRequest: TRichEditResizeEvent; | Событие связано с перерисовкой текста из-за изменения размеров шрифта. Rect содержит прямоугольник, который будет перерисован
TRichEditSaveClipboard = procedure(Sender: TObject; NumObjects, NumChars: Integer; var SaveClipboard: Boolean) of object; property OnSaveClipboard: TRichEditSaveClipboard; | Возникает в момент уничтожения компонента и извещает его о том, что в clipboard осталась информация, которая помещена им. Если обработчик вернет False в параметре Save clipboard, буфер обмена будет очищен
property OnSelectionChange: TNotifyEvent; | Возникает при изменении выделенного текста

18.3.5. TTrackBar-регулятор величины

Компонент класса TTrackBar предназначен для визуального управления числовой величиной. Он во многом схож со стандартным элементом TScroll-Ваг и отличается от него в основном оформлением.

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

property Frequency: Integer; | Определяет частоту нанесения меток: 1 - каждое значение диапазона изменения имеет метку; 2 - каждое 2-е значение и т. д.
property LineSize: Integer; | Определяет смещение ползунка при нажатии клавиш курсора или при единичном перемещении мышью
property Max: Integer; | Определяет максимальное значение диапазона изменения
property Min: Integer; | Определяет минимальное значение диапазона измене ния
property Orientation: TTrackBarOrientation; | Определяет ориентацию компонента: trHorizontal -горизонтальная; trVertical -вертикальная
property PageSize: Integer; | Определяет смещение ползунка при нажатии клавиш Page Up, Page Down или при щелчке мышью на концах шкалы
property Position: Integer; | Определяет текущее положение ползунка
property SelEnd: Integer- | Задает конечную позицию выделения
property SelStart: Inte | Задает начальную позицию выделения
ger-property SliderVisible: Boolean-property ThumbLength: Integer; TTickMark = (tmBottomRight, tmTopLeft, tmBoth) ; property TickMarks: TTickMark; TTickStyle = (tsNone, tsAuto, tsManual) ; property TickStyle: TTickStyle; | Определяет, будет ли видимым указатель компонента Определяет длину указателя Определяет способ нанесения меток: tmBottomRight -внизу или справа; tmTopLeft - вверху или слева; tmBottom - по обеим сторонам Определяет стиль нанесения меток: tsNone - нет меток; tsAuto - метки наносятся с частотой Frequence; tsManual - наносятся начальная и конечная метки, остальные наносит программа с помощью метода setTick

С помощью метода

procedure SetTick(Value: Integer);

устанавливается метка в позицию, определяемую значением value.

18.3.6. TProgressBar - индикатор прогресса

Компонент TProgressBar предназначен для отображения хода выполнения длительного по времени процесса. Он имеет много общего с TSrollBar и TTrackBar, но в отличие от них у него нет ползунка, т. е. с его помощью можно только отображать числовую величину, но пользователь не может ее изменять.

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

property Max: Integer; property Min: Integer-property Position: Integers- | Определяет максимальное значение диапазона изменения свойства position Определяет минимальное значение диапазона изменения свойства position Содержит текущее значение отображаемой величины
type TProgressBarOrienta-tion == (pbHorizontal, pbVertical) ; property Orientation: TProgressBarOrientation; | Определяет ориентацию компонента: pbHorizontal - слева направо; pbVertical - снизу вверх
property Smooth: Boolean; | Определяет, будет ли полоса сплошной (True) или сегментированной
property Step: Integer; | Шаг наращивания свойства position методом Stepit

Методы компонента:

procedure StepBy(Delta: Integer); procedure Stepit; | Наращивает значение свойства Position на величину Delta Наращивает значение свойства Position на величину, определяемую свойством step

18.3.7. TUpDown - спаренная кнопка

Компонент TUpDown предназначен для регулирования числовой величины. Он имеет пару кнопок, с помощью которых величина наращивается или уменьшается. Обычно компонент TUpDown связан с другим компонентом класса TEdit, который отображает регулируемую величину и при необходимости может редактировать ее. Связанный компонент называется компаньоном.

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

TUDAlignButton = (udLeft, udRight) ; property AlignButton: TUDAlignButton; | Определяет положение компонента относительно компаньона: udLeft - TUpDown располагается слева от него; udRight - справа от него
property Associate: TWinuontrol; | Определяет связанный компонент. TupDown автоматически располагается с нужной стороны компаньона и выравнивает свою высоту с его высотой
property Increment: Smallint; | Определяет шаг наращивания/уменьшения регулируемой величины
property Max: Smallint; | Определяет максимальное значение диапазона изменения регулируемой величины
property Min: Smallint; | Определяет минимальное значение диапазона изменения регулируемой величины
TUDOrientation = (udHorizontal, udVertical) ; property Orientation: TUDOrientation; | Определяет ориентацию компонента: udHorizontal - по горизонтали; udVertical - по вертикали
property Positior-.: Sallint; | Содержит текущее значение регулируемой величины
property Thousands: Boolean; | Если содержит True, в отображение числовой величины в компаньоне вставляются разделители тысяч
property Wrap: Boolean; | Запрещает/разрешает выход position из диапазона Max...Min (True - запрещает)

Для компонента определены события

type TUDChangingEvent = procedure (Sender: TObject;

var AllowChange: Boolean) of object;

property OnChar.ging: TUDChanginEvent;

И

type TUDBtnType = (btNext, btPrev) ;

type TUDClickEvent = procedure (Sender: TObject; Button:

TUDBtnType) ;

property OnClick: TUDClickEvent;

Первое возникает при любом изменении регулируемой величины. Обработчик события в параметре AllowChange сообщает, может ли величина измениться. Второе - при щелчке по кнопкам элемента. Параметр Button определяет нажатую кнопку: btprev - вниз или влево; btNext - вверх или вправо.

18.3.8. THotKey - ввод акселератора

Компонент THotKey служит для ввода или отображения клавиш быстрого выбора (в терминологии Windows их называют горячими клавишами, или акселераторами). При вводе компонент работает

как специализированный однострочный редактор, который распознает нажатие сдвиговых клавиш Shift, Ctrl и Alt и преобразует их в текст <<shift+x”, “ctrl+x” или “Alt+x”, где х - символ совместно нажатой клавиши. Допускается одновременное нажатие двух или

Трех сдвиговых клавиш: Alt+Shift+X, Ctrl+Shift+Alt+X И Т. П.

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

property AutoSize: Boolean; | Разрешает/запрещает автоматическое изме нение размеров компонента при изменении шрифта, которым отображается текст в нем
type TShortCut = Low(Word)..High(Word) ; property HotKey: TShortCut; | Содержит код клавиши быстрого выбора
type THKInvalidKey = (hcNone, hcShift, hcCtrl, hcAlt, hcCtrlAlt, hcShiftCtrlAlt) ; THKInvalidKeys = set of THKIn validKey; property InvalidKeys: THKInvalid Keys; | Указывает запрещенные комбинации сдвиговых клавиш: hcNone - запрещено отсутствие сдвиговых клавиш; hcShift - запрещена клавиша Shift; hcCtrlAlt -запрещена комбинация Ctrl + Alt и т. д. По умолчанию содержит [hcNone, hcShift]. При вводе запрещенной комбинации она заменяется комбинацией, содержащейся в свойстве Modifier
type THKModifier = (hkShift, hkCtrl, hkAlt, hkExt); THKModifiers = set of THKModi fier; property Modifiers: THKModifiers; | Содержит комбинацию сдвиговых клавиш, которая заменяет собой запрещенную комбинацию. По умолчанию содержит hkAlt, и поэтому нажатие, например, одиночной алфавитно-цифровой клавиши заменяется ее комбинацией с клавишей Alt

18.3.9. TAnimate - отображение анимации

Компонент TAnimate представляет собой проигрыватель видеоклипов формата AVI (Audio Video Interleaved - чередование аудио и видео). Компонент воспроизводит видеочасть файла AVI и игнорирует его звуковое сопровождение. Он способен показывать лишь несжатое изображение или изображение, сжатое по методу RLE (Run-Length Encoding). Изображение воспроизводится в отдельном потоке команд, что освобождает ресурсы программы для выполнения необходимой работы на фоне демонстрации клипа.

Если вы захотите посмотреть компонент в действии (рис. 18.24), выполните следующее:

Рис. 18.24. Демонстрация компонента TAnimate

- Скопируйте файл demos | cool: cool. avi в ваш рабочий каталог (каталог demos распологался в каталоге размещения Delphi).
- На пустую форму положите компоненты Animate, ProgressBar, Timer (страница System) и кнопку BitBtn. Таймер необходим для имитации достаточно длительного по времени процесса, который будет отображаться в ProgressBar на фоне вращающейся надписи “COOL” в компоненте Animate.
- Установите в свойство Enabled компонента Timer1 значение False, а в его же свойство interval - значение 10. Поместите в свойство Visible компонента ProgressBarl значение False и сохраните форму в том же каталоге, куда вы скопировали файл COOL.AVI.
- Создайте такой обработчик события OnClick кнопки BitBtn1:

procedure TForml.BitBtnlClick(Sender: TObject);

begin

Animatel.FileName := 'cool.avi'; // Указываем файл с клипом

Animatel.Active := True; // Запускаем клип

ProgressBarl.Show; // Показываем ProgressBar

Timeri.Enabled := True; // Включаем таймер

end;

- Создайте такой обработчик события onTimer компонента

Timer1:

procedure TFormI.TimerlTimer(Sender: TObject) ;

begin

ProgressBarl.Position := ProgressBarl.Position + 1;

if ProgressBarl.Position >= ProgressBarl.Max then

begin

Timeri.Enabled := False; // Выключаем , таймер

ProgressBarl.Positinr := о; // Готовим новый запуск

ProgressBarl.Hide; // Прячем ProgressBar

Animatel.Stop // Останавливаем клип

end;

end;

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

property Active: Boolean; | Разрешает/запрещает демонстрацию клипа. Во время демонстрации содержит True
property AutoSize: Boolean; | Если содержит True, компонент автоматически устанавливает свои размеры так, чтобы полностью разместить изображение кадра
property Center: Boolean; | Центрирует изображение кадра в границах компонента по горизонтали и по вертикали
TCommonAVI = (aviNone, aviFind- Folder, aviFindFile, aviFindCom- puter, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile) ; property ComrnonAVI: TCommonAVI; | Задает один из стандартных видеоклипов, входящтх в библиотеку SHELL32 . DLL (СМ. рис. 18.25)
property FileName: TFileName; | Связывает компонент с AVI-файлом
property FrameCount: Integer; | Содержит количество кадров, показанных с начала демонстрации клипа
property FrameHeight: Integers; | Высота в пикселях одного кадра клипа
property FrameWidth: Integers; | Ширина кадра
property Open: Boolean; | Содержит True, если компонент связан с AVI-клипом и готов к работе
property Repetitions: Integers; | Определяет количество повторений клипа. Если 0, клип повторяется до тех пор, пока свойство Active содержит True
property ResHandle: THandle; | Указывает дескриптор ресурсного файла, содержащего AVI-клип
property ResHandle: THandle; | Указывает идентификатор ресурса с клипом в ресурсном файле
property ResName: Strings; | Указывает имя ресурса с клипом в ресурсном файле
property StartFrame: Smallint; | Содержит номер начального кадра демонстрации (нумерация кадров начинается с 1)
property StopFrame: Smallint; | Содержит номер конечного кадра демонстрации (нумерация кадров начинается с 1)

property Timers: Boolean; property Transparent: Boolean; | Разрешает/запрещает синхронизацию по таймеру. Если True, демонстрация синхронизируется сигналами таймера. Если False, для демонстрации используется независимый поток команд Если содержит True, фон клипа не накладывается на фон компонента

С помощью свойства commonAvi можно заставить компонент показывать один из стандартных видеоклипов, показанных на рис. 18.25.

Рис. 18.25 . Видеоклипы свойства Соmmоn АVI

Методы компонента:

procedure Play(FromFrame, ToFrame: Word; Count: Integer); | Демонстрирует Count раз подряд фрагмент клипа, начиная с кадра FromFrame по ToFrame включительно (нумерация кадров начинается с 1)
procedure Reset; procedure Seek(Frame: Smallint) ; procedure Stop; | Восстанавливает исходное состояние компонента. Свойство Open вновь становится True, но свойство Active = False Пропускает и не показывает кадр с номером Frame (нумерация кадров начинается с 1) Прекращает показ клипа
Для компонента определены следующие события:
property OnClose: TNotifyEvent; property OnOpen: TNoti-fyEvent; property OnStart: TNoti-fyEvent; property OnStop: TNotifyEvent; | Возникает при установке значения False в свойство Open. Например, когда компонент демонстрирует несколько видеоклипов подряд Возникает при установке значения True в свойство Open Возникает в момент начала демонстрации Возникает в момент прекращения демонстрации

18.3.10. TDateTimePicker - ввод и отображение даты/времени

Компонент предназначен для ввода и/или отображения даты или времени. На рис. 18.26 показаны различные варианты использования компонента.

Рис. 18.26. Примеры использования компонента TDateTimePicker

При показе даты в режиме DateMode=dmComboBox календарь можно не раскрывать и установить дату вручную в верхнем окне. Это удобно, если нужно установить сразу и день, и месяц, и год. На раскрытом календаре изменить месяц можно небольшими кнопками вверхней части компонента. Календарь закрывается после выбора даты или при щелчке по раскрывающей кнопке. Установив в свойство Kind значение dtkTime, можно заставить компонент отображать время (справа на рисунке). Это время в момент установки компонента на форму соответствует системному времени, и в дальнейшем его можно изменить, задав новое значение в свойство Time.

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

TDTCalAlignment = (dtaLeft, dtaRight) ; | Определяет положение раскрывающегося календаря: dtaLeft - слева от компонента;
property CalAlignment: TDTCalAlignment; | dtaRight - справа от компонента. Учитывается только ДЛЯ Kind = dtkDate и Date-Mode = dmComboBox
property CalColors: TDateTimeColors; | С календарем связан объект класса TDateTimeColors, свойства которого определяют цвета календаря
property Checked: Boolean; | Если Checked=True И ShowCheckBox=True, независимый переключатель рядом с датой (временем) будет иметь состояние Выбрано
property Date: TDate;TDTDateFormat = (dfShort,dfLong) ; property DateFormat: TDTDateFormat; | Содержит введенную дату Определяет формат показа даты: df short -08. 09. 99; dfLong-8 Сентябрь 1999г.
TDTDateMode = (dmComboBox, dmUpDown) ; property DateMode: TDTDateMode; | Определяет способ выбора даты: dmComboBox - с помощью раскрывающегося ка лендаря; dmUpDown - с помощью встроенного объекта TupDown
property Format: String; | Определяет формат вывода даты и времени (см. табл. 7.8 в гл. 7)
TDateTimeKind = (dtkDate, dtkTime); property Kind: TDateTimeKind; | Определяет содержимое компонента: dtkDate -дата; dtkTime - время
property MaxDate: TDate; | Определяет максимальную дату, которую может выбрать иди ввести пользователь
property MinDate: TDate; | Определяет минимальную дату, которую может выбрать или ввести пользователь
property Parselnput: Boolean; | Если True, возникает событие OnUserlnput при каждом вводе пользователя в окне редактора
property ShowCheckbox: Boolean; | Если True, рядом с датой (временем) вставляется независимый переключатель
property Time: TTime; | Содержит введенное пользователем время

Для компонента определены следующие события:
property OnChange: TNotifyEvent; | Возникает при любом изменении содержимого компонента
property OnCloseUp: TNotifyEvent; | Возникает при закрытии календаря
property OnDropDown: TNotifyEvent; | Возникает при открытии календаря
TParseInputEvent = procedure (Sender: TObject; const User-String: String” var DateAndTime: TDateTime; var AllowChange: Boolean) of objects-property OnUserInput: TDTParseIn-putEvent; | Возникает при ручном вводе в окне редактора, если ParseInput=True.UserString -введенная пользователем строка; DateAndTime - значения свойств Date и Time. В параметре AllowChange обработчик разрешает или запрещает изменение даты или времени

18.3.11. TMonthCalendar - календарь

Как видно из рисунка слева, компонент предназначен для выбора или отображения даты. Он очень похож на календарь, который появляется В компоненте TDateTimePicker (при значении dmComboBox В свойстве DateMode), но в отличие от последнего может отображать одновременно несколько смежных месяцев - в зависимости от своих размеров.

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

property CalColors: TMonthCalColors; | С компонентом связан объект класса TMonthCalColors, имеющий такие свойства:BackColor - определяет цвет фона, разделяющего смежные месяцы; MonthBackColor- цвет фона дат; TextColor - цвет дат; TitIeBackColor - цвет фона заголовка месяца: TitleTextColor - цвет текста заголовка; TrailingTextColor - цвет текста ведущих и ведомых дат
property Date: TDate; | Определяет выбранную дату
property EndDate: TDate; | Определяет конечную дату диапазона вы бранных дат
type TCalDayOfWeek = (dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday, dowSunday, dowLocaleDefault) ; property FirstDayOfWeek: TCalDay OfWeek; | Определяет первый день недели
property MaxDate: TDate; | Содержит максимальную дату, месяц которой еще будет доступен для отображения в компоненте. Если свойство содержит пустое значение, отображается любой следующий месяц
property MaxSelectRange: Integer; | Содержит максимальное количество дат в выбранном диапазоне
property MinDate: TDate; property MultiSelect: Boolean; property ShowToday: Boolean; property ShowTodayCircle: Boolean; property WeekNumbers: Boolean; | Содержит минимальную дату, месяц которой еще будет доступен для отображения в компоненте. Если свойство содержит пустое значение, отображается любой предыдущий месяц Разрешает/запрещает выбор диапазона дат Разрешает/запрещает показ текущей даты (по показаниям системных часов) внизу календаря Разрешает/запрещает обводить кружком текущую дату Разрешает/запрещает показ порядковых номеров недель от начала года в левой колонке

18.3.12. TTreeView - дерево иерархии

Компонент TTreeView служит для показа ветвящихся иерархических структур, таких как дерево наследования объектов или файловая структура диска. Он содержит связанные узлы, каждый из которых может содержать пиктограмму, текст и произвольный объект (подобно спискам TStringList - см. п. 14.3.2). Любой узел может иметь собственный список подузлов (рис. 18.27), которые можно раскрывать или закрывать щелчком мыши на пиктограмме узла.

Рис. 18.27. Пример использования компонента TTreeView

Для наполнения списка на этапе конструирования программы нужно щелкнуть по компоненту правой кнопкой мыши и выбрать Items Editor., либо щелкнуть по нему дважды, либо, наконец, щелкнуть по кнопке в свойстве Items - во всех случаях на экране появится окно редактора компонента (рис. 18.28).

Рис. 18.28. Редактор компонента

Чтобы начать наполнение, щелкните по кнопке New item и введите связанный с узлом текст в поле Text. С помощью image index панели item properties устанавливается индекс связанной с узлом пиктограммы, с помощью selected index - индекс пиктограммы для выбранного узла. Для ввода подузла любого уровня сначала нужно щелкнуть в окошке Items по узлу, который должен стать родительским, и лишь затем - на кнопке New subitem.

Для ввода списка в режиме прогона программы широко используется центральное свойство компонента - items типа TTreeNodes, открывающее индексированный доступ ко всем узлам списка. Каждый узел описывается классом TTreeNode, имеющим свои собственные методы и свойства. В частности, его свойство item содержит список всех подузлов данного узла; с помощью многочисленных методов свойства TTreeview. items к этому списку можно добавить новый подузел, а с помощью метода TTreeNode. MoveTo - переместить узел в любую позицию дерева иерархии.

Следующий обработчик события oncreate формы создал рис. 18.29:

procedure TForm1.PormCreate(Sender: TObject) ;

var

k: Integer;

begin with TreeViewl do

begin

// Добавляем корневой узел

Items.Add (NIL,' Корень') ;

//Добавляем 10 вложенных узлов

for k := 1 to 10 do

Items.AddChild(Items[k-1],IntToStr(k))

end

end;

Puc. 18.29. Создание подузлов на этапе прогона программы

Свойства компонента TTreeview:

lean;TBorderStyle = bsNone..bsSingle; property BorderStyle: TBorderStyle; | Определяет стиль рамки, охватывающей компонент: bsNone - нет рамки; bsSingle - рамка толщиной в 1 пиксель
property ChangeDelay: Integer; | Указывает задержку (в миллисекундах) перед раскрытием узла
property DropTarget: TTreeNode; | Указывает узел, который может служить приемником операций Drag&Drop
property HideSelection:Boolean; | Указывает, будет ли убираться выделение узлов, когда компонент теряет фокус ввода
property Images: TImageList; | Содержит набор изображений, которые будут использоваться при прорисовке узлов
property Indent: Integer; | Определяет отступ в пикселях от левого угла узла для всех его подузлов
property Items: TTreeNodes; | Открывает доступ к любому узлу по его индексу. Индексация начинается с нуля и соответствует просмотру всех узлов полностью раскрытого списка
property MultiSelect: Boo lean; | Разрешает/запрещает одновременный выбор несколь ких узлов
type TMultiSelectStyles = (msControlSel-ect, msShift Select, msVisibleOnly, msSiblingOnly) ; TMultiSelectStyle = set of TMultiSelectStyles; property MultiSelectStyle: TMultiSelect-Style default [msControlSelect]; | Определяет способ выбора нескольких узлов: msControiselect - с нажатой и удерживаемой клавишей Ctrl для выбора узлов в произвольном порядке; msShiftSelect - с нажатой и удерживаемой клавишей Shift для выбора сплошного диапазона; msVisibleOnly - подобно msShiftSelect, но в диапазон не включаются дочерние нераскрытые узлы; msSiblingOnly - подобно msShiftSelect, но в диапазон включаются только узлы одного уровня
property Readonly: Boolean; | Запрещает/разрешает редактирование надписей в узлах
property RightClickSelect: Boolean; | Разрешает выбор узлов правой кнопкой мыши
property Selected: TTreeNode; | Содержит список всех выбранных узлов или nil, если таких нет
property SelectionCount: Cardinal; | Содержит количество выбранных узлов
property Selections[Index: Integer]: TTreeNode; | Обеспечивает индексированный доступ к выбранным узлам
property RowSelect: Boolean; | Разрешает цветовыделение линий выбранных узлов. Игнорируется, если showLinesFalse
property ShowButfcons: Boolean; | Разрешает/запрещает показ стандартных кнопок раскрытия подузлов. По умолчанию содержит True. Если False, узел раскрывается двойным щелчком мыши
property ShowLines: Boolean; | Разрешает/запрещает показ линий
property ShowRoot: Boolean; | Разрешает/запрещает показ линий, идущих от самого верхнего уровня иерархии. Игнорируется, если ShowLines=False
TSortType = (stNone, stData, stText, stBoth) ; property SortType: TSort Type; | Указывает способ сортировки узлов: stNone - нет сортировки; stData - сортировка по данным; stText - сортировка по тексту надписей; stBoth - сортировка по тексту и по данным. См. также событие OnCompare
property Topitern: , TTreeNode; | Определяет корневой узел
Методы компонента:

function AlphaSort: Boolean; TTVCompare = function (IParamI, lParam2, IParamSort: Longint) Integer stdcall; tfunction CustomSort(SortProc: TTVCompare; Data: Longint): Boolean; | Сортирует узлы по тексту и возвращает True, если сортировка прошла успешно Определяет нестандартную сортировку с помощью функции SortProc. Эта функция должна рассматривать IParamI и lParam2 как объекты TTreeNode и возвращает отрицательное число, если lParaml<lParam2; ноль, если IParamel^lParamS; положительное число, если lParaml>lParam2
procedure FullCollapse; | Прячет все узлы, кроме узлов самого верх него уровня иерархии
Procedure FullExpand; | Показывает все узлы дерева иерархии

function GetNodeAt(X, Y: Integer) : TTreeNode; | Возвращает узел, располагающийся в указанной точке, или nil, если точка не принадлежит ни одному узлу
function IsEditing: Boolea' | Возвращает True, если пользователь редактирует какой-либо узел
procedure LoadPromFile(const FileName: String); | Загружает дерево иерархии из файла
procedure SaveToFile(const File Name: String) ; | Сохраняет в файле дерево иерархии
procedure SaveToStream(Stream: TStream) ; | Сохраняет в потоке данных дерево иерархии события: С компонентом связаны такие
TTVChangedEvent = procedure(Sender: TObject; Node: TTreeNode) of object; property OnChange: TTVChangedE vent; | Возникает при смене состояния выбора у одного из узлов. Node - узел, который изменил состояние
TTVChangingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowChange: Boolean) of objectproperty OnChangir.g: TTVChang ingEvent; | Возникает перед сменой состояния выбора у одного из узлов. Node - узел, который будет выбран. Обработчик в параметре AllowChange разрешает или запрещает выбор узла
TTVExpandedEvent = procedure( Sender: TObject; Node: TTreeNode) of object;property OnCollapsed: TTVExpand edEvent; | Возникает при закрытии списка подузлов узла Node
TTVCollapsingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean) of object; property OnCollapsing: TTVCollapsingEvent; | Возникает перед закрытием списка подуз лов узла Node. В параметре AllowCollapse обработчик разрешает или запрещает закрыть список
TTVCompareEvent = procedure( Sender: TObject; Nodel, Node2: TTreeNode; Data: Integer; var Compare: Integer) of object; property OnCompare: TTVCom pareEvent; | Возникает при сравнении двух узлов Nodel И Node2. В параметре Compare обработчик должен вернуть отрицательное число, если Nodel<Node2; ноль, если Model=Node2; положительное число, если Nodel>Node2
TTVExpandedEvent = procedure( Sender: TObject; Node: TTreeNode) of object; property OnDeletion: TTVExpand edEvent; | Возникает при удалении узла Node из дерева иерархии
TTVEditedEvent = procedure(Sender: TObject; Node: TTreeNode; var S: String) of object; property OnEdited: TTVEditedEvent; | Возникает при завершении редактирования надписи в узле Node: S - новая надпись
TTVExpandedEvent = procedure( Sender: TObject; Node: TreeNode) of object; property OnExpanded: TTVExpand edEvent; | Возникает при распахивании списка подузлов узла Node
TTVExpandingEvent = procedure( Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean) of object; property OnExpanding: TTVExpand ingEvent; | Возникает перед открытием списка подузлов узла Node. В параметре AllowExpansion обработчик разрешает или запрещает открыть список
TTVExpandedEvent = procedure( Sender: TObject; Node: TreeNode) of object;property OnGetImageIndex: TTVEx pandedEvent; | Возникает при необходимости получения индекса изображения для прорисовки узла Node в обычном состоянии
TVExpandedEvent == procedure( Sender: TObject; Node: TTreeNode) of object; property OnGetSelectedIndex: TTVExpandedEvent; | Возникает при необходимости получения индекса изображения для прорисовки узла Node в выбранном состоянии

При программном заполнении списка следует пользоваться свойством TTreeView. Items класса TTreeNodes.

Свойства класса TTreeNodes:

property Count: Integer; property Item[Index: Integer]: TTreeNode; default-property Owner: TCustomTreeView; | Количество узлов, входящих в items Открывает индексированный доступ к узлам Содержит ссылку на родительский список
Методы класса TTreeNodes:
function Add(Node: TTreeNode; const S: String): TTreeNode; function AddChild(Node: TTreeNode; const S: String): TTreeNode; function AddChildFirst(Node: TTreeNode; const S: String): TTreeNode; function AddChildObject(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; function AddChildObjectFirst( Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Добавляет узел в конец того списка, в котором зарегистрирован узел Node. Если Node=NlL, добавляется корневой узел для всего компонента Добавляет узел в конец списка item дочерних узлов узла Node Добавляет узел в начало списка Item дочерних узлов узла Node Добавляет узел и данные в конец списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка Добавляет узел и данные в начало списка item дочерних узлов узла Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
function AddFirst(Node: TTreeNode; const S: String): TTreeNode; | Добавляет узел в начало того списка, в котором зарегистрирован узел Node
function AddObject(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Добавляет узел и данные в конец того же списка, в котором зарегистрирован узел Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
function AddObjectFirst(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Добавляет узел и данные в начало того же списка, в котором зарегистрирован узел Node. На данные ссылается указатель Ptr. Связанная с данными область памяти не освобождается автоматически при уничтожении списка
procedure Assign(Source: TPersistent) ; | Связывает список текущего компонента со списком компонента Source
procedure BeginUpdate; | Блокирует обновление экрана до тех пор, пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана
procedure Clear; | Очищает список всех узлов и подузлов компонента
procedure Delete(Node: TTreeNode); | Уничтожает узел Nods
procedure EndUpdate; | Отменяет действие метода BeginUdate
function GetFirstNode: TTreeNode; | Возвращает самый первый узел в списке Items[0]
function GetNode(Itemid: HTreeItem): TTreeNode; | Возвращает узел по его идентификатору Itemid
function Insert(Node: TTreeNode; const S: String): TTreeNode; | Вставляет узел непосредственно перед узлом Node
function InsertObj ect(Node: TTreeNode; const S: String; Ptr: Pointer): TTreeNode; | Вставляет узел и данные непосредственно перед узлом Node

Как уже отмечалось, каждый узел класса TTreeNode имеет свой набор методов, свойств и событий.

Свойства TTreeNode:

property Absolutelndex: Integer; | Возвращает абсолютный индекс узла (с учетом всех подузлов)
property Count: Integer; | Содержит количество подузлов в списке Item
property Cut: Boolean; | Вырезает узел и помещает его в clipboard
property Data: Pointer; | Указывает на связанные с узлом данные
property Deleting: Boolean; | Содержит True, если для узла вызван De-story
property DropTarget: Boolean; | Содержит True, если узел может служить приемником операции Drag&Drop
property Expanded: Boolean; | Содержит True, если узел распахнут
property Focused: Boolean; | Содержит True, если узел сфокусирован
property HasChildren: Boolean; | Содержит True, если узел имеет дочерние узлы
property Imagelndex: TImageIndex; | Содержит индекс связанной с узлом пиктограммы
property Index: Longint; | Содержит индекс узла в списке дочерних узлов его родительского узла
property IsVisible: Boolean; | Содержит True, если узел виден
property Item[Index: Integer]: TTreeNode; | Открывает индексированный доступ ко всем дочерним узлам
property Itemid: HTreeItem; | Содержит уникальный Windows-дескриптор узла
property Level: Integer; | Содержит иерархический уровень узла
property Overlaylndex: Integers- | Содержит индекс оверлейной пиктограммы. Оверлейная пиктограмма вычерчивается поверх основной, чтобы, например, указать, что узел стал недоступен
property Owner: TTreeNodes; | Содержит ссылку на владельца данного узла
property Parent: TTreeNode; | Содержит ссылку на родительский узел
property Selected: Boolean; | Содержит True, если узел выделен цветом
property Selectedlndex: Integer; | Содержит номер пиктограммы для выделенного узла
property Text: Strings- | Содержит текст узла
property TreeView: TCustomTree- View; | Содержит ссылку на компонент TreeView, к которому принадлежит узел

Методы класса TTreeNode:

function AlphaSort: Boolean; | Сортирует узлы по алфавиту свойств Text и возвращает True в случае успеха
procedure Assign(Source: TPersis tent); override; | Связывает список подузлов с источником Source
procedure Collapse(Recurse: Boolean) ; | Закрывает все узлы (Recource=True) или только распахнутые(Resource=False)
type TTVCompare = function( IParamI, lParam2, IParamSort: Longint): Integer stdcall; func tion CustomSort(SortProc: TTVCom pare; Data: Longint): Boolean; | Реализует нестандартную сортировку узлов
procedure Delete; | Удаляет текущий узел
procedure DeleteChildren; | Удаляет дочерние узлы
function DisplayRect(TextOnly: Boolean): TRect; | Возвращает очерчивающий прямоугольник узла. Если TextOnly=True - возвращает очерчивающий прямоугольник текста
function EditText: Boolean; | Переводит текст узла в режим редактирования
procedure EndEdit(Cancel Boo lean) ; | Заканчивает редактирование текста и со храняет его изменения, если Cancel=False
procedure Expand(Recurse: Boo lean) ; | Открывает узел (и его подузлы, если Recurce=True)
function GetFirstChild: TTreeNode; | Возвращает ссылку на первый подузел или nil, если нет подузлов
function GetLastChild: TTreeNode; | Возвращает ссылку на последний подузел или nil, если нет подузлов
function GetNext: TTreeNode; function GetNextChild(Value: TTreeNode): TTreeNode; | Возвращает ссылку на очередной подузел dозвращает ссылку на подузел после value (или nil, если такового нет).
function GetNextSibling: TTreeNode; | Возвращает ссылку на очередной узел в том же списке.
function GetNextVisible: TTreeNode; | Возвращает ссылку на очередной видимый узел (для которого раскрыты все дочерние узлы)
function GetPrev: TTreeNode; | Возвращает ссылку на предыдущий узел в том же списке независимо от его видимости
function GetPrevChild(Value: TTreeNode): TTreeNode; | Возвращает ссылку на предыдущий по отношению к value дочерний узел
function GetPrevSibling: TTreeNode; | Возвращает ссылку на предыдущий узел того же уровня
function GetPrevVisible: TTreeNode; | Возвращает ссылку на видимый узел того же уровня
function HasAsParent(Value: TTreeNode): Boolean; | Возвращает True, если value - родительский узел
function IndexOf(Value: TTreeNode): Integer; | Возвращает идентификатор узла value
procedure MakeVisible; | Если родительский узел видимый, делает видимыми все дочерние узлы
type TNodeAttachMode = (naAdd, naAddFirst, naAddChild, naAddChildFirst, nalnsert) ; procedure MoveTo(Destination: TTreeNode; Mode: TNodeAttach Mode) ; | Перемещает текущий узел в позицию относительно Destination в зависимости от параметра Mode: naAdd - добавляет в конец списка узла того же уровня; naAddFirst - делает первым в списке узлов того же уровня; naAddchild - добавляет в конец списка дочерних узлов; naAddChildFirst -делает первым в списке дочерних узлов; nalnsert - вставляет непосредственно перед узлом

18.3.13. TListView - список просмотра

Компонент TListView предназначен для показа и выбора нескольких элементов. Каждый элемент может содержать пиктограмму и текст и подобно TTreeView иметь список связанных с ним подэлементов. В отличие от TTreeview в TListView допускается не более одного уровня вложенности подэлементов. TListView показывает свои элементы в одной или нескольких колонках, с крупными или мелкими пиктограммами, а также в виде “отчетов”, представляющих элементы в двухмерной таблице: по вертикали изображаются элементы верхнего уровня, по горизонтали - вложенные подэлементчатели, упрощающие множественный выбор элементов.

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

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

На Пустую форму положите компоненты TListView, TImageList, TComboBox И TCheckBox.

- Компонент ImageList1 будет служить контейнером для нескольких пиктограмм, отображаемых компонентом Listview. Для наполнения контейнера дважды щелкните по нему мышью или нажмите на нем правую кнопку и выберите продолжение ImageList Editor.
- В появившемся окне редактора imageList нажмите кнопку Add и выберите файл images | ICONS | CHEMICAL[ См. замечание в начале главы. ].
- Повторите п. 3 для выбора нескольких пиктограмм. Обратите внимание, что каждой помещаемой в imageListi пиктограмме редактор присваивает уникальный индекс.
- Напишите такой обработчик события oncreate для формы:

procedure TForm1.FormCreate(Sender: TObject);

var

k: Integer;

Listltem: TListItem;

begin

with ListView1 do

begin

// Указываем источник изображений:

Smalllmages := ImageList1;

Largelmages := ImageList1;

// Наполняем ListViewl пиктограммами и текстом:

for k := 0 to ImageListI.Count - 1 do

begin

// Добавляем элемент и получаем ссылку на него

Listltem := Items.Add;

// Указываем индекс связанного изображения

Listltem.Imagelndex := k;

// Вставляем надпись ImageN

Listltem.Caption := 'Image' + IntToStr(k);

end;

// Наполняем список ComboBoxl доступными стилями ListView ComboBoxl.Items.AddObject('vslcon', TObject(vslcon)) ;

ComboBoxl.Items.AddObject('vsLisf, TObject (vsList)) ;

ComboBoxl.Items.AddObject('vsReporf, TObject(vsReport)) ;

ComboBoxl.Items.AddObject('vsSmall Icon',

TObject(vsSmallIcon)) ;

// Показываем первый стиль в Combo Box

ComboBoxl.Itemlndex := 0;

// Создаем колонку для режима vsReport:

Columns.Add; Columns[0].Caption := 'Колонка T;

Columns [.0 ] .Width := 80;

end;

end;

- Напишите такие Обработчики событий ComboBoxl.OnChange И A. CheckBoxl.Click:

procedure TFormI.ComboBoxIChange(Sender: TObject);

begin

with ComboBoxl do

ListViewl.ViewStyle := TViewStyle(

I terns.Objects[Itemlndex]) ;

end;

procedure TFormI.CheckBoxIClick(Sender: TObject);

begin

ListViewl.CheckBoxes := CheckBoxl.Checked

end;

Некоторые важные свойства компонента:

property AllocBy: Integer; | Используется перед вставкой большого количества элементов: для экономии времени и памяти перед добавлением установите в это свойство количество добавляемых элементов
property Checkboxes: Boolean; | Разрешает/запрещает показ независимых переключателей рядом с элементами
property Column[Index: Integer]: TListColumn; | Открывает доступ к колонкам элементов по их индексам
property ColumnClick: Boolean; | Разрешает/запрещает генерацию события OnColumnClick
property Columns: TListCoiumns; | Содержит объект-колонки. Используйте это свойство для удаления или добавления колонок, а также для изменения их свойств. Колонки видны только для режима View-Style = vsReport. И наоборот: элементы в этом режиме видны, только если определена хотя бы одна колонка
property GridLines: Boolean; | Разрешает/запрещает показ линий в режиме ViewStyle = vsReport
property HideSelection: Boolean; | Запрещает/разрешает сохранять выбор элементов при потере компонентом фокуса ввода
property HotTrack: Boolean; | Разрешает/запрещает подсветку элементов, над которыми проходит указатель мыши
property IconOptions: TIconOptions; | С помощью объекта класса TiconOptions задаются дополнительные условия отображения (см.ниже)
property Items: TListItems; | Содержит список всех элементов
property Largelmages: TImageList; | Указывает источник крупных пиктограмм
property MultiSelect: Boolean; | Разрешает/запрещает множественный выбор
property Readonly: Boolean; | Запрещает/разрешает редактирование надписей
property ShowColumnHeaders: Boolean; | Разрешает/запрещает показ заголовков колонок в режиме ViewStyle = vsReport
property Smalllmages: TImageList; TSortType = (stNone, stData, stText, stBoth) ; property SortType: TSortType; | Указывает источник мелких пиктограмм Указывает способ сортировки элементов
property Statelmages: TImageList; | Указывает источник пиктограмм для вы бранных элементов
TViewStyle = (vslcon, vsSmallI- con, vsList, vsReport) ; property ViewStyle: TViewStyle; | Определяет стиль показа элементов: vslcon - крупные пиктограммы; vsSmalllcon - мелкие пиктограммы; vsList - список пиктограмм; vsReport - таблица пиктограмм

Обратите внимание: чтобы компонент работал в режиме vsReport, необходимо создать хотя бы одну колонку. На этапе конструирования программы колонки создаются и изменяются с помощью редактора колонок, окно которого открывается после щелчка по компоненту правой кнопкой и выборе в локальном меню опции

Column Editor. Пример программного создания колонки показан на стр.483.

Класс TIconOption определяет дополнительные условия отображения узлов и имеет такие свойства:

type TIconArrangement = (iaTop, iaLeft) ; property Arrangement: TIconArrangement; property AutoArrange: Boolean; property WrapText: Boolean; | Показывает способ расположения изображения: iaTop - слева направо (вверху колонки); iaLeft - сверху вниз слева от ряда колонок Если содержит True, элементы будут автоматически располагаться правильными рядами при изменении их количества Если содержит True, текст элемента может переноситься на границах слов на несколько строк, если он выходит за границы пиктограммы

При программном заполнении компонента центральную роль играет свойство Items класса TListItems.

Свойства класса TListItems:

property Count: Integers-property Item[Index: Integer]: TListItem; | Содержит количество элементов в item Открывает индексный доступ к элементам списка
Методы класса TListItems:
function Add: TListItem; procedure Assign(Source: TPersis-tent); override; procedure BeginUpdate; procedure Clear; procedure Delete(Index: Integers-procedure EndUpdate;” function IndexOf(Value: TListItem) : Integers-function Insert(Index: Integer): TListItem; procedure SetCount(Value: Integer) ; | Добавляет очередной элемент к списку Связывает список компонента со списком компонента source Блокирует обновление экрана до тех пор, пока не будет выполнен метод EndUpdate. Используется при одновременной вставке нескольких элементов списка для предотвращения мерцания экрана Очищает список Удаляет элемент списка с индексом index Отменяет действие BeginUpdate Возвращает индекс узла value Вставляет новый элемент после элемента, заданного индексом index Устанавливает новое количество компонентов списка

Свойство item типа TListItem открывает индексированный доступ к подэлементам конкретного элемента верхнего уровня (допускается только два уровня иерархии элементов). За информацией по этому классу обратитесь к справочной службе Delphi.

18.3.14. THeaderControl - управляющий заголовок

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

В программе, окно которой показано на рис. 18.30, компонент THeaderControl используется для управления положением и линейными размерами трех других компонентов. Для реализации программы выполните следующее:

- Положите на пустую форму компоненты THeaderControl, ТЕ-dit, TMemo и TButton. По умолчанию HeaderControll .Align =alTop - убедитесь в этом и установите свойство, если это не так. Положение и размеры других компонентов не имеют значения.
- Создайте такие обработчики событий OnCreate для формы Form1, а также OnResize и OnSectionResize для компонента HeaderControll:

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

const

Delta = 10;// Зазор между границами заголовка и компонентами

procedure TFormI.FormCreate(Sender: TObject);

var

HSection: THeaderSection;

k: Integer;

begin

// Создаем три секции заголовка:

with HeaderControll do

for k := 0 to 2 do

begin

HSection := Sections.Add;

HSection.Text := 'Секция №' + IntToStr(k);

HSection.Width := Forml.Width div 3;

HSection.MinWidth := 3 * Delta;

end;

end;

procedure Tform1.HeaderControllResize(Sender: TObject);

// Устанавливает положение и размеры компонентов

begin

with HeaderControll do

begin

Editl.Left := Delta;

Editl.Top := HeaderControll.Height + 1;

Editl.Width := Sections.Items[0].Width - 2 * Delta;

Memol.Left := Sections.Items[1].Left + Delta;

Memol.Top := HeaderControll.Height + 1;

Memol.Width := Sections.Items[1].Width - 2 * Delta;

Buttonl.Left := Sections.Items[2].Left + Delta;

Buttonl.Top := HeaderControll.Height + 1;

Buttonl.Width := Sections.Items[2].Width - 2 * Delta;

end

end;

procedure TFormI.HeaderControllSectionResize(

HeaderControl: THeaderControl; Section: THeaderSection);

begin

HeaderControllResize(Self)

end;

He забудьте определить в области видимости обработчиков FormCreate И HeaderControllResize глобальную константу Delta.

Для заголовка создается объект класса THeadersections, определяющий секции заголовка. Его свойство

property Items[Index: Integer]: THeaderSection;

открывает доступ к индексированным объектам-секциям класса THeaderSection. Свойства класса THeaderSection:

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

Метод function THeaderSections.Add: THeaderSection;

добавляет очередную секцию заголовка. Некоторые свойства класса THeaderSection:

property AllowClick: Boolean-property DisplayName: String; property Imagelndex: TImageIndex; | Если содержит True, разрешает щелкнуть по секции заголовка как по кнопке. В этом случае управление передается в обработчик события OnSectionClick Имя заголовка секции Указывает индекс изображения из хранилища images, которое будет появляться следом за текстом заголовка
property MaxWidth: Integer; property MinWidth: Integer; type THeaderSectionStyle == (hsText, hsOwnerDraw) ; | Определяет максимальную и минимальную ширину секции Определяет тип секции: hsText - секция содержит только текст; hsOwnerDraw - секция нуждается в программной прорисовке
property Style: THeaderSectionStyle; property Text: String; | Содержит текст секции

Свойства Компонента THeaderControl:

property Canvas: TCanvas; | С помощью этого свойства можно изображать графику в секциях заголовка
property HotTrack: Boolean; | Разрешает/запрещает цвето выделение секции, над которой располагается указатель мыши
property Sections: THeaderSections; | Содержит секции заголовка

Для компонента определены следующие события:

TDrawSectionEvent = procedure( Header-Control: THeaderControl; Section: THeaderSection; const Rect: TRect; Pressed: Boolean) of object; property OnDrawSection: TDrawSectionEvent; | Возникает при необходимости прорисовать секцию, для которой установлен СТИЛЬ hsOwnerDraw: Section - объект-секция; Rect - прямоугольник прорисовки;Pressed -признак нажатой кнопки мыши
property OnResize: TNotifyEvent; TSectionNotifyEvent = procedure( Head- erControl: THeaderControl; Section: THeaderSection) of object; property OnSectionCli.ck: TSectionNoti fyEvent; | Возникает при изменении размеров компонента возникает при щелчке мышью по секции Section
TSectionNotifyEvent = procedure( Head- erControl: THeaderControl; Section: THeaderSection) of object; property OnSectionResize: TSectionNo tifyEvent; | Возникает при изменении размеров секции Section
TSectionTrackState = (tsTrackBegin, tsTrackMove, tsTrackEnd) ; TSectionTrackEvent = procedure( Head- erControl: THeaderControl; Section: THeaderSection; Width: Integer; State: TSectionTrackState) of objects- property OnSectionTrack: TSection TrackEvent; | Возникает при изменении размеров секции и позволяет обработать три возможных состояния: tsTrackBegin - начало переме щения границы;tsTrackMove - идет перемещение границы; tsTrackEnd - конец перемещения границы

18.3.15. TStatusBar - информационная панель

Компонент TStatusBar предназначен для создания панелей состояния, которые обычно располагаются в нижней части основной формы. Компонент может иметь несколько секций, а также кнопку изменения размеров окна, в которое он помещен.

Рис. 18.31 . Пример компонента с тремя панелями и кнопкой изменения размеров окна

На рис. 18.31 показан компонент TStatusBar с тремя панелями и кнопкой изменения размеров окна, созданный таким обработчиком события OnCreate для формы Form1(предварительно на пустую форму положите компонент TSatusBar):

procedure TFormI.FormCreate(Sender: TObject);

var

Panel: TStatusPanel;

k: Integer;

begin

with StatusBarl do

for k := 0 to 2 do

begin

Panel := Panels.Add;

Panel.Text := 'Панель №' + IntToStr(k);

Panel.. Width := Forml. Width div 3

end;

end;

С компонентом связывается объект класса TStatusPanels, который определяет панели компонента. Каждая панель относится к классу TstatusPanel и имеет такие свойства:

property Alignment: TAlignment; | Определяет выравнивание текста относительно границ секции; taLeftJustify: прижимается влево; taCenter - центрируется по горизонтали; taRightJustify - прижимается вправо
property Bevel: TStatusPanel-Bevel; | Определяет стиль рамки секции: pbNone -нет рамки; pbLowered - вдавленная рамка; pbRaised - приподнятая рамка
type TStatusPanelStyle = (psText, psOwnerDraw); property Style: TStatusPanelStyle; property Text: String; property Width: Integer; | Определяет способ формирования изображения панели: psText - панель содержит только текст и изображается автоматически; psOwnerDraw - панель прорисовывается программой Определяет текст надписи в секции Определяет ширину секции в пикселях
Свойства компонента TStatusBar:
property Canvas: TCanvas; | Канва для прорисовки панелей
property Panels: TStatusPanels; | Содержит объекты-панели. Свойство TStatusPanels.items [index: Integer]: TStatusPanei открывает доступ к панели по ее индексу
property SimplePanel: Boolean; | Запрещает/разрешает создание нескольких панелей. Если содержит True, компонент имеет единственную панель
property SimpleText: String; | Содержит текст панели для sim-plePanel=True
property SizeGrip: Boolean; | Разрешает/запрещает вставку кнопки изменения размеров окна. Игнорируется, если AlignoalBottom
Для компонента определены такие события:
TDrawPanelEvent = procedure( StatusBar: TStatusBar; Panel: TStatusPanei; const Rect: TRect) of object-property OnDrawPanel: TDrawPanelEvent; | Возникает при необходимости прорисовки панели Panel, если ее свойство Style определено как psOwnerDraw: Rect - прямоугольник прорисовки
Property OnResize: TNo.tifyEvent; | Возникает при изменении размеров компонента

18.3.16. TToolBar и ToolButton - инструментальная панель и кнопки для нее

Компонент TToolBar представляет собой специальный контейнер для создания инструментальных панелей. Главная отличительная черта TToolBar - его способность гибкого управления дочерними элементами, которые он может группировать, выравнивать по размерам, располагать в несколько рядов. Компонент может манипулировать любыми вставленными в него дочерними элементами, но все его возможности в полной мере проявляются только со специально для него разработанным компонентом TToolButton (инструментальная кнопка). Этот компонент похож на кнопку TSpeedButton, но не ищите его в палитре компонентов - его там нет. Поскольку он разработан специально для TToolBar, вставить его в инструментальную панель можно только после щелчка правой кнопкой на компоненте TToolBar и выборе NewButton или NewSeparator (сепараторы предназначены для функционального выделения на инструментальной панели групп элементов и представляют собой разновидности кнопок TTooiButton). Компонент TTooiButton не имеет свойства, предназначенного для хранения картинки, однако TToolBar умеет использовать контейнер TimageList, чтобы извлечь из него нужную картинку и поместить ее на инструментальную кнопку.

Методику использования TToolBar совместно с TToolButton рассмотрим на примере программы, окно которой показано на рис. 18.32.

Рис. 18.32. Пример TToolBar с кнопками TToolButton

- Поместите на пустую форму компонент TimageList, щелкните по нему правой кнопкой мыши и выберите продолжение ImageList Editor.
- Для заполнения контейнера ImageList1 подойдут любые небольшие по размеру изображения. К сожалению, растры из каталога images | BUTTONS[ См . замечание в начале главы. ] рассчитаны на использование в кнопках TSpeedButton и содержат по два изображения каждый -обычное и для запрещенной кнопки. Кнопки TToolButton также могут иметь два или три изображения, но эти изображения необходимо размещать в разных контейнерах rimageList, поэтому использование заготовок из каталога images | buttons в кнопках TToolButton приведет к появлению на них по два изображения одновременно[ Точнее, при вставке двойной картинки редактор компонента спросит у вас, надо ли ее разделять на две отдельные картинки. ]. Чтобы этого не произошло, загрузите пиктограммы из каталога images | icons: щелкните по кнопке Add окна редактора и выберите в этом каталоге файл chemical.
- Повторите П. 2 для фацлов Chip, Construe, Earth, Finance, Handchek, Shipping, Skyline И Technlgy, после чего закройте редактор ImageList.
- Поместите на форму компонент TToolBar, в окне Инспектора объектов разыщите свойство images, раскройте список в правой колонке строки images и выберите imageListi. Мы указали компоненту на источник изображений и можем теперь вставлять в него кнопки.
- Щелкните по ToolBar1 правой кнопкой мыши и выберите New Button.
- Вставьте еще две кнопки, после чего вставьте разделитель NewSeparator.
- Разместите на TooiBarl остальные кнопки и сепараторы (см. рис. 18.33).
- Если вы захотите, чтобы кнопки имели модный “плоский” вид, установите в свойство Flat компонента ToolBarl значение True.

Свойство Buttons компонента TToolBar позволяет обратиться к каждому дочернему компоненту как к объекту класса TToolButton, имеющему такие свойства:

property AllowAlIUp: Boolean;. | Если содержит True, синхронизирует свое состояние с состоянием других кнопок в той же группе: в любой момент может быть нажата только одна кнопка группы. Игнорируется, если Grouped=False
property Caption: String; | Содержит связанный с кнопкой текст, который будет показан, если свойство ShowCaptions компонента TTooiBar имеет значение True
property Down: Boolean; | Определяет состояние кнопки: если содержит True, кнопка утоплена
property DropdownMenu: TPopupMenu; | Связывает вспомогательное меню с нажатой кнопкой
property Grouped: Boolean; | Разрешает/запрещает учитывать свойство ailOwAlIUp
property Imagelndex: Integer; | Определяет индекс связанного с кнопкой изображения
property Indeterminate: Boolean; | Запрещает/разрешает выбор кнопки.
TToolButtonStyle = (tbsButton, tbsCheck, tbsDropDown, tbsSeparator, tbsDivider) ; property Style: TToolButton Style; | Определяет стиль кнопки: tbsButton - обычная кнопка; tbsCheck - западающая кнопка (остается в нажатом положении; для ее освобождения нужно щелкнуть по ней еще раз); tbsDropDown - кнопка с символом раскрывающегося списка; tbsSeparator - разделитель (на месте этой кнопки будет пустое место); tbsDivider - разделитель (в работающей программе на местеэтой кнопки будет вертикальная черта)
property Wrap: Boolean; | Если имеет значение True, кнопка завершает текущий ряд кнопок. Игнорируется, если свойство wrapable компонента TToolBar имеет значение True

Свойства компонента TToolBar:

property AutoSize: Boolean; | Если содержит True, высота компонента будет автоматически согласовываться с высотой кнопок
property ButtonCount: Integer; | Содержит количество вставленных в инструментальную панель дочерних компонентов (не только кнопок TToolButton)
property ButtonHeight: Integer; | Определяет высоту кнопок TtoolButton
property Disabledlmages: TImageList; | Определяет контейнер для изображений запрещенных кнопок
property Flat: Boolean; | Если содержит True, панель и кнопки на ней прозрачны для фона и вокруг кнопки появляется граница, только когда над ней располагается указатель мыши
property Hotlmages: TImageList; | Определяет контейнер изображений для кнопок в момент, когда над кнопкой располагается указатель мыши
property Images: TImageList; | Определяет контейнер для изображений кнопок в обычном состоянии
property Indent: Integer; | Определяет отступ в пикселях от левого края компонента для первого дочернего элемента
property List: Boolean; | Если имеет значение True, изображение прижимается к левой границе кнопки, а текст - к правой, в противном случае текст выводится под изображением. Игнорируется, если showCaptions = False
property RowCount: Integer; | Содержит количество рядов кнопок
property ShowCaptions: Boolean; | Разрешает/запрещает показ на кнопках текста
property Wrapable: Boolean; | Запрещает/разрешает располагать кнопки в нескольких рядах

Для компонента определено событие OnResize, возникающее при изменении размеров компонента.

18.3.17. TCoolBar и TCoolBand - инструментальная панель и полосы для нее

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

Следует сразу же заметить, что в отличие от TcontrolBar (страница Additional палитры компонентов) компонент TCoolBar предназначен для примерно таких же задач, но и в версии 2, где он появился впервые, и в версии б он все еще кажется “сырым”, плохо отлаженным.

Центральным свойством компонента является Bands - массив созданных в компоненте полос TCoolBand. Каждая полоса может иметь текст, пиктограмму и произвольный управляющий элемент. В отличие от ттоо1ваг или TControiBar полоса в TCoolBar всегда содержит только один интерфейсный элемент, но ничто не мешает этому элементу быть элементом-контейнером для размещения нескольких компонентов. Размещенный на полосе компонент окружен специальным окном TCoolBar и всегда стремится занять левый верхний угол полосы, при этом остальные размеры полосы изменяются так, чтобы полностью охватить элемент.

Поясним сказанное несложным примером.

- Поместите на пустую форму компонент TCoolBar - он тотчас же займет верхнюю часть формы, так как по умолчанию его свойства Alignment содержит alTop.
- Щелкните по компоненту левой кнопкой и выберите Bands Editor (редактор полос).
- Окно редактора похоже на многие другие используемые в Delphi окна-редакторы: щелкните по кнопке, чтобы вставить в компонент новую полосу.
- В окне Инспектора объектов можете задать текст для полосы и связанную с ней пиктограмму свойствами соответственно Text и imageindex (предварительно компонент в свойстве images должен уже содержать ссылку на связанный с ним контейнер TimageList). Свойство BitMap используется для заполнения полосы чередующимся узором. Для простоты ограничьтесь указанием текста полоса i и закройте редактор полос.
- Поместите ниже полосы, но в тот же контейнер CoollBar1 любой управляющий элемент, например, редактор TEdit. Подобно полосе он растянется вдоль верхнего края и будет окружен специальным окном с полосой-кнопкой для реализации механизма Drag&Dock.
- Вновь раскройте редактор полос, щелкните по ранее установленной полосе и в Инспекторе объектов раскройте список в свойстве Control - в нем окажется только что вставленный в форму компонент TEdit. Щелкните по нему - и он “перепрыгнет” на первую полосу, оставив ранее занимавшую им полосу TCoolBar пустой. Таким способом происходит связывание полосы TCooiBar с компонентом.
- Освободившуюся полосу можно связать с новым управляющим элементом (например, ComboBox) и т. д.
- Вид работающей программы показан на рис. 18.33.

Рис. 18.33. Вид окна CollBar

Свойства TCoolBand:

property Bitmap: TBitmap; | Определяет изображение, которое будет циклически повторяться по всему пространству полосы
property BorderStyle: TBorder-Style; | Определяет наличие рамки у полосы: bsNone - нет рамки; bssingle - рамка толщиной в 1 пиксель
property Break: Boolean; | Если содержит True, полоса располагается в новой строке, в противном случае - в той же строке, что и предыдущая полоса
property Control: TWinControl; | Указывает элемент, который содержит полоса
property FixedBackground: Boolean; | Запрещает/разрешает периодическое повто рение изображения Bitmap по всей поверхности полосы
property FixedSize: Boolean; | Запрещает/разрешает изменение размеров полосы
property HorizontalOnly: Boolean; | Предписывает показывать полосу только для значения False свойства Vertical компонента-владельца TCoolBar
property Imagelndex: Integers; | Содержит индекс связанного с полосой изображения
property MinHeight: Integers; | Определяет минимальное значение высоты полосы при изменении ее размеров
property MinWidth: Integers; | Определяет минимальное значение ширины полосы при изменении ее размеров
property ParentBitmap: Boolean; | Разрешает/запрещает использовать значение свойства Bitmap компонента-владельца TCoolBar вместо собственного свойства Bitmap
property Text: String; | Содержит текст полосы
property Visible: Boolean; | Если содержит False, полоса не видна на этапе прогона программы
property Width: Boolean; | Определяет ширину полосы в пикселях

Свойства компонента TCoolBar:

property AutoSize: Boolean; | Если содержит True, высота компонента будет автоматически согласовываться с высотой полос
property BandBorderStyle: TBorderStyle; | Определяет наличие рамок: bsNone - нет рамок; bssingle - каждая полоса имеет рамку толщиной в 1 пиксель
property Bands: TCoolBands; | Содержит список всех полос. Свойство items этого объекта открывает доступ к полосе по ее индексу
property Bitmap: TBitmap; | Определяет изображение, которое будут использовать все полосы
property FixedOrder: Boolean; | Запрещает/разрешает перемещение полос
property FixedHeight: Boolean; | Запрещает/разрешает изменение размера полос
property Images; TImageList; | Указывает контейнер для изображений, связанных с каждой полосой
property ShowText: Boolean; | Если содержит True, на полосе показывается связанный с ней текст
property Vertical: Boolean; | Если содержит True, полосы располагаются по вертикали компонента
Для компонента определены такие события:

property OnChange: TNotifyEvent; | Возникает при изменении свойств Break, Index или Width у любой полосы
property OnResize: TNotifyEvent; | Возникает при изменении размеров компонента

18.3.18. TPageScroller - панель с прокруткой

Компонент служит контейнером для размещения длинных узких компонентов наподобие TToolBar. Его отличительная черта - наличие небольших стрелок прокрутки по сторонам контейнера в случае, если ширина (высота) дочернего окна превышает соответствующий размер компонента. Чтобы увидеть компонент в действии, щелкните по странице Win32 галереи компонентов Delphi (сам компонент TPageScroller на этой странице обычно не виден[ Для разрешения экрана 800х600. ]), и, чтобы получить к нему доступ, следует щелкнуть по кнопке с небольшой стрелкой в правой части страницы.

По назначению компонент весьма напоминает уже рассмотренный в п. 18.2.9 компонент TScrollBox и отличается от него двумя обстоятельствами: компонент не содержит полос прокрутки, а прокрутка осуществляется так, чтобы полностью показать ранее невидимый дочерний компонент.

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

property AutoScroll: Boolean; | Разрешает/запрещает автоматическую прокрутку при перемещении указателя мыши над кнопкой прокрутки
property ButtonSize: Integer; | Определяет размер в пикселях кнопок про крутки: для горизонтальной ориентации - ширину, для вертикальной - высоту
property Control: TWinControl; | Содержит ссылку на прокручиваемое окно
property DragScroll: Boolean; | Указывает, будет ли компонент приемни ком в операциях Drag&Drop. Если содержит True, компонент будет прокручивать дочернее окно при перемещении над ним указателя мыши с “грузом”
property Margin: Integer; | Указывает расстояние в пикселях от границы компонента до соответствующей стороны дочернего окна
type TPageScrollerOs-xentation = (soHorizontal, soVertical) ; property Orientation: TPageS crollerOrientation; | Определяет ориентацию компонента: soHorizontal -по горизонтали; soVertical -по вертикали
property Position: Integer; | Определяет текущее положение прокручиваемого окна относительно границ компонента

18.3.19. TComboBoxEx - список выбора с расширенными возможностями

Этот компонент впервые введен в версии 6. По сравнению с TCоmboBох (см. п. 18.1.11) он способен рисовать слева от элемента списка небольшое изображение и выводить элемент с заданным отступом от левого края списка (рис. 18.34). Кроме того, с каждым элементом можно связать указатель на произвольные данные, размещенные в динамической памяти.

Рис. 18.34 . Пример использования компонента ТСотbоВохЕх

Специфичные свойств а компонента:

property Images: TCustomImageList; | Определяет объект-хранилище изображении
property ItemsEx: TComboExItems; | Определяет строки списка выбора
property MaxLength: Integer; | Определяет максимальное количество символов, которые пользователь может ввести в окне редактора
type TComboBoxExStyle = (csExDropDown, csExSimple, csEx-DropDownList) ; property Style: TComboBoxExStyle; | Определяет стиль компонента: csExDrop-Down с кнопкой раскрытия списка и возможностью ручного ввода текста; csExSim-ple - без кнопки (список всегда раскрыт), высота списка определяется свойством Height; csExDropDownList -с кнопкой раскрытия списка, но пользователь не может ввести текст выбора вручную

Строки ItemsEx списка выбора определяет класс TComboExItems, имеющий такие свойства:

property Comboltems[const Index: Integer]: TComboExItem; property Items[const Index: Integer] : TListControlItem; default; type TLi'stItemsSortType = (stNone, stData, stText, stBoth); property SortType: TSortType;

Класс TListControlItem имеет три специфичных свойства: caption (String), Data (Pointer) И Imagelndex (integer), с помощью которых описываются текст элемента, а также связанные с ним данные и индекс изображения. Для установки значений этих свойств используются методы SetCaption, SetData И Setlmagelndex класса TListControlItem.

Класс TComboExitem, с помощью которого описываются строки списка в целом, имеет такие свойства:

property Caption: Strings-property Data: Pointed; | Текст элемента выбора Указатель на связанные с элементом данные
property Imagelndex: Timagelndex; | Индекс изображения для невыбранного элемента
property Indent: Integer; | Отступ элемента от левого края списка
property Overlaylmagelndex: Timagelndex; | Индекс изображения-маски
property SelectedlmageIndex: Timagelndex; | Индекс изображения для выбранного элемента

Нетрудно заметить, что свойства Caption, Data и Imagelndex дублируют одоименные свойства класса TListControlltem. Свойство Overlaylmagelndex ссылается на черно-белый растр, который накладывается на изображения Imagelndex И Selectedlmagelndex. Этопозволяет реализовать разного рода анимационные эффекты при выводе изображений.