Первые две возможности в этом списке используются относительно редко. Тем не менее они полезны, если вам нужно глобально добавлять/удалять/разрешать/запрещать действия.
Введение события OnUpdate является очень хорошей находкой, о нем напишем подробно. И автор этих строк, и, возможно, вы потратили немало времени, чтобы в разрабатываемых программах элементы управления находились в актуальном состоянии. Если, скажем, вашей программой открыт первый файл, то нужно активировать ряд кнопок и пунктов меню (Save, Save as, Print и т. п.); как только закрыт последний - отключить их. Если в буфере обмена есть что-то подходящее, необходимо активизировать пункт меню и кнопку Paste, если нет - отключить. В результате код, отслеживающий это, у неопытных программистов "размазывается" по всему приложению. А ведь можно поступить проще. Событие TAction.OnUpdate возникает в моменты простоя приложения, т. е. тогда, когда оно не занято обработкой сообщений (цикл содержится в методе idle объекта Application). Это гарантирует, что оно возникнет ДО ТОГО, как пользователь щелкнет мышью и увидит выпадающие пункты меню; поэтому можно успеть обновить их состояние. Пример использования события OnUpdate:
procedure TForml. PasteActionUpdate (Sender: TObject) ;
begin
TAction(Sender).Checked := Clipboard.HasFormat(CF_TEXT);
end;
Перед вызовом события OnUpdate также происходит 4-этапная последовательность действий, точно такая же, как при OnExecute.
Третье событие имеет такой тип:
THintEvent = procedure (\ar HintStr: string;
var CanShcw: Boolean) of object;
Оно вызывается тогда, когда от элемента управления требуется показать подсказку, связанную с данным действием. В обработчике события можно указать, будет ли что-нибудь показываться (параметр CanShow) и, если да, то что именно (параметр Hintstr).
Это были события, относящиеся к компоненту TAction. Сам компонент TActionList также имеет три события: OnExecute, OnUpdate И OnChange. О первых двух мы уже сказали; третье происходит в момент изменения списка (добавления или удаления действий).
Свойства, распространяемые на клиентов действия
Если у нескольких кнопок или пунктов меню общий обработчик, разумно потребовать, чтобы у них были и другие общие свойства. Так оно и реализовано в Delphi. В табл. 8.1 перечислены свойства, чье значение автоматически распространяется на всех клиентов данного действия.
Таблица 8.1. Свойства компонента TAction, автоматически распространяемые на всех его клиентов
Свойство |
Назначение |
|
Заголовок, связанный с действием |
|
Подсказка к действию |
|
Устанавливает, разрешено/запрещено ли действие |
|
Устанавливает, отмечено ли действие |
|
Индекс группы, в которую входит действие. Объекты TAction с одним значением этого свойства (причем бблыиим нуля) имеют зависимое переключение. Если свойство Checked любого объекта из группы устанавливается в True, у остальных оно сбрасывается в False |
|
Установка в True автоматически меняет значение свойства Checked на противоположное после каждого выполнения действия |
|
Индекс картинки в общем наборе картинок (набор указывается в свойствах родительского TActionList) |
|
Указывает на тип значения, связывающего действие с разделом системы помощи (htKeyword/htContext) |
|
Если свойство HelpType установлено в htContext, это свойство содержит ID раздела системы помощи |
Таблицав. 1 (окончание) |
|
Свойство |
Назначение |
|
Если свойство Не1рТуре установлено в |
г^Кеуюогй, то свойство содержит ключе- |
|
вое слово (термин), по которому происхо- |
|
дит открытие соответствующего раздела |
|
системы помощи |
Вы привыкли к программам с картинками в меню и на панелях инструментов? Действие также можно снабдить картинкой. Компонент ТАсііопІлзІ; связывается со списком картинок тгтадеЫзг., а действие ТАстіоп - с конкретной картинкой через свойство ітадеіпсіех. Таким образом, все элементы управления, связанные с действием, - кнопки и пункты меню - будут иметь одну и ту же картинку, как показано на рис. 8.3. Впрочем, это относится ко всем остальным свойствам из табл. 8.1.