Глава 18

ИСПОЛЬЗОВАНИЕ КОМПОНЕНТОВ ОБЩЕГО НАЗНАЧЕНИЯ

В этой главе рассматривается работа с некоторыми наиболее часто используемыми компонентами библиотеки визуальных компонентов Delphi (VCL - Visual Component Library). Компоненты описываются так, как они по умолчанию (в момент поставки) сгруппированы на страницах палитры компонентов. Это сделано сознательно, чтобы облегчить поиск в книге нужного компонента, т. к. эта глава в значительной степени основана на справочном материале Delphi.

Некоторые компоненты дублируют приблизительно одинаковые функции. Например, есть разного рода контейнеры, способные служить заготовками для создания инструментальных панелей, различные индикаторы, кнопки, два сорта меток, два редактора для ввода текста и т. д. Такая избыточность связана с тем, что часть компонентов является на самом деле “дельфийской” оболочкой для стандартных компонентов Windows (к таковым, в частности, относятся многие компоненты страниц Standard, Win32, win3.1 и Dialogs), а другая часть разработана сотрудниками Borland и сторонними организациям в связи с тем, что стандартные компоненты не всегда способны выполнять некоторые специфичные функции (например, маскируемый ввод текста или стандартные функции закрытия диалоговых окон). С другой стороны, Delphi развивается по принципу преемственности при переходе от младших версий к старшим, именно поэтому, например, имеется страница win3.1, хотя все функции ее компонентов с лихвой перекрываются компонентами страниц Win32 и Dialogs.

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

Примечание

> В некоторых примерах главы используются файлы из каталога Images, содержащего разного рода изображения. Для версий 4.,.6 этот каталог устанавливается только в режиме инсталляции Custom и по-умолчанию располагается в папке: Program Files | CommonFiles |Borland Shared.

> Свойства, методы и события компонентов описываются применительно к VCL (для одноименных компонентов CLX могут быть существенные отличия). Некоторые из свойств, методов и событий могут отсутствовать в Delphi предыдущих версий.

18.1. КОМПОНЕНТЫ СТРАНИЦЫ STANDARD

18.1.1. TFrame - рама и шаблоны компонентов

Этот компонент впервые введен в Delphi 5. Он определяет раму -контейнер для размещения других компонентов. В функциональном отношении компонент почти повторяет свойства формы и отличается от нее в основном лишь тем, что его можно помещать на формы или в другие рамы. Фактически рама представляет собой удобное средство создания шаблонов - произвольных наборов компонентов, максимально приспособленных для нужд конкретного пользователя. Раз созданный шаблон может подобно любому другому компоненту размещаться на форме или другой раме (допускается неограниченная вложенность рам). Замечу, что любые изменения в базовой раме (т. е. в раме, сохраненной в палитре) тут же отображаются во всех проектах, использующих данную раму.

Примечание

> Создание шаблонов - отнюдь не исключительная особенность Delphi 5 и б - соответствующие механизмы были включены и в две предыдущие версии 3 и 4. Рамы лишь упрощают процесс создания шаблонов. В конце параграфа приводится простая методика создания и использования шаблонов без рам, т. е. так, как это возможно сделать в версиях 3 и 4.

Первоначально проекту ничего не известно о, возможно, ранее созданных рамах, поэтому попытка поместить на пустую форму компонент-раму вызовет сообщение:

No frames in project.

To create a frame select File New Frame.

(В проекте нет рам. Чтобы создать раму выберите File | New Frame.)

Это сообщение и описываемая ниже методика подключения шаблонов - единственное, что отличает механизм использования шаблонов от использования стандартных компонентов.

Создадим простую раму, содержащую две кнопки - mbOk и mbCancel. Такой шаблон может пригодится при конструировании различных диалоговых окон.

- Создайте новый Проект (File | New Application). если он все еще связан с учебной формой, определенной в гл. 5, предварительно вызовите окно редактора Репозитория (Tools | Repository), в окне pages щелкните по Forms, а в появившемся в правом окне списке objects - по fmExamipe, после чего уберите флажок в переключателе Main Form и закройте окно кнопкой ок.
- Создайте новую раму-выберите File | New | Frame.
- Поместите на раму две кнопки TBitBtn (рис. 18.1, а) и установите следующие свойства для кнопок и рамы: BitBtnl: Left=0, Тор=0, Kind=bkOK, Name=bbOK;

BitBtn2: Left=90, Top=0, Kind=bkCancel, Name=bbCancel;

Framel : Height=25, Width=165, Anchors=[akRight,akBottom]

а)

б)

Рис. 18.1. а) вид рамы на этапе конструирования: 6) окно регистрации рамы в палитре компонентов

Установленные параметры создадут минимальную по размерам раму с двумя именованными кнопками. Так как свойство Anchors рамы содержит значения [akRight, akBottoms], рама будет все время отслеживать свое положение относительно правого нижнего угла контейнера, в который она будет помещена.

- Щелкните по раме правой кнопкой мыши и выберите в локальном меню Add To palette - на экране появится диалоговое окно с предложением сохранить модуль шаблона в дисковом файле.
- Сохраните шаблон в файле с именем, DigBtnsF в папке для ваших программ. На экране появится окно регистрации шаблона в палитре компонентов, показанное на рис. 18.1, б. В окне предлагается установить для нового компонента имя класса и страницу палитры компонентов, в которую он помещен. Обратите внимание на автоматически созданное умалчиваемое имя Заготовки - TFramelTamplate. Т. к. это имя будет появляться в ярлычке Hint при высвечивании компонента мышью, следует дать ему более осмысленное имя, например, TDiaiogButtons. И еще одно замечание - в качестве страницы палитры компонентов в окне предлагается страница Templates (шаблоны), которая отсутствует в начальном наборе страниц палитры. Если вы сохраните это имя, в Delphi будет создана новая страница компонентов.
- Задайте имя класса шаблона и страницу его размещения, после чего щелкните по кнопке ок - шаблон готов для использования.
- После закрытия окна регистрации сам шаблон (рис. 18.1, а) останется на экране. Подобно дополнительной форме его модуль стал составной частью проекта, поэтому размещение шаблона на форме не вызовет проблем.
- Щелкните по пиктограмме Ю на странице Standard палитры компонентов и затем по пустому месту в форме Formi - на экране появится окно с предложением выбрать нужный шаблон (рис. 18.2, а). Нажмите Enter, и шаблон появится в форме так, как если бы это был любой другой компонент (рис. 18.2, б). Следует отметить, что, если вы откроете новый проект и попытаетесь разместить на форме раму со страницы Standard, на экране вновь появится сообщение о том, что в проекте нет рам. Однако, если вы присоедините модуль DigBtnsF к проекту клавишами Shift-F11 или кнопкой И, установка шаблона на любую форму проекта приведет к появлению окна 18.2, а. Если в новом проекте попробовать установить на пустую форму компонент-шаблон со страницы Templates (или с любой другой страницы, куда он был ранее помещен на этапе регистрации), на экране появится окно с такой надписью:

