Компонент MainMenu - главное меню
MainMenu, расположеный на странице Standard, это невизуальный компонент, т.е. место его размещения на форме в процессе проектирования не имеет никакого значения для пользователя - он все равно увидит не сам компонент, а только меню, сгенерированное им.
Основное свойство компонента - Items. Его заполнение производится с помощью Конструктора Меню, вызываемого двойным щелчком на компоненте MainMenu или нажатием кнопки с многоточием рядом со свойством Items в окне Инспектора Объектов. В результате откроется окно. В этом окне вы можете спроектировать меню.
Можно создавать меню двух основных видов: главное и контекстное. Главное меню принадлежит форме и отображается под ее заголовком. Контекстное[15] меню может быть предусмотрено для самой формы и других ее объектов (которые соответствуют управляющим элементам Windows, имеющим свойство PopupMenu). Оно появляется при щелчке правой кнопки мыши на соответствующем объекте.
Редактор меню позволяет легко вставлять меню в форму. Пункты меню добавляются, изменяются или удаляются также в окне редактора[16]. Меню на форме всегда видимы, поэтому для их тестирования приложение запускать не требуется.
Принципы работы с меню очень просты. Каждому пункту меню соответствует свой объект класса TMenuItem. При выборе пункта пользователем инициализируется событие соответствующего компонента onclick и вызывается его обработчик. Имена пунктам присваиваются по умолчанию в порядке создания (свойство Name). Текст пункта соответствует свойству Caption. Если в тексте имеется символ ‘&’, то следующий за ним символ является акселератором (горячей клавишей). Например, меню &Edit допускает активизацию при нажатии Alt+E. Если в качестве значения Caption введен только один символ ‘-’, то этот пункт служит разделителем.
Чтобы контекстное меню привязать к какому-либо объекту, следует значению его свойства PopupMenu присвоить имя меню. Если меню уже созданы, имя может быть выбрано из списка. Таким образом, одно и то же меню может быть связано с несколькими объектами. Какой из них вызвал меню, программа может определить во время выполнения, путем анализа значения свойства PopupComponent. Это удобно сделать в обработчике события OnPopup, возникающего перед каждым показом всплывающего меню на экране. Для программного обращения к меню в определенном месте программы следует вызвать метод Popup(int X, int Y), где X, Y – координаты левого верхнего угла панели меню.
Обработчики пунктов меню создаются и удаляются точно так же, как и для любых других компонентов. Если для некоторого пункта подходит уже имеющийся обработчик, то можно не повторять один и тот же код, а просто связать[17] пункт с таким обработчиком.
Если для команды меню задано значение свойству ShortCut, то код командной клавиши автоматически добавляется к ее названию. Для добавления в подменю вложенного подменю следует использовать соответствующую команду контекстного меню, активизируемого нажатием правой кнопки мыши. Если выполнение команды должно приводить к отображению модального диалога, то ее название следует заканчивать многоточием (…).
Описание лабораторной работы
Задание 1
1. Создайте новое приложение и поместите в него компонент MainMenu. Измените имя этого компонента на MainMenu.
2. В верхней части формы поместите горизонтальный разделитель.
3. Дважды щелкните по значку главного меню. Появится редактор меню.
4. Хотя существует более легкий способ создания меню File, первый раз проделаем это вручную. Редактор меню всегда содержит пустой пункт меню, который обозначает место для вновь создаваемого пункта. При первом запуске редактора меню пустой пункт будет выделен.
5. Измените значение свойства Name на FileMenu.
6. Щелкните на свойстве Caption в окне инспектора объектов, наберите &File и нажмите Enter.
Амперсант (&) используется для ввода подчеркнутого символа в название пункта меню. Подчеркнутый символ служит для ускоренного выбора пункта меню с клавиатуры путем нажатия соответствующей клавиши в сочетании с Alt. Амперсант можно размещать в любом месте текста.
После проведенных операций в редакторе меню появится пункт File(он появился и в главной форме, закрытой редактором меню), под только что созданным пунктом Fileпоявился новый пустой пункт, и такой же пустой пункт возник справа. Инспектор объектов содержит пустой компонент MenuItem, ожидая ввода значений для свойств Captionи Name. Продолжим создание меню.
6. Смените значение свойства Name нового пункта на FileNew.
7. Измените, значение свойства Captionна &Newи нажмите Enter. Редактор меню снова создаст пустой пункт.
8. Повторите шаги 1 и 2 для создания пунктов меню Open..., Saveи Save As...
9. Теперь нам нужен разделитель меню. Разделитель(separator) — это горизонтальная линия в меню, разделяющая группы пунктов. Добавление разделителя с помощью редактора меню С++ Builder выглядит очень просто. Нужно только установить для свойства Captionзначение «–» (дефис). Перейдите к пустому пункту меню под Save As, введите дефис в поле Captionи нажмите Enter.
10. Добавьте в меню пункты Exit.
11. Для создания меню Editрассмотрим более легкий путь. Сначала щелкните на пустом пункте справа от пункта File. Затем щелкните правой кнопкой мыши и выберите в открывшемся контекстном меню пункт Insert From Template. На экране появится диалоговое окно Insert Template. В диалоговом окне приведен список доступных шаблонов. Есть возможность использовать предопределенные шаблоны или создавать свои собственные. Сейчас нам нужно загрузить меню Edit, поэтому выберите из списка Edit Menuи нажмите кнопку «ОК». В редактор меню сразу же будет вставлено полное меню Edit. На самом деле оно содержит больше пунктов, чем нужно. Удалением лишнего займемся чуть позже.
12. Давайте заодно вставим в меню Help. Щелкните на пустом пункте справа от Edit. Снова выберите в контекстном меню пункт Insert From Templateи вставьте шаблон Help Menu. (He выберите по ошибке Expanded Help Menu.). Обратите внимание, что вновь вставленные пункты уже отображены в главной форме.
13. Меню Edit, вставленное ранее, содержит слишком много пунктов. Некоторые из них никогда не будут использоваться в программе. Для того чтобы удалить пункт меню нужно:
− выбрать из меню Editпункт Repeat<command>;
− нажать клавишу Deleteили выбрать пункт Deleteв контекстном меню редактора, выделенный пункт исчезнет, а оставшиеся пункты сдвинутся вверх;
− аналогичным образом удалить пункты Paste Special, Go To, Links, Objectsи разделитель после Replace;
− в меню Help оставьте только Contents и About...
14. Вставка пунктов меню выполняется очень просто. Щелкнуть мышью на том пункте, над которым нужно поместить новый пункт, и нажать клавишу Insert (или выбрать Insert в контекстном меню редактора). После этого можно установить свойства Caption и Name для нового пункта.
15. Вставим еще один пункт в меню Edit:
− вызовите из меню Edit пункт Find;
− нажмите клавишу Insert(в меню возникнет новый пункт, а все лежащие под ним пункты сдвинутся вниз);
− измените значение свойства Nameна EditSelectAll, а свойства Caption— на Select&All;
− в пустом пункте в нижней части меню Editпоставьте разделитель (для этого достаточно ввести в поле Captionдефис);
− снова щелкните на пустом пункте и установите для свойства Nameзначение EditWordWrap, а для свойства Caption— &WordWrap.
16. Перемещение пунктов меню можете проделать очень легко. При этом, возможно, перемещать пункты как в пределах одного всплывающего меню, так и между различными меню. Для перемещения пунктов существуют два способа. Первый заключается в использовании буфера обмена. Операции Cut и Paste выполняются как обычно, поэтому не будем описывать их. Другой способ заключается в использовании техники drag-and-drop. При необходимости размещения пункта SelectAll под пунктом Undo проделайте следующее:
− откройте пункт Edit для вызова соответствующего меню;
− щелкните на пункте SelectAllи перетащите его, пока разделитель под Undoне окажется выделен;
− отпустите кнопку мыши, и пункт займет новое место.
17. Создание подменю не имеет каких-либо особенностей. Подменю(submenu) — это меню, которое вызывается при выборе пункта вышестоящего меню. Наличие подменю обозначается стрелкой вправо, расположенной за названием пункта. Вы можете создать подменю, выбрав в контекстном меню редактора пункт Create Submenu, или нажав одновременно Ctrl и стрелку вправо на клавиатуре. При создании подменю, справа от соответствующего пункта основного меню размещается пустой пункт. Вы можете добавлять в подменю пункты точно так же, как и при создании главного меню. Создать подменю можно также вставкой шаблона.
18. Добавить сочетания клавиш, соответствующие пунктам меню, можно изменив значение свойства ShortCut в инспекторе объектов. Для меню Edit, которое было вставлено из шаблона, сочетания клавиш уже определены. Например, пункту Cut соответствует сочетание Ctrl+X. Если вы посмотрите на меню Edit, то увидите, что за названием пункта стоит Ctrl+X. Щелкнув на пункте Cut, вы увидите, что свойство ShortCut в окне инспектора объектов также имеет значение Ctrl+X. Щелкните в столбце Value рядом со свойством ShortCut. Справа вы увидите кнопку со стрелкой. Щелкните на ней для вызова списка возможных значений. Этот список содержит практически все сочетания, которые могут когда-либо понадобиться. Чтобы установить новое сочетание клавиш, просто выберите его из списка.
Стандартным сочетанием клавиш для SelectAllявляется Ctrl+A, поэтому давайте установим его для этого пункта меню:
− выберите в созданном меню пункт Edit | SelectAll;
− щелкните на свойстве ShortCutв окне инспектора объектов;
− выберите Ctrl+A из списка доступных сочетаний, и теперь за названием пункта SelectAll появится Ctrl+A.
Это все, что вам нужно сделать — остальное берет на себя С++ Builder. Для использования сочетаний клавиш не требуется писать какой-либо код.
19. Давайте сделаем еще несколько действий, направленных на "облагораживание" созданного меню.
Во-первых, по умолчанию включим пункт WordWrap. Этот пункт предназначен для включения и выключения режима заворачивания слов. Когда режим заворачивания включен, пункт WordWrapотмечен. Щелкните на пункте WordWrapи установите для свойства Checkedзначение true. При этом рядом с названием пункта появится отметка, сообщающая, о его включении.
Во-вторых, необходимо установить значения свойств Nameдля всех пунктов, вставленных из шаблона. Они имеют имена по умолчанию, которые желательно заменить на более информативные. Выберите пункт Edit | Undo. Измените значение свойства Nameс Undo1на EditUndo. Можно использовать любое соглашение об именах, но будьте при этом последовательны. Повторите процедуру для пунктов Cut, Copy, Paste, Findи Replace. Потом перейдите к меню Helpи измените значения свойств Nameдля пунктов Contentsи Aboutна HelpContentsи HelpAbout.
На этом создание меню завершено. Просмотрите его еще раз и устраните замеченные ошибки. Убедившись, что меню построено правильно, закройте окно редактора меню.
20. Переименуйте главную форму приложения в TextViewer. Дополните созданное приложение панелью, содержащей кнопки New, OpenFile, SaveFile, Cut, Copy, Paste. Кнопки должны содержать соответствующие графические значки и имена. Обработчики событий для этих кнопок не писать!
21. Написать обработчик события для команды меню Help | About..., выводящий модальное окно AboutBox с информацией о приложении.
Контрольные вопросы
1. На какой странице располагается компонент MainMenu?
2. Назовите основные свойства компонента MainMenu.
3. Для чего перед названием пункта меню ставится символ &?
4. Как ввести разделитель между пунктами меню?
5. Как производится вставка пунктов меню?
6. Как произвести перемещение пунктов меню?
7. Как создать подменю?
8. Как добавить сочетание горячих клавиш?
9. Для чего служит свойство WordWrap?
Практическая работа №19
Тема: «Использование стандартных диалогов в приложении».
Цель работы: Научиться использовать выпадающее меню в приложениях.
Время выполнения: подготовка – 5 мин; выполнение – 255 мин.; проверка – 10 мин; всего – 270 мин.
Теоретические сведения