SNK Software
Web Studio Монополия Metaproducts Утилиты Игры
Монополию Web Studio Библиотека
Вебмастер Дельфи Работа на ПК Самоучитель
Для PHP Для Delphi
Веб-дизайн Программирование Компьютеры Девайсы Заметки
SNK Software Индустрия hardware Индустрия software
О студии Портфолио Сопровождение сайтов

Новые материалы

Девайсы:
Сравнительный обзор Nokia Lumia 920 и HTC 8X
Девайсы:
Обзор Nokia Lumia 820 – смартфона на WP8
Вебмастеру:
Настройка Apache, PHP и MySQL для Linux-VPS
Вебмастеру:
VPS на домашнем ПК: настройка сети в VM VirtualBox и Debian
Вебмастеру:
VPS на домашнем ПК: устанавливаем Linux Debian 6
Вебмастеру:
VPS на домашнем ПК: установка VM VirtualBox
Работа на компьютере:
Иные возможности текстового процессора Word
Работа на компьютере:
Вставка объектов
Работа на компьютере:
Таблицы в Word
Работа на компьютере:
Печать и сохранение документов
Работа на компьютере:
Сноски, колонтитулы, оглавление и указатели в Word

Меню и стандартные действия

В продолжение темы стандартных VCL-компонент рассмотрим главное меню приложения и списки предопределенных стандартных действий (вроде копирования и вставки в буфер обмена, открыть/закрыть файл и т.п.) - коллекций действий в Дельфи.

Меню

К настоящему моменту мы уже рассмотрели все визуальные компоненты, расположенные на закладке Standard палитры компонентов Delphi. Однако на ней имеются все еще не упомянутые компоненты, без которых невозможно представить ни одного сколько-нибудь серьезного приложения. Это – меню.

Всего существует 2 типа меню – главное меню – то, что располагается непосредственно под заголовком окна программы, и локальное, всплывающее или контекстное меню, привязанное к тому или иному элементу управления. И если главное меню предназначено для управления работой всего приложения, то каждое контекстное меню служит для управления каким-либо конкретным элементом интерфейса.

Для создания главного меню в VCL предусмотрен компонент MainMenu, а для контекстного – PopupMenu. Оба они происходят от класса TMenu, и имеют некоторые общие свойства. В частности, свойство AutoHotkeys определяет, должны ли автоматически назначаться символы для быстрой навигации по меню (вы видите их подчеркнутыми при нажатой клавише Alt). А свойство AutoLineReduction определяет, должны ли автоматически удаляться повторяющиеся строки-разделители. Оба эти свойства могут принимать значения maAutomatic и maManual.

Так же у них присутствуют свойства Images, позволяющие привязать к меню коллекцию изображений, и Items, являющиеся хранилищем самих пунктов меню.

Что касается индивидуальных свойств этих компонентов, то здесь для нас наибольший интерес представляют настройки контекстного меню. Так, свойство Alignment определяет, в какой позиции относительно указателя мышки должно появиться меню. Допускается выравнивание его левого верхнего угла по левому краю (paLeft, принято по умолчанию), по правому (paRight) и по центру (paCenter). Другое свойство, AutoPopup, Отвечает за появление контекстного меню на экране. Если оно установлено в истину, то меню будет появляться автоматически при щелчке правой клавишей мышки по компоненту, к которому это меню привязано. Если же установить значение этого свойство в ложь, то процесс появления меню должен будет контролироваться программно. Отметим, что для показа контекстного меню таким способом следует использовать метод Popup. Например, чтобы привязать всплытие меню к любому щелчку мышки по форме, можно написать примерно такой обработчик события для onClick:

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin PopupMenu1.Popup(X, Y); end;

Единственным спорным моментом в данном случае будет место появления меню. Дело в том, что аргументами X и Y, передаваемыми обработчику события onClick формы будут локальные координаты, отсчитываемые от верхнего левого угла ее окна. В то же время для метода Popup необходимы координаты относительно всего экрана (т.е. как для объекта Screen). Выходом из данной ситуации будет использование информации о координатах самой формы, которые так же привязаны к глобальной системе координат:

PopupMenu1.Popup(Form1.Left+X,Form1.Top+Y);

В принципе, всех уже перечисленных свойств, вкупе с методом Popup, вполне достаточно для того, чтобы приступить к использованию меню. Однако не следует забывать, что состав меню определяется его свойством Items – коллекцией пунктов меню. При этом каждый пункт представляет собой объект класса TMenuItem. Именно его свойства мы и рассмотрим, для чего обратимся к таблице 12.6.

Таблица 12.6. Свойства MenuItem
СвойствоТипОписание
ActionTBasicActionСсылается на действие, связанное с данным пунктом меню. Все остальные свойства этого пункта меню в таком случае задаются косвенно, посредством компоненты ActionList
AutoCheckBooleanОпределяет, должен ли данный пункт менять свое свойство Checked при его выборе пользователем
AutoHotkeysTMenuItemAutoFlagОпределяет, должны ли автоматически назначаться символы для быстрой навигации по подменю.
AutoLineReductionTMenuItemAutoFlagОпределяет, должны ли автоматически удаляться повторяющиеся строки-разделители
BitmapTBitmapПозволяет назначить индивидуальное графическое изображение данному пункту меню
BreakTMenuBreakОпределяет, является ли данный пункт началом нового столбца меню. Может принимать значения mbNone, nbBreak и mbBreakBar
CaptionStringОпределяет заголовок пункта меню. Если в качестве заголовка использовать символ "-", то на месте такого пункта будет отображаться разделительная линия
CheckedBooleanОпределяет, является ли данный пункт меню отмеченным. Если да, то он выделяется соответствующей меткой
CountIntegerУказывает на количество пунктов подменю в данном пункте меню. Нулевое значение означает, что подменю нет
DefaultBooleanОпределяет, является ли данный пункт выбранным по умолчанию. Такие пункты выделяются полужирным шрифтом и автоматически вызываются при двойном щелчке по родительскому пункту меню
EnabledBooleanОпределяет, является ли данный пункт доступным
ImageIndexIntegerУказывает на порядковый номер изображения в коллекции (компонент ImageList), связанного с данным меню
ItemsTMenuItemsОпределяет массив пунктов вложенного подменю
RadioItemBooleanОпределяет, является ли данный пункт составной частью взаимоисключающих пунктов меню
ShortCutTShortCutОпределяет сочетание горячих клавиш для быстрого вызова данного пункта
VisibleBooleanОпределяет, должен ли данный пункт быть видимым пользователю

Очевидно, что поскольку любой пункт меню может содержать собственное подменю, то он должен иметь и свойства, характерные для основного компонента меню. Поэтому мы здесь снова видим AutoHotkeys и AutoLineReduction, которые, в дополнение к значениям maAutomatic и maManual могут также принимать значение maParent, что делает возможным наследование значения этих свойств от основного меню. Возможностью иметь дочерние подменю объясняются и такие свойства, как Count и Items. Что касается всех остальных свойств, то они предназначены для управления видом и поведением данного пункта меню.

Наиболее востребованными свойствами являются Caption и ShortCut. В большинстве случаев вам придется непосредственно работать только с этими двумя свойствами, лишь иногда прибегая к таким свойствам, как, скажем, Checked или ImageIndex. В то же время, некоторые свойства, например такие, как Visible или Enabled, редко определяются в процессе создания приложения. Для этих целей необходимо использовать соответствующий программный код, который будет изменять их состояние в зависимости от текущей ситуации. В качестве типичного примера можно привести функцию вставки из буфера обмена: если в нем ничего нет, то многие программы автоматически соответствующий пункт меню его недоступным. Фактически, для этого свойство Enabled устанавливается в значение «ложь».

Вообще же для создания меню в Delphi IDE предусмотрен специальный редактор, позволяющий наглядно создавать и редактировать как главное меню, так и контекстные. Для того, чтобы им воспользоваться, достаточно поместить нужный компонент (MainMenu или PopupMenu) на форму, после чего воспользоваться его собственным контекстным меню. Первым пунктом будет Menu Designer, и как раз он и вызывает нужный редактор, называемый конструктором меню (рис. 12.7).