The following unit: DigBtnsF, is needed in your project to create the template. Do you wish to add it?

(Модуль DigBtnsF необходим в вашем проекте, чтобы создать шаблон. Хотите его добавить?)

а)

б)

Рис. 18.2 . а) окно выбора доступного шаблона; б) форма с размещенным на ней шаблоном

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

Компонент TFrame является потомкам TScrollingWinControl, от которого ему достались три описываемых ниже специфичных свойства (остальные свойства, события и методы унаследованы от rwin-controi и описаны в гл. 17):

property AutoScroll: Boolean;property HorzScrollBar: TControlScrollBar; | Определяет свойства горизонтальной полосы прокрутки
property VertScrollBar: TControlScrollBar; | Определяет свойства вертикальной полосы прокрутки

Класс TControlScrollBar, к которому принадлежат свойства HorzScrollBar и VertScrollBar, устанавливает все необходимые свойства и методы для полос прокрутки.

Свойства TControlScrollBar:

property Margin: Word; | Определяет минимальное расстояние от полосы до края компонента, в котором она расположена
property ButtonSize: Integer; | Определяет размер кнопок полосы прокрутки
property Color: TColor; | Определяет цвет полосы
type=(sbHorizontal,sbVertical) ; property Kind: ScrollBarKind; | Указывает ориентацию полосы (это свойство - только для чтения)
type TScrollBarInc = 1..32767; property Increment: TScrollBarInc; | Указывает перемещение бегунка при щелчке мышью на концевой кнопке полосы
property ParentColor: Boolean; | Если содержит True, цвет полосы определяется системными установками Windows. Установка значения в свойство color при водит к автоматической установке значения False в свойство ParentColor
property Position: Integer; | Определяет положение бегунка на полосе прокрутки
property Range: Integer; | Определяет размер скроллируемой области
property ScrollPos: Integers; | Определяет положение скроллируемой области
property Size: Integer; | Определяет ширину полосы в пикселях
property Smooth: Boolean; | Если содержит True, прокрутка осуществляется стандартным образом: щелчок по концевой кнопке вызывает смещение приблизительно на 1/10 части всей прокручиваемой области. Если содержит False, смещение определяется свойством Increment
TScrollBarStyle = (ssRegular, ssFlat, ssHotTrack); | Определяет стиль полосы: ssRegular обычная полоса; ssFlat - плоская полоса;
property Style: TScrollBarStyle; | ssHotTrack - плоская полоса, ее компоненты выделяются цветом при перемещении над ней указателя мыши
property ThumbSize: Integer; | Определяет ширину бегунка в пикселях
property Tracking: Boolean; | Разрешает/запрещает динамическую прокрутку при перемещении ползунка
property Visible: Boolean; | Определяетвидимость полосы

18.1.1. Создание шаблонов без рам

При желании вы может создать шаблоны компонентов и без рам. Описываемый ниже способ можно с одинаковым успехом использовать в версиях от 3-й до 6-й.

Поместите на форму компоненты, которые войдут в шаблон, и нужным образом настройте их свойства. Затем нажмите клавишу Shift и, не отпуская ее, щелкните по каждому шаблонному компоненту - в результате будет выделена группа компонентов. Теперь раскройте пункт Сomponent главного меню Delphi и выберите create component Template (если на форме не будет выделен ни один компонент, этот пункт меню будет недоступен). В ответ на это Delphi развернет окно, показанное на рис. 18.1, б, - единственным отличием будет то, что в качестве пиктограммы шаблона будет предложена пиктограмма последнего выделенного компонента. Дальнейшие действия ничем не отличаются от описанных выше.

18.1.2. TMainMenu - главное меню формы (программы)

Компонент класса TMainMenu определяет главное меню формы. На форму можно поместить сколько угодно объектов этого класса, но отображаться в полосе меню в верхней части формы будет только тот из них, который указан в свойстве Menu формы.

После установки компонента на форму необходимо создать его опции. Для этого следует дважды щелкнуть по компоненту левой кнопкой мыши, либо нажать на нем правую кнопку[ Жаргонизмы “дважды щелкнуть по компоненту левой кнопкой мыши” и “нажать на нем правую кнопку” используются вполне сознательно в целях экономии вашего и моего времени. Разумеется, следовало бы писать что-нибудь вроде “в момент, когда указатель мыши находится над видимым изображением компонента, дважды подряд без заметной паузы нажать левую кнопку мыши” и “расположить указатель мыши так, чтобы острие указателя находилось в пределах видимого изображения компонента, и нажать правую кнопку мыши”. В дальнейшем я иногда буду прибегать к такого рода сокращениям, а посему -заранее приношу свои извинения, если они вам покажутся не очень литературными. ] и выбрать продолжение Menu Designer в появившемся вспомогательном меню, либо, наконец, щелкнуть по кнопке в правой половине строки items Инспектора объектов. На рис. 18.3 показан вид окна конструктора меню, которое появится на экране после выполнения любого из перечисленных действий.

Рис. 18.3. Окно конструктора меню

Создание опций не вызывает проблем. Перейдите в окно Инспектора объектов и введите текст опции в строке caption, после чего нажмите Enter - опция готова, и можно переходить к следующей. Каждая опция главного меню может раскрываться в список подопций или содержать конечную команду. Для создания подопций щелкните мышью по строке ниже опции и введите первую подопцию. Продолжайте ввод, пока не будет создан весь список подопций, после чего щелкните по пустому прямоугольнику справа от первой опции и введите вторую опцию. Процесс гораздо сложнее описать, чем выполнить.

В названиях опций можно указать символ “&” перед тем символом, который определит клавишу быстрого выбора опции (в терминологии Windows такие клавиши называются акселераторами). Например, на рис. 18.3 показана опция Файл, которую можно выбрать сочетанием клавиш Alt+Ф. При создании меню эта опция в строке caption Инспектора объектов содержала текст &Файл.

Если вы захотите вставить разделительную черту, отделяющую группы подопций, назовите очередной элемент меню именем “-”. Так, например, создана черта, отделяющая опции сохранить как и выход в примере меню на рис. 18.3: свойство caption, пятого по счету элемента списка опций Файл, содержит единственный символ “-”.

