Лекция 4.5. Меню
Интерфейс практически любого приложения, как правило, включает в себя главное и контекстное меню. Главное меню создается на основе класса TMainMenu, а контекстное меню на основе класса TPopupMenu.
Каждый пункт главного или контекстного меню является представителем класса TMenuItem. Для задания действий командам меню и кнопкам панелей инструментов удобно использовать компонент TActionList.Класс TMainMenu
Компонент TMainMenu относят к невизуальным, хотя главное меню отображается во время разработки приложения. Основные свойства класса TMainMenu:
· AutoMerge: Boolean – определяет будет (true) или нет (false) объединяться меню главной и дочерней форм в SDI-приложениях. Положение добавляемых пунктов меню (TMenuItem) зависит от значений их свойств GroupIndex. В MDI-приложениях объединение реализуется автоматически;
· AutoHotkeys: TMenuAutoFlag – исключает конфликты оперативных клавиш при изменении состава команд меню во время выполнения программы;
· Images: TCustomImageList – подключает к меню коллекцию изображений класса TImageList, для их использования в качестве значков пунктов меню;
· Items: TMenuItem – массив пунктов меню;
· OwnerDraw: Boolean – разрешает «ручную» прорисовку меню через обработчик события OnDrawItem.
Для объединения двух меню разных форм или исключения можно использовать методы procedure Merge(Menu: TMainMenu) и procedure Unmerge(Menu: TMainMenu).
Класс TMenuItem
Каждый пункт меню является экземпляром класса TMenuItem. Причем объект TMenuItem может быть либо командой, либо содержать меню более низкого уровня.
Количество уровней вложенности не ограничено. Основные свойства класса TMenuItem:
· Bitmap: TBitmap – определяет картинку пункта меню;
· Break: TMenuBreak = (mbNone, mbBreak, mbBarBreak)
ü mbNone – элемент меню отображается в текущей колонке;
ü mbBreak – начиная с текущего элемента, пункты меню отображаются в следующей колонке;
ü mbBarBreak – начиная с текущего, пункты меню отображаются в следующей колонке, причем между колонками располагается разделитель
· Caption: String – надпись команды.
Если значение равно символу «–», то пункт считается разделителем. Буква, перед которой поставлен символ &, выделяется нижним подчеркиванием и эта буква может использоваться как клавиша ускоренного доступа.· Checked: Boolean – состояние пункта меню как флажка TCheckBox;
· GroupIndex: Byte – используется при объединении двух меню;
· ImageIndex: TImageIndex – индекс изображения в списке изображений TImageList. Данное свойство имеет более высокий приоритет, чем свойство Bitmap;
· Items: TMenuItem – массив вложенных пунктов меню (неопубликованное свойство);
· MenuIndex: Integer – указывает на порядковый номер пункта в меню. Изменение значения приведет к изменению в положении пункта.
· RadioItem: Boolean – позволяет использовать пункты меню как переключатели TRadioButton. Пункты с одинаковым значением свойства GroupIndex считаются группой;
· Shortcut: TShortCut – сочетания клавиш быстрого запуска команды.
Методы класса TMenuItem обычно используются для динамического формирования меню:
· procedure Add(Item: TMenuItem) – добавляет в конец меню новую команду;
· procedure Clear – удаляет все вложенные пункты меню и освобождает память;
· function Find(ACaption: string): TMenuItem – возвращает указатель на пункт меню найденный по заданному параметру ACaption (тексту команды), в противном случае, возвращает nil;
· function IndexOf(Item: TMenuItem): Integer – возвращает порядковый номер элемента меню;
· procedure Insert(Index: Integer; Item: TMenuItem) – добавляет в меню с позиции Index пункт Item;
· function Isline: Boolean – определяет, является ли пункт меню разделителем;
· procedure Remove (Item: TMenuItem) – удаляет указанный пункт меню.
В классе TMenuItem определены четыре обработчика событий: OnClick и OnAdvancedDrawItem, OnDrawItem, OnMeasureItem. Последние три предназначены для создания нестандартных меню. Их применение возможно только в том случае, если свойство OwnerDraw компонента TMainMenu равно true.
Использование редактора меню
Для создания меню в Delphi используется специальный редактор, который запускается двойным щелчком на свойстве Items компонента TMainMenu или на самом компоненте (рисунок 4.5.1).
Для вставки и удаления пунктов меню можно использовать кнопки Insert и Delete.
Создание вложенного меню осуществляется командой контекстного меню Create SubMenu. Для добавления пиктограммы значка слева от текста к команде меню можно использовать свойство Bitmap или ImageIndex, но приоритет во всех отношениях имеет последнее свойство. В первом случае картинка (BMP-файл) подключается непосредственно. Во втором случае используется коллекция изображений класса TImageList подключаемая к меню через свойство Images. Одно из преимуществ последнего способа в том, что туже коллекцию изображений можно использовать не только для меню, но и для панелей инструментов и других компонентов.
Задание реакции на выбор команды меню может осуществляться двумя способами:
· задание обработчика события OnClick пункта меню, простым щелчком по пункту или через Objects Inspector;
· задание свойство Action пункта меню, в этом случае все основные свойства пункта определяются автоматически, но Action должен быть определен. Для создания действия используется класс TActionList
Опишем последовательность действий создания меню:
1. Выберите в панели элементов компонент класса TMainMenu и поместите его на форму.
2. Двойным щелчком по компоненту вызовите редактор меню.
Рисунок 4.5.1 - Редактор меню
3. Перейдите в Object Inspector на свойство Caption пустого пункта меню, выделенного синим курсором, и введите название раздела. В результате будет создан раздел меню.
4. В редакторе меню щелкните по созданному разделу, в результате в низу появится пустое подменю.
5. Выделите свободный элемент открытого подменю и перейдите в Object Inspector на свойство Caption. Введите название команды.
6. Задайте реакцию на выбор команды.
Шаги 5 и 6 повторяются требуемое количество раз.
Динамическое управление меню
Методы класса TMenuItem, описанные ранее, используются для динамического создания и управления меню.
Рассмотрим пример динамического формирования меню:1. Создайте приложение
2. Пометите на форму компонент класса TMainMenu
3. Разместите на форме две поясняющих надписи класса TLabel, два поля (TEdit) для определения параметров создаваемого пункта меню информации и три кнопки класса TButton.
4. Установите следующие надписи компонентов:
ü Label1.Caption – «Имя пункта меню:»
ü Label2.Caption – «Индекс пункта меню:»
ü Button1.Caption – «Главный раздел»
ü Button2.Caption – «Создать»
ü Button3.Caption – «Удалить»
5. В разделе public модуля опишите переменную ActiveItem: TMenuItem для хранения активного (выделенного) пункта меню и заголовки трех методов:
· function GetCommand(Item: TMenuItem): String; - рекурсивный метод получения полного имени команды;
· procedure ActivationItem(Item: TMenuItem); - метод выделения (активации) пункта меню;
· procedure ItemClick(Sender: TObject); - обработчик события клика по пункту меню. Данный обработчик общий для всех команд меню, он делает активным нажатый пункт.
6. Нажмите Ctrl+Shift+C. В результате в разделе реализации появятся заголовки реализации этих методов.
7. Напишем следующий код реализации метода GetCommand:
if Assigned(Item.Parent) then
Result:= GetCommand(Item.Parent)+' - '+Item.Caption;
8. Напишем следующий код реализации метода ActivationItem:
ActiveItem:= Item;
Caption:= 'Выбрана команда:' + GetCommand(Item);
9. Напишем следующий код реализации метода ItemClick:
ActivationItem(TMenuItem(Sender));
// Получаем нажатый пункт меню ч/з Sender
10. Создайте обработчик события OnClick кнопки «Создать»:
procedure TForm1.Button2Click(Sender: TObject);
var NewItem: TMenuItem;
Index: Integer;
begin
NewItem:= TMenuItem.Create(Self);// Создаем новый пункт меню
NewItem.Caption:= Edit1.Text; // Присваиваем надпись пункту
NewItem.OnClick:= ItemClick; // Присваиваем метод-обработчик
// события
Index:= StrToIntDef(Edit2.Text, 0);// Определяем положение
// создаваемого пункта
ActiveItem.Insert(Index, NewItem);// Вставляем созданный
// пункт в подменю ActiveItem
end;
11.
Создайте обработчик события OnClick кнопки «Удалить»:procedure TForm1.Button3Click(Sender: TObject);
var Item: TMenuItem;
begin
if Assigned(ActiveItem.Parent) then // существует ли родитель?
begin // Если существует, то
Item:= ActiveItem.Parent; // Получаем родителя пункта
Item.Remove(ActiveItem); // Удаляем пункт родителя
ActivationItem(Item); // Делаем родителя активным
end;
end;
12. Создайте обработчик события OnClick кнопки «Главный раздел»:
ActivationItem (MainMenu1.Items); //Выделяем главный раздел меню
13. Выделите форму, и на вкладке Events окна Object Inspector выберите событие OnCreate. В раскрывающемся списке события выберите ранее созданный обработчик Button1Click (кнопка «Главный раздел»).
14. Выполните компиляцию и тестирование программы.
Рисунок 4.5.2 - Внешний вид программы демонстрации динамического создания меню
Контекстное меню
Контекстное меню является представителем класса TPopupMenu, по принципам построения аналогично главному меню и имеет много подобных свойств. Каждый элемент контекстного меню также является представителем класса TMenuItem, со всеми вытекающими отсюда возможностями. Попробуйте изучить класс TPopupMenu самостоятельно.
Вопросы для самоконтроля
1. Назовите основные свойства класса TMainMenu?
2. Для чего предназначено свойство Items класса TMainMenu?
3. Как можно подключить коллекцию изображений к меню?
4. Что представляет собой каждый пункт меню?
5. Какие свойства имеют пункты для построения иерархии команд меню?
6. Какими способами можно подключать пиктограммы изображений к пунктам меню?
7. Для чего используются символы «-» и «&» при задании значения свойства Caption?
8. Как работать с редактором меню?
9. Какие вы знаете функции для динамического создания меню?
10. Назовите свойства контекстного меню аналогичные свойствам главного меню.
Еще по теме Лекция 4.5. Меню:
- 1. Понятие, задачи и система криминалистической тактики
- Унитарное государство.
- Конфедерация и иные формы межгосударственных объединений (союзы, сообщества, содружества, ассоциации)
- Государственные аппарат (бюрократия). Принципы его организации и деятельности.
- Органы судебной власти: порядок образования, структура, компетенция.
- Государство и церковь.