Диспетчеризация действий на основе компонентов ActionManager, ActionMainMenuBar, ActionToolBar, CustomizeDlg

Диспетчер действий ActionManagerне только создает и хранит набор действий, как и ActionList, но и управляет полосами действий – визуальными компонентами, на которых располагаются элементы пользовательского интерфейса. К таким компонентам относятся ActionMainMenuBar – полоса главного меню, и ActionToolBar – инструментальная панель. Во время проектирования эти компоненты могут вводиться в приложение непосредственно из палитры компонентов, или создаваться простым перетаскиванием на них необходимых действий из окна Редактора Действий ActionManager. Компонент ActionManager запоминает информацию о составе набора действий и конфигурации полос действий в текстовом или двоичном файле на диске.

Пользователь может настраивать меню и инструментальные панели во время выполнения. Настройка во время выполнения может осуществляться или вызовом соответствующего стандартного действия, или обращением к специальному компоненту CustomizeDlg, перенесенному на форму. В обоих случаях используется упрощенный, по сравнению с временем проектирования, вариант диалогового окна Редактора Действий. Это окно позволяет пользователю настраивать меню и инструментальные панели, перенося на них новые действия, убирая прежние, делая те или иные инструментальные панели видимыми или невидимыми. Компонент ActionManagerобеспечивает сохранение настроек в файле на диске и автоматическую загрузку их в следующем сеансе работы с приложением.

Рассмотрим основной компонент всей этой системы – ActionManager. Перенесите на форму компонент ImageList1(страница Win32) и компонент ActionManager1 (страница Дополнительно).Свойство Images компонента ActionManager указывает на компонент ImageList, содержащий пиктограммы, используемые для обозначения действий. Сошлитесь в свойстве Images компонента ActionManager1 на список ImageList1.

Свойство State определяет реакцию на действия пользователя. Значение asNormal соответствует нормальной рабочей реакции: при щелчке пользователя на доступных интерфейсных компонентах действий выполняются соответствующие действия. Два других значения – asSuspendedиasSuspendedEnabled отключают возможность выполнения действий. Щелчок пользователя не приводит ни к каким результатам. Эти значения State используются при настройке пользователем меню и инструментальных панелей. Различие этих двух значений в том, что первое не изменяет свойства Enabled действий, а второе переводит во всех действиях Enabledв true. Таким образом, полосы действий перейдут в состояние настройки после выполнения оператора

ActionManager1->State = asSuspended;

Свойство FileNameзадает имя файла, в котором ActionManager хранит информацию о составе связанных с ним полос действий. В начале выполнения приложения ActionManager читает информацию из этого файла и в соответствии с ней формирует полосы действий. А при любых изменениях настройки в процессе выполнения ActionManager записывает в этот файл проведенные изменения. Так что при следующем сеансе работы состав полос действий будет таким, каким сделал его пользователь в предыдущем сеансе.

Примечание. При изменении полос действий в процессе проектирования нужно задавать значение FileName по окончании проектирования, так как в противном случае в файле будет сохранено состояние полос действий предыдущего сеанса. Если же потребовалось изменить полосы действий после того, как было задано значение FileName, то нужно предварительно удалить с диска файл, в котором запоминается состояние. В этом случае при очередном выполнении приложения этот файл создастся заново.

Если в процессе проектирования впервые задается значение FileName, надо просто записать в этом свойстве имя файла с путем к нему. При отсутствии пути файл будет создан в том каталоге, в котором расположен проект. Если же нужно задать в качестве значения FileName имя уже существующего файла, то можно воспользоваться для его выбора кнопкой с многоточием около свойства FileName в окне Инспектора Объектов.

Перейдем к рассмотрению основного инструмента проектирования – Редактора Действий компонента ActionManager1. Двойным щелчком на компоненте вызывается окно Редактора Действий (Редактирование Form1->ActionManager1) на странице Действия с пустыми панелями Категории: и Действия:. Щелкнем правой кнопкой мыши и, выполнив соответствующие команды, введем стандартные действия категорий Правка и Файл. После этого в панели Действия: появятся имена объектов этих действий, а в панели Категории: – их категории. Если выделить какое-то действие, то в Инспекторе Объектов будут видны свойства, которые можно изменить: Caption,Hint,ShortCut и другие. Вторая часть строки свойства Hint отображается в окне Редактора Действий в панели Описание. Можно изменить также категории действий – их свойства Category. Если в компоненте ActionListпонятия категорий лишены определенного смысла, то здесь – при создании меню названия категорий станут надписями головных разделов меню.