Для создания разветвленных меню, т. е. таких, у которых подопций вызывают новые списки подопций, щелкните по подопций и нажмите Ctrl+вправо, где вправо - клавиша смещения курсора вправо. Такого же эффекта можно добиться после щелчка правой кнопкой мыши на подопций и выборе продолжения create Submenu. На рис. 18.4 показан пример разветвленной структуры меню.

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

property AutoMerge: Boolean; | Разрешает/запрещает слияние главного меню вторичной формы с главным меню основной формы в не MDI-приложениях
type TMenuItemAutoFlag = (maAutomatic, maManual, maPar-ent) ; property AutoHotkeys: TMenuAuto-Flag; | Определяет, будет ли следить программа за уникальностью клавиш быстрого выбора для всех опций меню: maAutomatic - автоматически при создании опции; maManual -с помощью вызова специального метода; maparent - по правилу, установленному для опции верхнего уровня
property AutoLineReduction: TMenuItemAutoFlag; | Определяет, будет ли программа автомати чески удалять лишние разделители между опциями многоколончатого меню. Тип TMenuItemAutoFlag описан в свойстве AutoHotkeys
property Images: TCustomImageList; | Содержит ссылку на объект - хранилище изображении, которые могут появляться около индивидуальных элементов (пунктов) в меню
property Items: TMenuItem; default; | Открывает индексированный доступ к опциям меню
property OwnerDraw: Boolean; | Определяет, будет ли программа прорисовывать опции меню автоматически или с помощью обработчика onDrawltem

Если одна форма вызывает вторую форму в немодальном режиме, главное меню первой может сливаться с главным меню второй формы. Для этого свойство AutoMerge второй формы должно иметь значение True. Порядок слияния опций в этом случае устанавливается свойствами Groupindex опций второго меню. Чтобы продемонстрировать механизм слияния меню, проделайте следующее:

- Начните новое приложение и на форму положите компонент TMainMenu.
- Поместите в свойство Сaption единственной опции этого компонента значение открыть вторичное окно и напишите такой обработчик его события OnClick:

procedure TForm1.NIClick(Sender: TObject);

begin

Form2.MainMenul.AutoMerge := True;

Form2.Show

end;

- Присоедините к проекту вторую форму, щелкнув по инструментальной кнопке Н или с помощью опции File | New| Form

- Положите на эту форму TMainMenu, создайте в нем единственную опцию с Caption закрыть вторичное окно и таким обработчиком:

procedure TForm2.NIClick(Sender: TObject);

begin

Close;

Formi.MainMenu1.Unmerge(MainMenu1);

end;

Перед трансляцией свяжите модули окон предложениями Uses.

Обратите внимание: если при закрытии вторичного окна не восстановить опции главного меню методом unmerge, эти опции останутся прежними (измененными).

Свойство AutoMerge вторичного окна игнорируется, если оно вызывается в модальном режиме, а также если оно является дочерним окном MDI.

Наиболее важные методы компонента:

function DispatchCommand (ACommand: Word): Boolean; dynamic; | Имитирует щелчок по опции, свойство которой command имеет значение ACommand. Если такой опции нет или она не является исполняемой, возвращает False
procedure Merge(Menu: TMainMenu); | Объединяет пункты главного меню с пунктами меню Menu
procedure Unmerge(Menu: TMainMenu) ; | Удаляет из главного меню пункты меню Menu

Каждый элемент меню является объектом класса TMenuItem. Свойства этого класса описаны в следующей таблице. Термин “родительская опция” означает опцию, выбор которой приводит к раскрытию подменю с данной опцией.

property AutoCheck: Boo lean; | Определяет, будет или нет автоматически изменяться свойство Сhecked при выборе опции меню
type TMenuItemAutoFlag = (maAutomatic, maManual, maParent); | Определяет, будет ли следить программа за уникальностью клавиш быстрого выбора для подоп ций: maAutomatic - автоматически при создании
property AutoHotkeys: TMenuItemAutoFlag; | подопции; maManual - с помощью вызова специального метода; maParent - по правилу, установленному для опции верхнего уровня
property AutoLineReduction: TMenuItemAutoFlag; | Определяет, будет ли программа автоматически удалять лишние разделители между опциями многоколончатого меню второго уровня. Тип TMenuItemAutoFlag описан в свойстве AutoHotkeys
property Bitmap: TBitmap; | Содержит ссылку на связанное с опцией изображение. Это изображение (если оно есть) появляется слева от опции. Свойство игнорируется, если установлено свойство Imagelndex (см. ниже)
property Break: TMenuBreak; | Позволяет создать многоколончатый список подменю (см.ниже)
property Checked: Boolean; | Если True, рядом с опцией появляется галочка
property Command: Word; | Используется при разработке приложений, обращающихся непосредственно к API-функциям Windows
property Count: Integer; | Содержит количество опций в подчиненном меню, связанном с данным элементом (только для чтения)
property Default: Boolean; | Определяет, является ли данная опция подменю умалчиваемой (см. ниже)
property Grouplndex: Byte; | Определяет групповой индекс для зависимых опций (см. свойство Radioltem)
property Imagelndex: Integer; | Содержит индекс связанного с опцией изображения из компонента TimageList (см. п. 18.3.3). Это изображение (если оно есть) появляется слева от опции. Если свойство имеет значение -1, с опцией не связано никакого изображения из TimageList
property Items[Index: Integer] : TMenuItem; | Позволяет обратиться к любой опции подчиненного меню по ее индексу
property Menulndex: Integer; | Определяет индекс опции в списке items родительской опции
property Radio Itern: Boolean; | Определяет, зависит ли данная опция от выбора других опций в той же группе Grouplndex. Только одна опция группы может иметь True в свойстве checked. Рядом с такой опцией вместо галочкиизображается круг (см. ниже рис. 18.6)
property Shortcut: TshortCut; | Задает клавиши-акселераторы для быстрого выбора данной опции
property SubMenuImages: TCustomImageList; | Содержит ссылку на объект - хранилище изображений, которые могут появляться около индивидуальных элементов (пунктов) в подменю этого пункта меню

Рис. 18.4. Разветвленная структура меню

В Delphi 4 (5 и 6) появилась возможность связывать с опциями меню небольшие изображения. Эти изображения можно задать либо свойством BitMap, либо свойством imageindex. В последнем случае предполагается, что для меню в целом определено свойство Images либо (только для версии 6) свойство SubMenuImages опции верхнего уровня. Изображение показывается слева от опции. Например, на рис. 18.5 показан фрагмент главного меню Delphi с раскрытой опцией File.

