Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.05.2024
Просмотров: 155
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Таблица 8.1. Важнейшие свойства и события компонента MainMenu
Значок компонента MainMenu, который вы видите на форме, отображается лишь на этапе разработки. Он нужен для того, чтобы вы могли быстро активизировать компонент и перейти к установке его свойств. Однако компонент MainMenu является невизуальным и на этапе выполнения приложения его значок не отображается. Пользователь видит результат работы компонента — строку меню.
Пока в меню нет пунктов, нет и самого меню. Добавление новых пунктов выполняется в специальном окне — дизайнере меню (Menu Designer).
8.1.3. Дизайнер меню
Вызов дизайнера меню осуществляется с помощью команды Menu Designer…, которая находится в контекстном меню компонента MainMenu (рисунок 8.2).
Рисунок 8.2. Вызов дизайнера меню (Menu Designer)
Шаг 3. Выберите показанную на рисунке команду Menu Designer… и на экране появится окно с заголовком PictureForm.MainMenu. Это и есть дизайнер меню.
Рисунок 8.3. Дизайнер меню (Menu Designer)
Дизайнер меню работает в паре с окном свойств. Создание и удаление пунктов осуществляется в дизайнере меню, а свойства отдельно взятого пункта устанавливаются в окне свойств.
Шаг 4. Сейчас строка главного меню состоит из одного безымянного пункта. Дайте этому пункту программный идентификатор FileMenuItem (значение свойства Name) и заголовок &File (значение свойства Caption). Символ & обеспечивает подчеркивание следующего за ним символа при отображении текста, поэтому пункт меню будет виден как File (рисунок 8.4). Подчеркнутая буква используется в комбинации с клавишей Alt для быстрого выбора пункта меню и называется горячей клавишей. В данном случае активизация пункта File будет происходить по комбинации клавиш Alt+F. Заметим, что в некоторых версиях операционной системы Windows «горячие» клавиши подчеркиваются только после нажатия клавиши Alt.
Рисунок 8.4. Текст пункта меню
Бывает очень утомительно назначать пунктам меню горячие клавиши. К тому же приходится заботиться о том, чтобы горячие клавиши не дублировались в нескольких пунктах. К счастью в компоненте MainMenu существует свойство AutoHotKeys. Если оно установлено в значение maAutomatic
, то подбор горячих клавиш выполняется автоматически. С этого момента мы будем пользоваться этой возможностью, поэтому удалите символ амперсанта (&) из свойства Caption компонента FileMenuItem и убедитесь, что в компоненте MainMenu свойство AutoHotKeys установлено в значение maAutomatic.
Шаг 5. Сейчас под пунктом File нужно создать подчиненное меню со списком команд. Для этого просто щелкните в дизайнере меню на пункте File, среда Delphi все сделает за вас. Под пунктом File появится пустая ячейка — заготовка первого пункта выпадающего списка. Выберите этот пункт с помощью мыши и дайте ему программный идентификатор OpenMenuItem (свойство Name), а в свойстве Caption впишите текст Open... . Вместо пустой ячейки появится текст Open... и пустая ячейка переместится ниже.
Шаг 6. Действуя по аналогии, добавьте еще три пункта: Save As... , Close и Exit. В программе они должны называться SaveAsMenuItem, CloseMenuItem и ExitMenuItem соответственно.
Рисунок 8.5. Пункты в меню File
Внимание! Не пытайтесь удалить пустой пункт, завершающий список команд — у вас ничего не выйдет. Да это и не требуется, поскольку пустые висячие пункты не отображаются в меню во время работы программы.
Согласитесь, что добавление новых пунктов сделано в среде Delphi очень удобно. Но для создания полноценного меню, одной этой возможности явно недостаточно — нужны средства вставки и удаления пунктов, создания вложенных меню и прочие. Поэтому в дизайнере меню для каждого отдельно взятого пункта предусмотрено контекстное меню с необходимым набором команд (рисунок 8.6 и таблица 8.2).
Рисунок 8.6. Контекстные команды в дизайнере меню
Команда | Описание |
Insert | Вставляет новый пункт. |
Delete | Удаляет выбранный пункт. |
Create Submenu | Создает в позиции пункта подчиненное меню. |
Select Menu | Предлагает выбрать для работы другой компонент меню. |
Save As Template | Сохраняет текущую структуру меню в списке шаблонов. |
Insert From Template | Вставляет меню из списка шаблонов. |
Delete Templates | Удаляет шаблон(ы) меню. |
Insert From Resource | Вставляет меню из файла с описанием меню (расширение MNU) или из стандартного файла ресурсов (расширение RC). |
Таблица 8.2. Контекстные команды в дизайнере меню
Бывает, создав меню, вы вдруг обнаруживаете, что какой-то незадачливый пункт находится не на своем месте. Проблема решается просто: захватите пункт меню щелчком левой кнопки мыши и, удерживая нажатой кнопку мыши, отбуксируйте его к новой позиции. Таким образом, можно переместить не только отдельный пункт, но и целое подчиненное меню со всеми его пунктами и вложенными меню.
8.1.4. Пункты меню
Нетрудно догадаться, что пункты меню, как и все элементы интерфейса, являются компонентами. Класс пункта меню называется TMenuItem, самые характерные его свойства обозначены в таблице 8.3.
Свойство | Описание |
Action | Задает так называемую команду, которая будет выполняться при выборе данного пунтка меню. Весь список команд содержится в компоненте ActionList (см. параграф 8.6). |
AutoCheck | Если равно значению True, то выбор пункта меню автоматически приводит к изменению значения свойства Checked на противоположное. Если равно значению False, то изменением свойства Checked управляет программист. |
AutoHotkeys | Значение maAutomatic избавляет программиста от необходимости назначать пункту меню "горячую" клавишу (с помощью специального символа & в тексте пункта); компонент автоматически подбирает "горячую" клавишу. Значение maManual требует, чтобы "горячую" клавишу назначил программист (см. параграф 8.1.3). Значение maParent показывает, что способ назначения горячей клавиши определяется "родительским" компонентом MainMenu. |
AutoLineReduction | Если равно значению maAutomatic, то при отображении меню подряд идущие пункты-разделители рисуются как один разделитель, а пункты-разделители, находящиеся в начале или конце меню вообще не показываются. Свойство AutoLineReduction применяется при программном добавлении и удалении пунктов меню, чтобы избежать нежелательных явлений вроде повторяющихся и повисших разделительных линий. Если свойство AutoLineReduction равно значению maManual, то все пункты меню отображаются как есть. Если свойство равно значению maParent, то способ определяется “родительским” компонентом (например, MainMenu). |
Bitmap | Значок, который отображается рядом с текстом пункта меню. Если для данного пункта меню указан индекс значка с помощью свойство ImageIndex, то значение свойства Bitmap игнорируется. Значки в пунктах меню более подробно расмотрены в параграфе 8.1.12. |
Break | Если равно mbBreak или mbBarBreak, то пункт меню начинает новый столбец. Значение mbBarBreak обеспечивает отделение нового столбца от предыдущего вертикальной чертой. |
Caption | Текст пункта меню. |
Checked | Если равно значению True, то пункт меню содержит метку в виде "птички". |
Default | Значение True говорит о том, что выбор пункта меню можно осуществить двойным щелчком "родительского" пункта меню. |
Enabled | Определяет, доступен ли пользователю данный пункт меню. |
GroupIndex | Работает по-разному в зависимости от того, находится пункт в подчиненном меню или в строке главного меню. Пункты подчиненного меню с одинаковым положительным значением GroupIndex согласовано переключают между собой метку — установка у одного пункта свойства Checked в значение True снимает метку с другого пункта. В MDI-формах свойство GroupIndex работает по-другому. Пункты главного меню, находящиеся в дочерней форме MDI, сливаются с пунктами главного меню обрамляющей формы MDI при активизации дочерней формы. При этом если в строке главного меню обрамляющей формы существуют пункты с таким же значением свойства GroupIndex, то новый пункт со своим списком пунктов полностью заменяет старый; в противном случае новый пункт со своим списком пунктов вставляется в строку главного меню. Более подробно слияние меню изложено в справочнике среды Delphi. |
Hint | Краткая подсказка для пользователя, отображаемая в строке состояния. |
ImageIndex | Номер значка в списке Images компонента MainMenu. Значок отображается рядом с текстом пункта меню (см. параграф 8.1.12). Отрицательное значение свойства ImageIndex говорит о том, что для пункта меню значок не задан. Свойство ImageIndex имеет приоритет над свойством Bitmap. |
RadioItem | Если равно значению True, то метка имеет вид жирной точки. |
ShortCut | Комбинация клавиш для выполнения команды, не открывая меню. |
SubMenuImages | Список значков, отображаемых рядом с пунктами подчиненного меню. Свойство SubMenuImages используется совместно со свойством ImageIndex компонентов MenuItem (см. параграф 8.1.12). |
Visible | Определяет, виден ли пользователю пункт меню. |
OnAdvancedDrawItem | Происходит при рисовании отдельно взятого пункта меню на экране. Событие происходит только в том случае, если соответствующий компонент меню (MainMenu или PopupMenu) содержит значение True в свойстве OwnerDraw. Предоставляет более широкие возможности по сравнению с событием OnDrawItem. |
OnClick | Происходит при выборе пункта меню пользователем. |
OnDrawItem | Происходит при рисовании отдельно взятого пункта меню на экране. Событие происходит только в том случае, если соответствующий компонент меню (MainMenu или PopupMenu) содержит значение True в свойстве OwnerDraw. |
OnMeasureItem | Происходит при расчете размеров отдельно взятого пункта меню перед его рисованием на экране. Событие происходит только в том случае, если соответствующий компонент меню (MainMenu или PopupMenu) содержит значение True в свойстве OwnerDraw. |
Таблица 8.3. Важнейшие свойства и события компонента MenuItem
По аналогии с остальными классами компонентов можно было бы предположить, что в палитре компонентов существует компонент MenuItem. Однако его там нет, поскольку пункты меню не существуют сами по себе, а работают только в составе строки главного меню или окна контекстного меню. Тем не менее, они во многом ведут себя как настоящие компоненты, например, настраиваются в окне свойств и наряду с остальными компонентами помещаются в исходный текст формы в виде отдельных полей. Чтобы в этом убедиться, активизируйте редактор кода и найдите определение класса формы. Оно будет таким, как на рисунке 8.7.
Рисунок 8.7. Пункты меню в программном коде
8.1.5. Разделительные линии
Шаг 7. Логически связанные между собой команды принято отделять от других команд горизонтальной линией. Например, пункт Exit хорошо бы отделить от остальных (рисунок 8.8). Для этого вставьте новый пункт и запишите в значении свойства Caption символ минуса (–).
Рисунок 8.8. Разделительная линия в меню
Среда Delphi знает, что одиночный символ минуса в имени пункта меню означает разделитель и нарисует для пункта горизонтальную линию. Кстати, это не запрещает вам создавать пункты, имена которых начинаются со знака минус. Если вы запишите что-нибудь после знака минуса, то в имени пункта отобразится весь введенный текст.
8.1.6. Комбинации клавиш
Некоторым пунктам меню назначают комбинации клавиш (shortcut), чтобы выполнять команды, не открывая меню. Они ускоряют работу с приложением и популярны среди опытных пользователей. Названия комбинаций клавиш отображаются справа от текста соответствующих пунктов. Например, во многих программах команде меню File| Open... назначается комбинация клавиш Ctrl+O.
Шаг 8. Чтобы назначить пункту комбинацию клавиш, активизируйте пункт в дизайнере меню, перейдите к окну свойств и выберите в списке значений свойства ShortCut требуемую комбинацию клавиш (рисунок 8.9). Если ее там нет, то введите название комбинации клавиш вручную.
Рисунок 8.9. Комбинация клавиш для активизации пункта меню
Внимание! Имейте в виду, что среда Delphi не отслеживает дублирование одной и той же комбинации клавиш для нескольких пунктов меню, за это отвечает программист.
8.1.7. Обработка команд меню
В первом приближении меню готово и вам наверняка не терпится его опробовать. Давайте реализуем закрытие формы по команде Exit. Решение этой задачи сводится к обработке события OnClick компонента ExitMenuItem. Это событие возникает при выборе пользователем в меню пункта Exit.
Шаг 9. Итак, активизируйте в дизайнере меню пункт Exit и выберите в окне свойств вкладку Events. Теперь сделайте двойной щелчок мышью на значении события OnClick (рисунок 8.10).
Рисунок 8.10. Создание обработчика команды меню
В результате откроется редактор кода, в котором появится заготовка обработчика события. Обработка команды Exit сводится к вызову метода Close, закрывающего форму (а заодно и приложение, поскольку это единственная форма):
procedure TPictureForm.ExitMenuItemClick(Sender: TObject);
begin
Close;
end;
Подключение меню к форме выполняется с помощью свойства формы Menu. Отыскав его в окне свойств, вы обнаружите, что оно уже содержит идентификатор разработанного меню MainMenu, поэтому в данном случае для работы меню больше ничего не нужно.
Проверим, работает ли меню. Выполните компиляцию и запустите проект. На экране появится форма со строкой меню под заголовком. Выбор в меню любой команды кроме Exit безрезультатен. По команде Exit окно закроется и приложение завершится (рисунок 8.11).
Рисунок 8.11. Проверка работы команды Exit
8.1.8. Пункты-переключатели
Во многих программах существуют пункты меню, которые работают как переключатели. Если вы еще не сообразили, о чем идет речь, посмотрите на рисунок 8.12. В нашей программе переключателями удобно сделать пункты меню, отвечающие за отображение панели инструментов и строки состояния. Установка флажка щелчком пункта-переключателя показывает панель инструментов (или строку состояния), а снятие флажка — прячет. Рассмотрим, как программируется такое поведение.
Шаг 10. В строке главного меню создайте выпадающее меню View с пунктами Toolbar (программное имя ToolBarMenuItem) и Status bar (программное имя StatusBarMenuItem). Установите в последних двух пунктах свойство Checked в значение True. В пунктах меню появятся метки (рисунок 8.12).
Рисунок 8.12. Пункты-переключатели в меню