Основы алгоритмизации и программирования - Учебное пособие (Струков В.М.)

5. построение меню

Меню является основным элементом диалогового интерфейса современных информационных систем, функционирующих на различных платформах. Оно представляет собой список пунктов, каждый из которых обозначает либо команду, либо подменю более низкого уровня.

Delphi обеспечивает построение двух видов меню:

главное;

всплывающее (контекстное).

5.1. Создание главного меню.

Главное меню обычно предназначено для управления работой всего приложения и располагается на стартовой форме приложения. Оно располагается горизонтально в верхней части формы и представляет собой текстовую строку, состоящую как правило из отдельных слов - пунктов меню:

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

Основным свойством главного меню является комплексное свойство Items. По сути, это массив, состоящий из пунктов главного меню. Его формирование выполняется с помощью Конструктора меню, который можно вызвать одним из двух способов: 1) щелкнуть мышкой по многоточию  в поле значения свойства Items или 2) дважды щелкнуть мышкой непосредственно по компоненту MainMenu. В результате на экране появится окно Конструктора меню:

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

Если подменю для текущего пункта главного меню отсутствует, то нужно перейти к формированию следующего пункта главного меню, щелкнув мышкой в поле его названия.

Основные свойства пункта главного меню (или подменю):

Caption – свойство типа String, содержит наименование пункта меню;

BitMap - свойство типа TBitmap, определяет пиктограмму, которая будет размещена слева от наименования пункта меню; по умолчанию имеет значение None – пиктограмма отсутствует;

Break – свойство типа TMenuBreak, используется в случаях, когда подменю имеет много пунктов; задает разделение меню на колонки; может принимать следующие значения:

mbNone – меню не разделяется на колонки (принимается по умолчанию);

mbBreak – пункты меню, начиная с текущего образуют новую колонку, отделенную от предыдущей пробелами;

mbBarBreak - пункты меню, начиная с текущего образуют новую колонку, отделенную от предыдущей вертикальной разделительной линией;

 Checked – свойство типа Boolean, предназначено для установки маркера, показывающего, что данный пункт меню выбран - True (или не выбран - False):

AutoCheck - свойство типа Boolean, если оно установлено в True, то щелчок мышкой по пункту меню переводит его в противоположное состояние (например, из состояния «включен» в состояние «выключен»);

RadioItem - свойство типа Boolean, действует совместно со свойствами AutoCheck и Checked: если AutoCheck и RadioItem установлены в True, то соответстующий пункт подменю работает в режиме радиокнопки в группе с теми пунктами, у которых оба эти свойства установлены в точно такие же значения, а выбранный в данный момент пункт будет помечен слева жирным черным кружком (как и у радиокнопки):

ShortCut – свойство, позволяющее задать «горячую»комбинацию клавиш для активизации пункта меню с помощью клавиатуры.

Если в свойстве Caption перед названием пункта меню ввести символ &, то этот знак обеспечит быстрый доступ к этому пункту меню с помощью горячей комбинации клавиш Alt – «первая буква».

Добавление и удаление пунктов подменю выполняется с помощью контекстного меню для соответствующего пункта меню.

Удаление пункта меню: 1) выделить удаляемый пункт меню, 2) щелк-нуть по нему правой кнопкой и 3) в появившемся контекстном меню щелкнуть команду Delete:

Вставка (добавление) пункта меню выполняется аналогично предыдущей операции: 1) выделить элемент подменю, перед которым нужно вставить добавляемый пункт, 2) щелкнуть по нему правой кнопкой и 3) в появившемся контекстном меню щелкнуть команду Insert.  

Разделение пунктов подменю на группы выполняется в тех случаях, когда среди относительно большого количества пунктов подменю можно по функциональному признаку выделить отдельные подгруппы. В качестве примера такого выделения можно привести практически любое подменю главного меню редактора MS Word (Вставка, Формат, Таблица и др.).

Для выполнения этой операции необходимо в том месте, где должно быть разделение, создать пункт подменю с именем (значение свойства Caption) ’-’:

Создание подменю для пункта подменю. Если для некоторого пункта подменю необходимо, в свою очередь, создать свое подменю, то для этого нужно: 1) выделить элемент подменю, для которого нужно создать подменю, 2) щелкнуть по нему правой кнопкой, 3) в появившемся контекстном меню щелкнуть команду Create SubMenu и далее сформировать необходимые пункты подменю:

Создание обработчиков событий пунктов меню и подменю.

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

Пример. Разработать приложение, которое с помощью меню вычисляет наибольшее или наименьшее из двух чисел.

Решение.

Разместим на пустой форме следующие компоненты: LabeledEdit - для ввода чисел, MainMenu,  Label – для вывода результата. Сформируем соответствующие значения свойств Caption компонент LabeledEdit и Label.

Создадим главное меню из двух пунктов – Максимум и Минимум.

Для каждого из пунктов меню создадим обработчик события OnClick:

Запустим приложение на выполнение (F9), введем в поля ввода два произвольных целых числа и щелкнем пункт меню “Максимум». В результате на экране получим следующее окно:

5.2. Создание контекстного меню.

Контекстное меню является очень удобным интерактивным средством для быстрого доступа к командам любого визуального компонента. Оно появляется при нажатии правой кнопки мышки в области визуального компонента, использующего это меню. И содержит в себе команды, применяемые именно к данному компоненту.

Для реализации контекстного меню в Delphi используется компонент PopUpMenu из палитры Standard – .

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

Разместить на форме компонент PopUpMenu.

Двойным щелчком по компоненте PopUpMenu войти в Конструктор меню и создать в нем необходимые пункты меню.

Свойству PopUpMenu компонента, для которого создается контекстное меню, присвоить значение, равное имени соответствующего ему компонента PopUpMenu (обычно это PopUpMenu1):

Отметим, что в младших версиях Delphi это свойство – скалярного типа, в то время как в старших версиях оно имеет комплексный характер.

5.3. Динамическая настройка меню.

Большинство из рассмотренных выше операций по созданию и редактированию меню можно выполнять и в процессе выполнения приложения. При этом могут выполняться следующие операции:

Создать новое меню.

Удалить меню либо его пункты.

Заблокировать или разблокировать отдельные пункты меню.

Сделать любой пункт меню видимым или невидимым.

Добавить новый пункт меню.

Переключать форму с одного главного меню на другое.

Осуществлять объединение двух пунктов меню.

Для добавления пункта меню используются методы Add и Insert, например:

Procedure Form1.mnuItemAddClick (Sender:TSender);

Var NewItem: TmenuItem;

Begin

         NewItem:= TmenuItem.Create(Self);

         NewItem.Caption:=’элемент’;

         MnuFile.Add(NewItem);

End;

или:

Procedure Form1.mnuItemInsertClick (Sender:TSender);

Var NewItem: TmenuItem;

Begin

         NewItem:= TmenuItem.Create(Self);

         NewItem.Caption:=’элемент’;

         MnuFile.Insert(2, InsertItem);          {новый пункт вставляется 2-ым                                                                      элементом, после 1-ого пункта }

End;

Для удаления пункта меню используется метод Delete:

Procedure Form1.mnuItemDeleteClick (Sender:TSender);

Var NewItem: TmenuItem;

Begin

         MnuFile.Delete(2);

End;