Рис. 18.5. Подменю File среды Delphi

Как видим, опции Open, open Ptoject, Save и т. д. снабжены небольшими пиктограммами. Введение пиктограмм в меню, с одной стороны, повышает наглядность меню, а с другой - способствует унификации пиктограмм в рамках механизма действий (см. п. 17.7). Если опция меню связана с каким-то действием своим свойством Action, а компонент TActionList, в котором это действие описано, в свою очередь, связан с хранилищем пиктограмм TimageList (см. 18.5.3), индекс нужной пиктограммы можно задать в свойстве ImageIndex. В этом случае пиктограмма, указанная в свойстве BitMap (если она указана в нем), игнорируется.

Тип TMenuBreak определен следующим образом:

type TMenuBreak = (mbNone, mbBarBreak, mbBreak);

Свойство Break по умолчанию имеет значение mbNone. Два других возможных значения этого свойства используются для создания многоколончатых списков подменю (см. рис. 18.6). Значение mbBarBreak заканчивает предыдущую колонку и начинает новую. Эта опция меню будет открывать новую колонку, которая отделяется от предыдущей вертикальной чертой. Значение mbBreak также создает новую колонку, но не вставляет разделительную черту. Эти значения игнорируются в опциях самого первого уровня. В окне конструктора многоколончатое меню отображается как обычное.

Если в опции Default установлено значение True, такая опция выделяется цветом и выбирается двойным щелчком мыши на родительской опции (см. рис. 18.6). Только одна опция в подменю может быть умалчиваемой.

Рис. 18.6. Пример многоколенчатого меню

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

Для элемента меню определено единственное событие Onciick, которое возникает при щелчке на опции или при нажатии Enter, если в этот момент данная опция была выбрана (подсвечена). Обработчик события становится доступен после двойного щелчка на опции в окне конструктора меню.

18.1.3. TPopupMenu - вспомогательное (локальное) меню

Компоненты класса TPopupMenu используются для создания вспомогательных (локальных) меню, появляющихся после нажатия правой кнопки мыши. В отличие от главного меню, вспомогательное меню может быть создано для любого оконного компонента. Чтобы связать щелчок правой кнопкой мыши на компоненте с раскрытием вспомогательного меню, в свойство PоPupmеnu компонента необходимо поместить имя компонента-меню.

Вспомогательное меню создается с помощью конструктора меню и содержит элементы описанного в п. 18.1.2 класса TMenuItem, поэтому процесс создания и свойства вспомогательного меню ничем не Отличаются ОТ TMainMenu.

18.1.4. TLabel - метка для отображения текста

Компоненты класса TLabel (метка) предназначены для размещения на форме различного рода текстовых надписей. Для этого служит центральное свойство компонента - Caption. С помощью свойства Font можно разнообразить вид надписи (оба эти свойства достались метке от предка TGraphicControl и поэтому не отображаются в таблице ниже). С компонентом может быть связан оконный управляющий элемент, который выбирается при нажатии Alt+Буква, где Буква - выделенная подчеркиванием буква в тексте метки. Такие символы в терминологии Windows называются акселераторами.

Свойства компонента (кроме унаследованных от TGraphicControl):

type TAlignment = (taLeftJustify, taRightJustify, taCenter) ; property lignment: TAlignment; | Определяет выравнивание текста по горизонтали относительно границ компонента (для AutoSize=False): taLeftJustify - Прижат К левой границе; taRightJustify - прижат к правой границе; taCenter - выровнен по центру
property AutoSize: Boolean; | Указывает, будет ли метка изменять свои размеры в зависимости от помещенного в ее свойство Caption текста: True - будет
property FocusControl: TWinControl; TTextLayout = (tITop, tICenter, tiBottom) ; property Layout: TTextLayout; | Содержит имя оконного компонента, который связан с меткой-акселератором Определяет выравнивание текста по вертикали относительно границ метки: tiTop - текст располагается вверху; ticenter - текст центрируется по вертикали; tiBottom - текст располагается внизу
property ShowAccelChar: Boolean; | Если содержит True, символ & в тексте метки предшествует символу-акселератору
property Transparent: Boolean; | Определяет прозрачность фона метки. Если False, фон закрашивается собственным цветом Color, в противном случае используется фон родительского компонента
property Wordwrap: Boolean; | Разрешает/запрещает разрыв строки на границе слова. Для вывода многострочных надписей задайтеAuroSize=False, wordwrap=True и установите подходящие размеры метки

Примечание

> Метка Label может отображать длинную текстовую строку своего свойства Caption в виде нескольких строк: для этого установите в AutoSize значение False, задайте достаточно большие размеры метки и поместите в Wordwrap значение True. Для отображения действительно многострочного текста используйте компоненты TMemo (см.п. 18.1.7)HTRichEdit(cM.n. 18.3.4).

18.1.5. TEdit - ввод и отображение строки

Компонент класса TEdit представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные текстовые строки.

Центральным свойством компонента является Text, которое представляет собой отображаемую компонентом строку. С помощью обработчика события onchange программа может контролировать вводимый пользователем текст и при необходимости фильтровать его, игнорируя недопустимые символы. В следующем примере компонент фильтрует все символы, которые не соответствуют правильному представлению вещественного числа:

var

OldText: String;

procedure TFormI.EditlChange(Sender: TObject);

begin

if Editl.Text<>'' then

try

StrToFloat(Editi.Text) ;

OldText := Editl.Text except

// Ошибка преобразования: восстанавливаем прежний текст

Editl.Text := OldText;

// и позиционируем текстовый указатель в конец текста:

Editl.SelStart := Length(Editi.Text);

Editi.SelText := ''

end

end;

При повторении примера подготовьте глобальную переменную OldText типа String, в которой запоминается последний правильно введенный текст. Лучше всего ее поместить в секцию Private класса формы - тогда ее можно не обнулять в момент начала работы.

Примечание

> Позиционировать текстовый указатель на любой символа строки .можно с помощью свойств SelStart и SelText: в первое нужно поместить порядковый номер символа от начала текста, после который должен стоять указауель ввода, во-второе -пустую строку.

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