СОВЕТ
Подобно обычным визуальным компонентам вроде кнопки или поля редактирования, компоненты, подобные MainMenu, так же могут быть настроены на «действие по умолчанию», происходящее при двойном щелчке мышки. Для рассматриваемых компонентов таким действием как раз будет вызов конструктора меню.

Конструктор меню Дельфи с раскрытым собственным контекстным меню
Рис. 12.7. Конструктор меню с раскрытым собственным контекстным меню

При помощи этого конструктора можно создавать меню, причем его внешний вид будет практически соответствовать тому, что получится на самом деле. Если в процессе работы щелкнуть правой кнопкой мышки по созданному пункту меню, то откроется контекстное меню самого редактора, при помощи которого этот пункт можно удалить (delete), либо добавить (Insert) вслед за ним новый, или же сделать данный пункт родительским для собственного подменю (Create Submenu). При этом свойства выбранного в данный момент пункта меню, видны и доступны для правки в инспекторе объекта.

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

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

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

Коллекция действий

При описании компонент, реализующих меню, мы уже сталкивались с некими действиями (actions). Действия объединяются в списки при помощи компонента ActionList, в котором все они будут храниться.

ПРИМЕЧАНИЕ
Компонент ActionList был введен в Delphi 6 для обеспечения межплатформенной совместимости. В то же время, в Delphi имеется и другой компонент аналогичного назначения, предоставляющего еще больше возможностей – ActionManager.

Списки действий обычно используют для того, чтобы определить реакцию программы на те или иные действия пользователя. С одной стороны, это несколько дольше, чем просто присвоить какой-либо кнопке или пункту меню действие для, скажем, обработки события onClick. Но с другой, это позволяет хранить все действия централизованно, что, в конечном счете, упрощает процесс разработки приложения тем, что если действия для какого-то пункта меню и для другого элемента (скажем, кнопки на панели инструментов) совпадают, то им обоим можно присвоить одно действие. Кроме того, для целого ряда стандартных операций вроде работы с буфером обмена, открытия или сохранения файла, а так же для стандартных действий с окнами MDI-приложений, предусмотрены уже готовые действия.

Все операции по созданию и настройке действиями производятся в специальном окне компонента ActionList (рис. 12.8), которое вызывается либо из контекстного меню этого компонента (пункт Action List Editor), либо двойным щелчком мышки – в точности подобно тому, как это реализовано для компонент-меню.

Окно редактора списка действий и его контекстное меню
Рис. 12.8. Окно редактора списка действий и его контекстное меню

Добавляются новые действия либо при помощи контекстного меню, либо путем нажатия на кнопку-список New Action. Причем, если нажать не на саму кнопку, а не стрелку рядом с ней и выбрать вариант New Standard Action (или выбрать аналогичный пункт из контекстного меню), то откроется другое окно, содержащее список с уже упомянутыми стандартными действиями.

Все стандартные действия подразделяются на 12 групп, каждая из которых содержит ряд действий, принадлежащих к соответствующей категории:

Большинство стандартных действий вызывают различные диалоги, или служат для выполнения иных операций, нами еще не рассмотренных – с ними мы ознакомимся в следующих 2 главах. Тем не менее, достаточно добавить несколько действий, после чего почти что любому компоненту можно будет назначать в качестве значения для свойства Action действие. С этой точки зрения действия являются наиболее востребованными для того же главного меню.

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

То же самое можно сказать и про контекстное меню: если в программе не предусмотрено специфических контекстных меню для компонент типа Edit или Memo, то оно у них все равно будет – об этом позаботится операционная система.

Избранное

SNK GSCP
SNK GSCP - новая библиотека для PHP 5!
Web Studio
Web Studio и Visual Workshop
Библиотека:
Стандарты на web-технологии
Монополия
Монополия v. 2.0.2
Загрузки:
скачать программы
Продукция:
программы и книги
Техподдержка / Связаться с нами
Copyright © 1999-2013 SNK. Все права защищены.
При использовании материалов с сайта ссылка на источник обязательна.
Рейтинг@Mail.ru