Перейдите на страницу Панели окна Редактора Действий. Сейчас оно пусто. Со страницы Дополнительноперенесите на форму компоненты ActionMainMenuBar1 (полоса главного меню)иActionToolBar1 (панель). Снова перейдите в окно Редактора Действий. Страница Панели остается пустой. Перейдите на страницу Действия и перетащите с нее мышью в полосу меню категории Правка и Файл, а на панель – категорию Правка. Действия можно перетаскивать и поодиночке. Но если в меню перетаскивается категория, то она становится головным разделом меню. Снова перейдите на страницу Панели и убедитесь, что в ее окне появился список из управляемых диспетчером ActionManager1 полосы главного меню (компонент ActionMainMenuBar1) и инструментальной панели (компонент ActionToolBar1). Кнопкой Новый…добавьте вторую инструментальную панель и перетащите на нее категорию Файл. Следовательно, компонент ActionToolBar можно добавлять на форму как переносом из палитры компонентов, так и с помощью Редактора Действий. Кнопкой Удалить на странице Панели можно удалить выделенную панель или меню из списка и вообще из приложения.

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

Вызовите окно Редактора Действий и перейдите на страницу Панели. Индикаторы (пометки) около названий полос действий (меню, инструментальных панелей) управляют их видимостью. Если выключить индикатор, то во время выполнения соответствующая полоса будет невидимой. Убедитесь в этом.

Выделите одну из полос действий на странице Панели окна Редактора Действий и просмотрите в Инспекторе Объектов ее свойства. В свойствах Caption (надпись) измените значения соответственно на Главное меню, Инструментальная панель 1, Инструментальная панель 2. Обратите внимание на свойство AllowHiding. Оно разрешает (при значении true) или запрещает делать полосу невидимой в процессе выполнения. Если задать AllowHiding=false, то в Редакторе Действий такая полоса отображается серой (полоса Главное меню). Для такой полосы ни во время проектирования, ни во время выполнения невозможно переключить индикатор видимости. Полоса будет видна всегда.

Выпадающий список Опции надписи управляет способом отображения надписей действий в выделенной инструментальной панели в окне Панели:. Убедитесь, что значение Noneсоответствует отсутствию надписей. Отображаются только пиктограммы. Но если пиктограммы нет, то надпись все равно отображается. Значение All обеспечивает отображение надписей для всех действий. Индикатор Применить опции надписи ко всем панелям распространяет выбранную опцию на все инструментальные панели.

Если в списке Опции надписи задано значение Selective, то, выделив на панели то или иное действие (например, Удалить), можно в Инспекторе Объектов установить значение свойства ShowCaption, определяющего видимость надписи (trueилиfalse). Но если для действия пиктограммы нет (например, Выбрать все), то ShowCaption установить в false невозможно.

Если в списке Опции надписи задано значение Noneили All, то установка значений свойств ShowCaption отдельных действий ни на что не влияет. Все определяется заданным свойством инструментальной панели.

Страница Опции Редактора Действий позволяет задать некоторые опции отображения. Индикатор Показ меню последних используемых элементов делает меню перестраиваемым, причем первыми располагаются разделы, которые недавно использовались. Если этот индикатор включен, то диспетчер действий при каждом очередном выполнении приложения проверяет, давно ли пользователь обращался к тому или иному разделу меню. Если на протяжении нескольких сеансов работы какие-то разделы не использовались, они делаются невидимыми. Их можно увидеть, только развернув меню полностью. Таким образом, меню перестраивается от сеанса к сеансу, делая видимыми и легко доступными те разделы, к которым пользователь обращается чаще всего.

Кнопка Сброс данных восстанавливает первоначальные установки полос действий. Индикатор Большие значки приводит к отображению в полосах действий больших пиктограмм. Индикатор Показ подсказок панели управляет появлением всплывающих ярлычков у элементов инструментальных панелей. А индикатор Показ подсказок ярлыков определяет включение в тексты этих ярлычков обозначений «горячих» клавиш. Выпадающий список Анимация меню определяет анимацию при отображении меню.

 

Задание. Построить приложение, содержащее окно редактирования Memo, полосу главного меню с разделами Файл, Правка и Сервис, а также две инструментальные панели, одна из которых должна дублировать основные разделы меню Правка, а другая – основные разделы меню Файл. Меню Файл должно содержать разделы Открыть, Сохранить, Сохранить как, Выход. Меню Правка должно содержать разделы Вырезать, Копировать, Вставить, Выделить все, Отменить, Удалить. Меню Сервис должно иметь один раздел Настройка, позволяющий пользователю настроить полосу главного меню и инструментальные панели.

 