property AutoSelect: Boolean; | Указывает, будет ли выделяться весь текст в момент получения компонентом фокуса ввода
property AutoSize: Boolean; | Если содержит True и BorderStyle=bsSingle, высота компонента автоматически меняется при изменении свойства Font. Size
TBorderStyle = bsNone..bsSingle; property BorderStyle: TBorderStyle; | Определяет стиль обрамления компонента: bsNone - нет обрамления; bsSingle - компонент обрамляется одной линией
property CanUndo: Boolean; | Содержит True, если сделанные пользователем изменения в тексте Text можно убрать методом Undo
TEditCharCase = (ecNormal, ecUpperCase, ecLowerCase) ; | Определяет автоматическое преобразование высоты букв: ecNormal - нет преобразования; ecUpper
property CharCase: TEditChar Case; | Case - все буквы заглавные; ecLowerCase - все буквы строчные. Правильно работает с кириллицей
property HideSelection: Boolean; | Если содержит False, выделение текста сохраняется при потере компонентом фокуса ввода
property MaxLength: Integers; | Определяет максимальную длину текстовой строки. Если имеет значение 0, длина строки не ограничена
property Modified: Boolean; | Содержит True, если текст был изменен
property OnChange: TNotifyEvent; | Определяет обработчик события OnChange, которое возникает после любого изменения текста
property OEMConvert: Boolean; | Содержит True, если необходимо перекодировать текст из кодировки MS-DOS в кодировку Windows и обратно
property PasswordChar: Char; | Если символ PasswordChar определен, он заменяет собой любой символ текста при отображении в окне. Используется для ввода паролей
property Readonly: Boolean; | Если содержит True, текст не может изменяться
property SelLength: Integers; | Содержит длину выделенной части текста
property SelStart: Integers; | Содержит номер первого символа выделенной части текста
property SelText: Strings- | Содержит выделенную часть текста
property Text: String; | Содержит весь текст
Методы компонента:
procedure Сlears; | Удаляет весь текст
procedure ClearSelection; | Удаляет выделенный текст
procedure ClearUndo; | Очищает буфер метода Undo
procedure CopyToClipboard; | Копирует выделенный текст в clipboard
procedure CutToClipboard; | Копирует выделенный текст в clipboard, после чего удаляет выделенный текст из компонента
function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integers; | Копирует не более BufSize символов выделенного текста в буфер Buffer
procedure PasteFromClipboard; | Заменяет выделенный текст содержимым Clipboard, а если нет выделенного текста, копирует содержимое Clipboard в позицию текстового курсора
procedure SelectAll; | Выделяет весь текст
procedure SetSelText-Buf(Buffer: PChar); | Заменяет выделенный текст содержимым Buffer, а если нет выделенного текста, копирует содержимое Buffer в позицию текстового курсора
procedure Undo; | Восстанавливает текст в том виде, в каком он был перед последним получением компонентом фокуса ввода

Свойство CanUndo и методы СlearUndo и undo впервые введены в версии Delphi 4.

18.1.6. TMemo - ввод и отображение текста

Компоненты класса тмето предназначены для ввода, редактирования и/или отображения достаточно длинного текста. Текст хранится в свойстве Lines класса TStrings и, таким образом, представляет собой пронумерованный набор строк (нумерация начинается с нуля). С помощью свойств И методов этого класса (Count, Add, Delete, Clear и т. д. - см. п. 16.3.1) можно динамически формировать содержимое компонента.

Свойства BorderStyle, CanUndo, HideSelection, MaxLentgh, Modified, OEMConvert, OnChange, Readonly, SelLength, SelStart и SelText аналогичны соответствующим свойствам класса TEdit. Свойство WordWrap аналогично свойству TLabel. WordWrap. Другие специфичные свойства представлены ниже:

property CaretPos: TPoint; | Содержит координаты мигающего текстового курсора относительно границ клиентской области компонента (только для Delphi 4...6)
property Lines: TStrings; TScrollStyle = (ssNone, ssHorizontal, ssVertical, ssBoth) ; property ScrollBars: Tscroll-Style; | Содержит строки текста Определяет наличие в окне редактора полос прокрутки: ssNone - нет полос;ssHorizontal -есть горизонтальная полоса; ssVertical - есть вертикальная полоса; ssBoth - есть обе полосы
property WantReturns: Boolean; | Если содержит True, нажатие Enter вызывает переход на новую строку, в противном случае обрабатывается системой. Для перехода на новую строку в этом случае следует нажать Ctrl+Enter
property WantTabs: Boolean; | Если содержит True, нажатие Tab вызывает ввод в текст символа табуляции, в противном случае - обрабатывается системой. Для ввода символа табуляции в этом случае следует нажать Ctrl+Tab

Замечу, что, если свойство ScrollBars содержит ssHorizontal или ssBoth, свойство wordwrap игнорируется, и длинные строки будут отсекаться границами компонента без переноса текста на следующую строку.

Специфичные методы класса аналогичны методам класса TEdit.

Поскольку компонент является потомком TControl, он имеет также свойство Text, которое содержит отображаемый компонентом текст в виде одной длинной строки. В этой цепочке символов границы строк многострочного текста выделяются символами #13#10 (признак eoln - конец строки). В отличие от этого свойство Lines содержит пронумерованный список строк: первая строка в этом списке имеет индекс 0, вторая - 1, а общее количество строк можно узнать с помощью Lines .count.

Свойство Text удобно использовать для поиска в тексте нужного фрагмента. Чтобы, например, найти и выделить в тексте фрагмент,. содержащийся В компоненте edSearch типа TEdit, можно использовать такой обработчик события onciick кнопки btSearch:

procedure TForm1.btSearchClick(Sender: TObject);

var

k: Integer;

begin

with Memo1 do

begin

k: := pos(edSearch.Text,Text);

if k>0 then

begin

SelStart := k-1;

SelLength := Length(edSearch.Text)

end

end;

end;

Если вы захотите, чтобы найденный в тексте фрагмент после установки SelStart и SelLength сразу бы выделился цветом, установите False в свойство HideSelection.

Для загрузки в компонент текста из файла и для сохранения текста в файле удобно использовать методы LoadFromFile И SaveToFile класса TStrings (см. п. 16.3.1). Например, следующий обработчик события OnCreat формы Form1 загружает в Memo1 текст проектного файла программы:

procedure TForm1.FormCreate(Sender: TObject);

begin

Memol.Lines.LoadFromFile(

ChangeFileExt(Application.ExeName,'.dpr ' ))

end;

18.1.7. TButton - кнопка

Кнопки TButton широко используются для управления программами. Связанный с кнопкой алгоритм управления реализуется в обработчике события OnClick.

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

property Cancel: Boolean; | Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Esc
property Default: Boolean; | Если имеет значение True, событие OnClick кнопки возникает при нажатии клавиши Enter
type TModaiResult = Low(Integer)..High(Integer) ; property ModalResult: TModaiResult; | Определяет результат, с которым было закрыто модальное окно (см. ниже пояснение)

