
Работа со стандартными действиями
Теперь рассмотрим другую команду окна редактора действий — команду New Standard Action (новое стандартное действие). Она открывает окно (рис. 3), в котором вы можете выбрать из списка необходимое вам стандартное действие (или сразу несколько действий). Действия в списке сгруппированы по категориям, В Delphi 5 список включает 26 действий. А в Delphi 7 этих стандартных действий уже 66. Стандартные действия охватывают операции редактирования текстов (категория Edit), форматирования текстов (категория Formal), поиска в текстах (категория Search), работу со справками (категория Help), с файлами (категория File), с окнами в приложениях MDI (категория Window), с многостраничными панелями (категория Tab), списками (категория List), стандартными диалогами (категория Dialog), с Интернет (категория Internet), наборами данных (категория DataSet) и некоторые другие.
Рис. 3Окно выбора стандартных действий
Проведем простой эксперимент, который позволит понять отличие стандартных действий от нестандартных.
Перенесите на форму компоненты ActionList иImageList. Сошлитесь в свойствеImages компонентаActionList на списокImageList. Теперь перейдите в окно редактора действий, вызовите окно рис. 3, выделите в нем действия категории Edit и действиеTFileExit категории File, нажмите кнопку ОК.
Вы вернетесь в окно редактора действий (рис. 4.), и увидите, что в список занеслись выбранные вами действия, причем большинство из них имеют пиктограммы, хотя вы никаких пиктограмм в компонент ImageList не вводили. Вы можете выделитьImageList и убедиться, что в него автоматически занеслись пиктограммы выбранных действий. Правда, не все пиктограммы могут вас удовлетворить. Но это уже ваше дело заменить их другими и добавить пиктограммы для действий, автоматически с пиктограммами не связанных. Автоматическое занесение пиктограмм в список действий произойдет только в том случае, если до создания соответствующих объектов событий компонентActionList был подключен кImageList. В противном случае объекты появятся вActionList без пиктограмм. Именно поэтому рекомендуется с самого начала связать с компонентомActionList пусть даже пустой списокImageList.
Рис. 4Окно редактора действий с занесенными в него объектами стандартных действий
Теперь выделите в окне рис. 4. какое-то действие и посмотрите в Инспекторе Объектов его свойства. Во-первых, вы увидите, что класс объектов стандартных действий не TAction. Каждый вид стандартного действия имеет класс, производный отTAction. Названия этих классов вы можете видеть на рис.3. В Инспекторе Объектов вы можете увидеть, что в стандартные действия заложены общепринятые значения множества свойств: надписи(Caption), подсказки(Hint), горячие клавиши(ShortCnt). Впрочем, если вы делаете приложение для отечественного пользователя, то от этих значений мало проку: все равно надписи и подсказки надо переводить на русский язык, а горячие клавиши не всегда те, которые вы хотите, и их тоже может потребоваться изменять.
Но самое главное отличие стандартных объектов действий от нестандартных заключается в том, что для стандартных действий не надо писать обработчики событий OnExecute.
Все операции, необходимые для выполнения стандартных действий уже заложены в их объекты. Они не только не требуют обработчиков событий OnExecute, но могут реализоваться через горячие клавиши далее без инициаторов действий — разделов меню, кнопок и т.п.
Чтобы убедиться во всем этом, давайте продолжим наш эксперимент. Добавьте на форму инструментальную панель ToolBarи свяжите ее свойствомImages со списком изображенийImageListl. Установите вToolBar в true свойствоShowHint. А теперь создайте на инструментальной панели быстрые клавиши для всех действий, имеющих пиктограммы. В каждой новой кнопке ссылайтесь в свойствеAction на соответствующее действие.
Добавьте на форму нашего тестового приложения какие-нибудь окна редактирования, например, так, как показано на рис. 5. Теперь выполните приложение.
В начале вы увидите, что все кнопки, кроме кнопки выхода, недоступны. Это оправдано, поскольку никакой текст не выделен, так что нечего копировать или вырезать, и никакого редактирования не было, так что нечего отменять. Может оказаться доступной только кнопка Вставить (Paste, если вы не переводили подсказки на русский язык). Доступной она будет, если в буфере обмена в данный момент находится текст. Но нажмите, например, клавишу компьютера Print Screen, занеся в буфер обмена изображение экрана, и кнопка Вставить станет недоступной. Чувствуете, какое умное поведение. Если вы выделите текст в одном из окон редактирования, то, пока это окно в фокусе, будут доступны кнопки Копировать (Сору), Вырезать (Cut), Удалить (Delete). Если вы провели какую-то операцию редактирования, станет доступна кнопка Отменить (Undo). Но стоит вам переместить курсор в другое окно редактирования, где нет выделения и не было редактирования, как эти кнопки станут недоступны.
Рис. 5 Окно тестового Приложения
Таким образом, в стандартные действия заложено достаточно интеллектуальное поведение. Они относятся всегда к тому элементу, который находится в фокусе (в данном примере — к находящемуся в фокусе окну редактирования), и доступность их в каждый момент автоматически определяется возможностью выполнения того или иного действия. Представляете, сколько кода вам надо было бы написать, чтобы реализовать подобное поведение, включая тестирование формата, занесенного в буфер обмена, определение окна, находящегося в фокусе, и определение выделения в нем? Вы не написали ни одного оператора, а получили такой эффект благодаря возможностям, заложенным в стандартных действиях.
Но учтите, что почти весь «интеллект» стандартного действия может исчезнуть, если вы введете для такого действия свой обработчик события OnExecute. Тогда вам придется все реализовывать самому. Так что для многих стандартных действий не следует писать обработчиков событийOnExecute.
Интересно, что доступ к стандартным действиям через горячие клавиши сохраняется, даже если в приложении отсутствуют их инициаторы или они недоступны. Например, задайте для действия FileExit1, обеспечивающего выход из приложения, горячие клавиши Ctrl-E. Сделайте невидимой инструментальную панельТооlBar1 (Visible = false) и снова запустите приложение. Ни один управляющий элемент не будет доступен. Но все горячие клавиши будут действовать. В частности, если вы нажмете Ctrl-E, приложение закроется. Так что стандартные действия могут работать и «за кадром».
Отметим одно свойство действий, связанных с вызовом стандартных диалогов Windows, Эти действия (классы TFileOpen, TFileSaveAs, TFilePrintSetup, TSearchFind, TSearchReplace, TSearchFindFirst, TOpenPicture, TSavePicture, TColorSelect, TFontEdit, TPrintDlg) имеют свойство Dialog — объект соответствующего диалога.
Таким образом, эти стандартные действия не требуют явного ввода в приложение компонентов-диалогов и явного их вызова. Но зато они имеют события:
BeforeExecute наступает перед вызовом диалога
ОnАсcept наступает, если пользователь в диалоге произвел выбор и нажал ОК. В обработчике которого можно прочитать выбор пользователя. Например, если в приложении имеется компонентMemol и действиеFileOpenl, загружающее вMemol текст из выбранного пользователем файла, то обработчик событияOnAccept этого действия должен иметь вид:
Memol.Lines.LoadFromFile(FileOpenl.Dialog.Filename);
OnCancel наступает, если пользователь в диалоге не произвел выбор и нажал кнопку Отказ или клавишу Esc.