1.Начните новое приложение, в свойство Caption формы впишите Тестовое приложение, перенесите на форму компоненты Memo1, ImageList1, ActionMainMenuBar1и ActionManager1. В компоненте ActionManager1установите свойство Images равным ImageList1, связав тем самым диспетчер действий со списком изображений.

2.Сделайте двойной щелчок на компоненте ActionManager1. В открывшемся окне Редактора Действий перейдите на страницу Панели и дважды нажмите на кнопку Новый…, чтобы добавить в приложение две инструментальные панели.

3.Перейдите в окне Редактора Действий на страницу Действия и щелкните правой кнопкой мыши. Выберите в контекстном меню команду Новое стандартное действие. В открывшемся списке стандартных действий выделите все действия категории Правка (для выделения группы действий, расположенных подряд, надо держать нажатой клавишу Shift), действия TFileOpen, TFileSaveAs и TFileExit категории Файл (для выделения группы действий, не расположенных подряд, надо держать нажатой клавишу Ctrl) и действие TCustomizeActionBars категории Tools. Нажмите кнопку OK.

4.В окне Редактора Действий на странице Действия появятся введенные действия. Чтобы ввести еще одно, нестандартное действие – Сохранить, перейдите в левой панели окна в категорию Файл и нажмите кнопку New Action (Ins) или выберите аналогичный раздел из контекстного меню. В правой панели окна появится новое действие с именем Action2.

5.Выделите действие Action2. В Инспекторе Объектов задайте имя (Name) FileSave1, надпись (Caption) &Сохранить, текст подсказки (Hint) Сохранить|Сохранить активный документ в файле и «горячие» клавиши (ShortCut)F2. Задайте этому действию пиктограмму, добавив в ImageList1изображение filesave.bmp из набора изображений Buttons.

6.Выделите действие Выход. Задайте текст подсказки (Hint) Выход|Завершение работы.

7.Выделите действие Customize категории Tools. Задайте надпись (Caption) Настройка, свойство Category –Сервис. Задайте этому действию пиктограмму, добавив в ImageList1изображение many2mny.bmp из набора изображений Buttons.

8.С помощью кнопок со стрелками установите для каждой категории нужную последовательность действий. Например, для категории Файл действие Сохранить поместите между действиями Открыть... и Сохранить как… .

9.Перенесите действия на полосы действий следующим образом. Выделите в левой панели окна Редактора Действий на странице Действия категорию Файл и перетащите ее мышью на полосу главного меню ActionMainMenuBar1. То же проделайте для категорий Правка и Сервис. В главном меню появятся выпадающие меню Файл, Правка и Сервис со всеми разделами данных категорий. Аналогичным образом можно формировать и инструментальные панели ActionToolBar. Если перетащить на панель категорию, на нее перенесутся все действия. Но можно перетаскивать и действия по одному. Если окажется, что на панель или в меню перетащено лишнее действие, его можно удалить, просто перетащив мышью. Но это можно сделать и при закрытом Редакторе Действий. Итак, на первую инструментальную панель перетащите категорию Правка, затем – Сервис, а на вторую – по одному – действия категории Файл.

10.Задайте в свойстве FileName компонента ActionManager1 имя файла, в котором будет сохраняться информация о конфигурации меню и панелей. Со страницы Стандарт перенесите на форму индикатор с флажком CheckBox1и задайте ему надпись Индикатор. После этого выполните приложение. Вопреки ожиданию, может оказаться сразу доступной кнопка Вставить. Это означает, что в данный момент в буфере обмена оказался текст. Нажмите клавишу Print Screen, занеся в буфер обмена изображение экрана, и кнопка Вставить станет недоступной. Убедитесь в правильном функционировании приложения. Команды редактирования в меню и инструментальных панелях доступны, если в фокусе находится окно редактирования. (Для перевода фокуса щелкните на компоненте CheckBox1.) При этом команды Вырезать, Копировать, Удалить доступны, только если в окне выделен какой-то текст. Команда Вставить доступна, только если в буфере обмена в данный момент находится текст. Команда Отменить доступна, только если была проведена какая-то операция редактирования.