В терминологии Windows модальными окнами называются такие специальные окна, которые, раз появившись на экране, блокируют работу пользователя с другими окнами вплоть до своего закрытия. Обычно с их помощью реализуется диалог, требующий от пользователя принятия некоторого решения. Для этого в состав модального окна включается несколько кнопок. Если у кнопки определено свойство ModalResult, нажатие на нее приводит к закрытию модального окна и возвращает в программу значение ModalResult как результат диалога с пользователем. В Delphi определены следующие стандартные значения ModalResult:

mrNone Модальное окно не закрывается

mrlgnore Была нажата кнопка Ignore

mrOk Была нажата кнопка Oк

mrYes Была нажата кнопка Yes

mrCancel Была нажата кнопка Cancel

mrNo Была нажата кнопка No

mrAbort Была нажата кнопка Abort

mrAll Была нажата кнопка All

mrRetry Была нажата кнопка Retry

В отличие от большинства других видимых компонентов кнопка TButton является компонентом самой Windows и поэтому не может изменять свой цвет произвольным образом - она его меняет вместе с изменением палитры Windows. Кнопка всегда имеет системный цвет clBtnFace и не имеет свойства Color. Шрифт надписи на кнопке может менять свой стиль и размер, но компонент игнорирует изменение его цвета.

18.1.8. TCheckBox - независимый переключатель

Независимый переключатель TCheckBox используется для того, чтобы пользователь мог указать свое решение типа Да/Нет или Да/Нет/Не совсем (в последнем случае в окошке компонента устанавливается флаг выбора, но само окошко закрашивается серым цветом). Это решение отражается в свойстве State компонента, доступном как для чтения, так и для записи. В составе диалогового окна может быть несколько компонентов TCheckBox. Состояние любого из них не зависит от состояния остальных, поэтому такие переключатели называются независимыми.

Типичное использование компонента:

if CheckBoxl.Checked then

else

Или:

case CheckBoxl.State of cbChecked :... ;

cbUnchecked:...;

cbGrayed :...;

end;

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

type TLeftRight = (taLeftJustify, taRightJustify) ; property Alignment: TLeftRight; | Определяет положение текста: taLeftJustify - с левой стороны компонента; taRightJustify - С Правой стороны
property AllowGrayed: Boolean; | Разрешает/запрещает использование состояния cbGrayed (Не совсем)
ptoperty Caption: Strings | Содержит связанный с компонентом текст
property Checked: Boolean; | Содержит выбор пользователя типа Да/Нет. Состояния cbUnchecked и cbGrayed отражаются как False
type TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed) ; property State: TCheckBoxState | Содержит состояние компонента: cbUnchecked - нет; cbChecked - да; cbGrayed - не совсем

Свойство color компонента фактически игнорируется, а свойства Height и width определяют размеры прямоугольника, в котором выводится связанный с переключателем текст, и не влияют на размеры прямоугольного окошка. Сам текст указывается в свойстве Caption.

18.1.9. TRadioButton - зависимые переключатели

В отличие от TCheckBox компоненты TradioButton представляют собой зависимые переключатели, предназначенные для выбора одного из нескольких взаимоисключающих решений. На форму (точнее, в компонент-контейнер) помещается по меньшей мере два таких компонента. Они могут иметь только два состояния, определяемых свойством Сhecked. Если в одном компоненте это свойство принимает значение True, во всех других компонентах, расположенных в том же контейнере, свойства Сhecked принимают значения False.

Помимо свойства checked компонент TRadioButton имеет еще одно специфичное свойство - Alignment, аналогичное такому же свойству TCheckBox. Как и в TCheckBox, программист не может изменять размеры и цвет круглого окошка компонента.

18.1.10. TListBox - список выбора

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

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

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

property AutoComplete: Boolean; | Определяет, будет ли компонент автоматически получать фокус ввода при нажатии пользователем на клавиатуру
type TBorderStyle = bsNone..-bsSingle; property Border-Style: TBorderStyle; | Определяет стиль рамки: bsNone - нет рамки; bssingle - рамка толщиной 1 пиксель
property Canvas: TCanvas; property Columns: Longing; | Канва для программной прорисовки элементов Определяет количество колонок элементов в списке
property Count: Integer; | Содержит количество строк в компоненте
property ExtendedSelect: Boolean; | Если ExtendedSelect =True и MultiSelect==True, выбор элемента без одновременного нажатия Crtl или Alt отменяет предыдущий выбор
property IntegralHeight:Boolean; | Если IntegralHeight=True и Style<>lb0wner-DrawVariabe, в списке показывается целое число элементов
property ItemHeight: Integer; | Определяет высоту элемента в пикселях для Style=lbOwnerDrawFixed
property Itemlndex: Integer; | Содержит индекс сфокусированного элемента. Если MultiSelect=False, совпадает с индексом выделенного элемента
property Items: TStrings; | Содержит набор строк, показываемых в компоненте
property MultiSelect: Boolean; | Разрешает/отменяет выбор нескольких элементов
property SelCount: Integer; | Содержит количество выбранных элементов
property Selected[X: Integer] : Boolean; | Содержит признак выбора для элемента с индексом х (первый элемент имеет индекс 0)
property Sorted: Boolean; | Разрешает/отменяет сортировку строк в алфавитном порядке
type TListBoxStyle = (IbStandard, IbOwnerDrawFixed, IbOwnerDrawVariable) ; property Style: TListBoxStyle; | Определяет способ прорисовки элементов: IbStandard - элементы рисует Windows; ibOwnerDrawFixed - рисует программа, все элементы имеют одинаковую высоту, определяемую свойством ItemHeight;IbOwnerDrawVariable -рисует программа, элементы имеют разную высоту
property TabWidth: Integer; | Задает ширину табуляционного пробела
property Toplndex: Integer; | Индекс первого видимого в окне элемента

Создание элементов (опций) списка компонента реализуется с помощью методов его свойства Items - Add, Append, Insert млм LoadFromFile (CM. П. 16.3.1).

Для компонента определены два события, связанные с программной прорисовкой элементов списка:

type

TOwnerDrawState = set of (odSelecred, odGrayed, odDisabied, odChecked, odFocused) ;

TDrawItemEvent = procedure(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState) of object-property OnDrawItem: TDrawItemEvent;

type

TMeasureItemEvent = procedure(Control: TWinControl; Integer;

var Height: Integer) of object/property OnMeasureItem: TMeasureItemEvent;

Первое событие возникает в момент, когда программа должна нарисовать очередной элемент. Обработчик события получает ссылку на список выбора control, индекс изображаемого элемента index, границы элемента Rect и его состояние State. Прорисовка ведется с помощью свойства Canvas.

Примечание

> Поскольку программная прорисовка обычно связана с изображением рисунков, сохраняемых вместе с текстом в наборе Items; параметр Control задан как абстрактный объект TWinGontrol, поэтому в обработчике должно проводиться необходимое преобразование типов.

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

procedure TFormI.ListBoxIDrawItem(Control: TWinControl;

Index: Integer; Rect: TRect; State: TOwnerDrawState);

var

Bitmap: TBitmap;// Временная переменная для растра

Offset: Integer;

// Расстояние от растра до текста

begin

{Свойство Canvas имеет не только список ListBox, но и форма, на которую он помещен! Поэтому нужно явно указать канву. Преобразуем тип и указываем канву:}

with Control as TListBox, Canvas do

begin

FillRect(Rect);

// Очищаем прямоугольник

// Получаем из списка растр:

Bitmap := TBitmap(Items.Objects[Index]);

if Bitmap <> nil then

begin

// Вычерчиваем растр:

BrushCopy(Bounds(Rect.Left + 2, Rect.Top, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), cIRed);

// Вычисляем смещение текста (4 пикселя от растра):

Offset := Bitmap.width + 6;

end

else Offset := 2;

// Если нет растра, 2 пикселя слева

// Выводим текст:

TextOut(Rect.Left + Offset, Rect.Top, Items[Index]);

end;

end;

Обратите внимание: обработчик не учитывает состояния элемента. Окантовка сфокусированного элемента пунктиром, установка нужного цвета кисти и шрифта для выбранного элемента осуществляются автоматически. Если вас не устраивают стандартные цвета, следует проверять параметр state. Например, если перед

PillRect(Rect); // Очищаем прямоугольник в предыдущем примере вставить

if odSelected in State then

begin

Brush.Color := clYellow;

Font.Color := clBlack;

Font.Style := [fsBold];

end;

выбранные элементы будут подсвечены желтым фоном, а текст в них будет выведен черным утолщенным шрифтом.

Событие OnMeasureItem возникает только для Style=lbOwnerDrawVariabie. Оно предшествует событию onDrawItem, и в ходе его обработки программа должна установить нужную высоту очередного элемента. Обработчику передается индекс элемента Index и переменная Height, в которой он должен вернуть высоту элемента. Например:

procedure TForm1.ListBoxIMeasureItem(Control: TWinControl;

Index: Integer;

var Height: Integer);

var

Bitmap: TBitmap;

begin

Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]) ;

if Bitmap <> nil then

Height := Bitmap.Height

else

Height := abs(ListBoxl.Font.Height)

end;

18.1.11. TComboBox - раскрывающийся список выбора

Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TEdit, и поэтому большинство его свойств и методов заимствованы у этих компонентов. Существуют пять модификаций компонента, определяемые его свойством style:

csSimple, csDropDown, csDropDownList, csOwnerDrawFixed И csOwner DrawVariabie. В первом случае список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора (рис. 18.7). В модификации csDropDownList редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки (в других модификациях это возможно). Модификации csOwnerDrawFixed и csOwnerDrawVariable используются программной прорисовки элементов списка. Используемые для этого свойства и методы полностью совпадают со свойствами и методами TListBox аналогичного назначения.

Фактически “своими” у компонента являются лишь свойства и события, связанные с раскрытием списка:

property DropDownCount: Integer;

property DroppedDown: Boolean;

property OnDropDown: TNotifyEvent;

Рис. 18.7. Примеры комбинированных списков

Свойство DropDownCount определяет количество элементов списка, появление которых еще не приводит к необходимости прокрутки списка. По умолчанию это свойство имеет значение 8: если в списке указано 9 и более элементов (т. е. больше, чем содержит DropDownCount), при его раскрытии к окну будет добавлена полоса прокрутки. Свойство DroppedDown определяет, раскрыт ли в данный момент список. Это свойство доступно также для записи, что позволяет программно управлять состоянием списка. Событие OnDropDown происходит при изменении состояния списка.

Наполнение списка ведется методами Add, Append, Insert и т. п. его свойства Items класса TStrings (см. п. 16.3.1). По поводу использования свойства items и программной прорисовки элементов списка см. замечания в п. 18.1.10.

18.1.12. TScrollBar - управление значением величины

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

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

TSrollBarKind = (sbHorizontal, sbVertical) ; property Kind: TScrollBarKind; property LargeChange: TScroll-Barinc; | Определяет ориентацию компонента: sbHorizontal - бегунок перемещается по горизонтали; sbVertical - бегунок перемещается по вертикали “Большой” сдвиг бегунка (при щелчке мышью рядом с концевой кнопкой)
property Max: Integer; | Максимальное значение диапазона изменения числовой величины
property Min: Integers; | Минимальное значение диапазона изменения числовой величины
property PageSize: Integers; | Определяет размер позиции табуляции бегунка
property Position: Integers;property SmallChange: TScroll-Barinc; | Текущее значение числовой величины “Малый” сдвиг бегунка (при щелчке мышью по концевой кнопке)

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

procedure SetParams(APosition, AMax, AMin: Integer);

можно сразу установить свойства Position, мах и Min.

С компонентом связано два события:

type TScrollEvent = procedure(Sender: TObject;

ScrollCode: TScrollCode; var ScrollPos: Integer) of objects;

property OnScroll: TScrollEvent;

property OnChange: TNotifyEvent;

Первое возникает при любом изменении свойства position, второе -при изменении параметров методом Setparams.

Подобно TButton компонентом полностью управляет Windows поэтому у него нет свойства Color.

18.1.13. TGroupBox - панель группирования

Этот компонент служит контейнером для размещения дочерних компонентов и представляет собой прямоугольное окно с рамкой и текстом в разрыве рамки. Обычно с его помощью выделяется группа управляющих элементов, объединенных по функциональному назначению. Свойства и методы этого класса целиком унаследованы им от своих предков TCustomControi и TWincontrol и описаны в гл. 17.

18.1.14. TRadioGroup - группа зависимых переключателей

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

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

property Columns: Integers; | Определяет количество столбцов переключателей
property Itemlndex: Integer; | Содержит индекс выбранного переключателя
property Items: TStrings; | Содержит список строк с заголовками элементов. Добавление/удаление элементов достигается добавлением/удалением строк списка items (см. п. 16.3.1)