11.Выполните команду Настройка. Откроется диалоговое окно Customize, подобное окну Редактора Действий, с такими же страницами – Actions (Действия), ToolBars (Панели), Options(Опции). Отличия: на странице Actions отсутствуют кнопки создания и удаления действий и нет контекстного меню. На странице ToolBars отсутствуют кнопки Новый…, Удалить, а вместо них имеется кнопка Reset, восстанавливающая начальное состояние панелей и меню. Следовательно, пользователь имеет возможность во время выполнения произвести настройку меню и панелей, сделать какие-то инструментальные панели невидимыми и т.п. Поэкспериментируйте с настройками на страницах ToolBars и Options.

12.В предыдущем пункте вызов диалогового окна настройки осуществлялся стандартным действием TCustomizeActionBars. То же самое можно сделать с помощью компонента CustomizeDlg. Добавьте на форму компонент CustomizeDlg1 (страница Дополнительно) и свяжите его свойством ActionManager с диспетчером действий ActionManager1. А в обработчик щелчка на какой-нибудь кнопке, но, поскольку ее нет, то в обработчик двойного щелчка на форме (событие OnDblClick) вставьте оператор CustomizeDlg1 ->Show(); Этот оператор вызовет диалог настройки и позволит реализовать все его возможности. Убедитесь в этом, запустив приложение на выполнение.

13.Перейдем к реализации команд работы с файлами. Пока команда Сохранить вообще недоступна, так как не написан обработчик соответствующего события. А команды Открыть и Сохранить как вызывают соответствующие стандартные диалоговые окна, но результат выбора файла в этих окнах нигде не используется. Да и сами диалоги выглядят неполноценными, так как в них отсутствуют шаблоны типов файлов. Откройте двойным щелчком на ActionManager1 Редактор Действий и на странице Действия выделите действие Открыть. В Инспекторе Объектов откроются свойства этого действия, и среди них – свойство Dialog. Это объект того диалога, который вызывается данным действием. Раскройте щелчком на Dialog его свойства и задайте расширение по умолчанию (DefaultExt) txt и фильтры (Filter) в редакторе фильтра следующим образом

Имя фильтра Фильтр

текстовые(*.txt, *.doc) *.txt; *.doc

все файлы *.*

и нажмите кнопку OK. Проведите аналогичную операцию с диалогом, вызываемым действием Сохранить как.

14.Перейдем к составлению операторов, использующих результаты вызова этих диалогов. Введем глобальную переменную

AnsiString FileName;

для имени файла, в котором надо сохранять текст окна Memo1. При выполнении действий, связанных с вызовом диалога, наступают события BeforeExecute(перед вызовом диалога), OnAccept(если пользователь в диалоге произвел выбор и нажалOK), и OnCancel (если пользователь в диалоге не произвел выбор и нажал кнопку Отказ или клавишуEsc). Для команды Открыть надо написать только обработчик события OnAccept:

FileName=FileOpen1->Dialog->FileName;

Memo1->Lines->LoadFromFile(FileName);

Первый оператор этого обработчика запоминает имя выбранного пользователем файла в переменной FileName. Это имя потребуется, если в дальнейшем пользователь захочет сохранить отредактированный текст в файле. Второй оператор загружает файл в компонент Memo1. Чтобы написать этот обработчик, надо в окне Редактора Действий выбрать действие Открыть и затем обычным образом, щелкнув в Инспекторе Объектов рядом с соответствующим событием, занести в текст указанные операторы.

15.Для команды Сохранить как надо написать обработчики событий BeforeExecute и OnAccept. В первом из них надо занести в диалог имя файла FileName как предлагаемое по умолчанию:

FileSaveAs1->Dialog->FileName=FileName;

В обработчике события OnAccept надо запомнить имя выбранного пользователем файла и сохранить в этом файле текст из окна Memo1:

FileName=FileSaveAs1->Dialog->FileName;

Memo1->Lines->SaveToFile(FileName);

16.Действие Сохранить – нестандартное, и поэтому его реализация записывается в обработчике события OnExecute. Но прежде надо проверить, запомнено ли в переменной FileNameимя файла. Если запомнено, то текст окна Memo1 надо сохранить в этом файле. А если переменная FileName пуста, значит еще неизвестно, в каком файле надо сохранять текст. В этом случае надо вызвать действие Сохранить как, чтобы пользователь мог указать имя файла. Для вызова любого действия используется метод Execute. Так что требуемую логику можно осуществить оператором:

if(FileName!="")

Memo1->Lines->SaveToFile(FileName);

else FileSaveAs1->Execute();

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