После размещения компонента на форме он пуст. Чтобы создать в нем хотя бы один переключатель, следует раскрыть редактор списка Items и ввести хотя бы одну строку: строки Items используются как поясняющие надписи справа от переключателей, а их количество определяет количество переключателей в группе. Замечу также, что после создания компонента его свойство Itemlndex по умолчанию имеет значение -1, это означает, что ни один переключатель в группе не выбран. Если в момент появления компонента на экране в каком-то переключателе выбор уже должен быть установлен, необходимо на этапе конструирования с помощью окна Инспектора объектов или программно (например, в обработчике OnActivate формы) установить в свойство ItemIndex номер соответствующего переключателя (нумерация начинается с 0). Это же свойство позволяет программе проанализировать выбор пользователя, например:

case RadioGroupl.Itemlndex of

0: ...; //Выбран 1-й переключатель

1: ...; //Выбран 2-й переключатель

else

..... //Не выбран ни один переключатель

end;

18.1.15. TPanel - панель

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

Компонент имеет развитые средства создания различных эффектов трехмерности за счет использующихся в нем двух кромок -внешней и внутренней (см. п. 17.4).

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

type TAlignment = (taLeftJustify, taRightJustify, taCenter) ; property Alignment: TAlignment; | Определяет выравнивание текста относительно границ компонента
type TBevelCut = (bvNone, bvLow-ered, bvRaised, bvSpace) ; | Определяет вид внутренней кромки: bvNone - кромки нет; bvLowered - вдавленная кромка; bvRaised - приподнятая кромка; bvSpace - то же, что и bvRaised
property BevelInner: TPanelBevel; | Определяет вид внешней кромки
property BevelOuter: TPanelBevel; type TBevelWidth = l..MaxInt; | Определяет толщину кромок
property BevelWidth: TBevelWidth; TBorderStyle = bsNone..bsSingle; property BorderStyle: TBorderStyle; | Определяет стиль рамки: bsNone - нет рамки; bsSingle - компонент по периметру обводится линией толщиной в 1 пиксель
property FullRepaint: Boolean; | Разрешает/запрещает перерисовку панели и всех ее дочерних элементов при изменении ее размеров
property Locked: Boolean; | Используется при работе с объектами OLE

Для компонента объявлено событие onResize, в обработчике которого программист может предусмотреть необходимую реакцию на изменение размеров компонента.

18.1.16. TActionList - механизм действий

Этот компонент впервые введен в Delphi 4. Он не имеет видимого изображения и служит для поддержки механизма действий (см. п. 17.7).

Основная схема его использования такова. Вначале с помощью его редактора создается действие - объект класса TAction (редактор вызывается двойным щелчком на компоненте либо с помощью опции ActionList Editor его вспомогательного меню, которое раскрывается после щелчка на нем правой кнопкой мыши - рис. 18.8).

Этот объект (на рисунке он имеет умалчиваемое имя Action1) имеет ряд свойств и событий, с помощью которых уточняется характер действия. Доступ к этим свойствам и событиям можно получить с помощью окна Инспектора объектов. С действием можно связать группу свойств (Caption, Checked, Enabled, Shortcut И Т. Д.), которыне будут помещаться в одноименные свойства компонентов, реализующих общее действие. Если с компонентом связан контейнер пиктограмм типа TImageList (свойство images - не действия, а самого компонента TActionList), при реализации действия можно использовать одну из хранящихся в нем пиктограмм (ImageIndex). Чтобы действие подкреплялось программным кодом, для него обязательно следует определить обработчик события OnExecute.

В свойства Action тех компонентов, активизация которых должна сопровождаться одним и тем же действием (например, в свойства Action опции меню и кнопки инструментальной панели), помещается имя только что определенного действия (Actioni). В результате выбор опции или нажатие кнопки вызовут один и тот же метод (OnExecute), в меню появится пиктограмма (imageindex), такая же пиктограмма будет у кнопки, у них будет одинаковые названия (caption), оперативные подсказки (Hint) И Т. Д.

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

property ActionCount: Integer; | Содержит количество определенных в компоненте действии (только для чтения)
property Actions[Index: Integer]: TContainedAction; | Позволяет программе обратиться к нужному действию (объекту класса TContainedAction) по его индексу index
property Images: TCustomImageList; | Содержит имя компонента класса TimageList
type TActionListState = (asNormal, asSuspended, asSus-pendedEnabled) ; property State: TActionListState; | Состояние действий: asNormal - нормальное; asSuspended - механизм действий отключен, их свойства Enabled не изменены; asSuspendedEnabled - механизм действий отключен, но их свойства Enabled имеют значения True

Редактор компонента создает объекты класса TAction. Свойства этого класса в основном определяют те значения, которые будут иметь одноименные свойства всех компонентов или опций меню, связанных общим действием (если, разумеется, компонент или опция меню имеет данное свойство).

Свойства TAction:

property Caption: String; | Содержит строку, которая будет устанавливаться в свойствах caption всех компонентов, связанных данным действием
property Checked: Boolean; | Содержит значение, которое будет устанавливаться в свойствах Checked
property DisableIfNoHandler: Boolean; | Указывает, будут ли запрещены для выбора связанные компоненты, если для действия не определен обработчик OnExecute
property Enabled: Boolean; | Содержит значение, которое будет устанавливаться в свойствах Enabled
property HelpContext: THelpContext; | Содержит значение, которое будет устанавливаться в свойствах HelpContext
property Hint: String; | Содержит строку, которая будет устанавливаться в свойствах Hint
property Imagelndex: Integer; | Содержит индекс изображения в хранилище, указанном в свойстве images компонента. Это изображение будет связано с компонентами данного действия
property Shortcut: TShortCut; | Содержит значение, которое будет устанавливаться в свойствах shortcut
property Visible: Boolean; | Содержит значение, которое будет устанавливаться в свойствах visible

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

События TAction:

property OnExecute: TNotifyEvent; | Возникает при щелчке мышью на одном из компонентов, связанных общим действием. Обработчик этого события должен реализовать нужное действие
THintEvent = procedure (var HintStr: String; var CanShow: Boolean) of object; property OnHint: THintEvent; | Возникает при перемещении указателя мыши над одним из связанных общим действием компонентов. Его умалчиваемый обработчик создает окно оперативной подсказки и показывает в нем строку HintStr
property OnUpdate: TNotifyEvent; | Возникает, когда очередь сообщений для приложения пуста или когда обновляется содержимое списка действий

Примечание

> В версии Delph6 введена группа компонентов (См. ниже пп. 18.2.23), обеспечивающая более мощную Поддержку механизма действий, в том числе создание настраиваемого пользовательского интерфейса, Таким образом, компонент TActionList используется лйщБ;яД&Рвместимо(дхс более разними версиями,, . .