Лекция № 6
Тема: "Меню и панель инструментов"
План
1. Создание меню
2. Создание контекстного меню
3. Панель инструментов
4. Строка статуса
1. Создание меню
В Delphi есть два компонента для создания меню: MainMenu (Standard) – главное меню и PopupMenu (Standard) – всплывающее меню. Эти компоненты имеют много общего. Начнем рассмотрение с компонента MainMenu.
Это невизуальный компонент, то есть место его размещения на форме в процессе проектирования не имеет никакого значения для пользователя – он одинаково увидит не сам компонент, а только меню, сгенерированное им.
Обычно на форме содержится один компонент MainMenu. В этом случае его имея автоматически заносится в свойство Menu формы. Но можно поместить на форму и несколько компонентов MainMenu с разными наборами разделов, соответствующими разным режимам работы приложения. В этом случае во время проектирования свойству Menu формы присваивается ссылка на один из этих компонентов. А в процессе выполнения в нужные моменты это свойство можно менять, меняя соответственно состав главного меню приложения.
Компонент MainMenu имеет свойства:
Свойство | Описание |
Images | Задает компонент ImageList, в котором хранятся изображения для пунктов меню |
Items | Содержит перечень пунктов меню |
Name | Задает имя компонента для обращения к нему в коде программы |
Создание пунктов меню проводится с помощью Конструктора Меню, который открывается двойным щелчком на компоненте MainMenu или нажатием кнопки с тремя точками рядом со свойством Items в окне Инспектора Объектов. В результате откроется окно, в котором вы можете спроектировать меню.
При работе в конструкторе меню новые разделы можно вводить, помещая курсор в рамку из точек, которая обозначает местоположение нового раздела. Если при этом раздел ввелся не на нужном вам месте, вы можете отбуксировать его мышью туда, куда вам нужно. Другой способ ввода нового раздела – использование контекстного меню при щелчке правой кнопкой мыши. Если вы предварительно выделите какой-либо раздел меню и выберете из контекстного меню команду Insert, то рамка нового раздела вставится над выделенным. Из контекстного меню вы можете также выполнить команду Create Submenu, что позволяет ввести подменю в выделенный раздел.
При выборе нового раздела вы увидите в Инспекторе Объектов множество свойств и событий данного раздела. Дело в том, что каждый раздел меню является объектом, который владеет своими свойствами, методами, событиями. К свойствам пункта меню относят:
Свойство | Описание |
AutoCheck | Если ровно true, то пункт автоматически отмечается флажком |
Break | Задает тип разбивки пунктов меню на несколько колонок |
Caption | Задает надпись пункта меню для отображения на экране. Допускается использования символа «&». Если в свойстве ввести символ «–», то пункт будет разделителем |
Checked | Если равно true, то пункт меню отмечается флажком |
Default | Если равно true, то пункт является используемым по умолчанию. Если сделать двойной щелчек на главном разделе, то выполнится именно этот пункт |
Enabled | Если равно true, то пункт доступный |
GroupIndex | Задает номер пункта меню. Используется для создания групп пунктов-переключателей |
Hint | Задает текст всплывающей подсказки |
ImageIndex | Задает номер изображения из компонента ImageList для отображения слева от пункта меню |
Name | Задает имя пункта для обращения к нему в коде программы |
RadioItem | Если равно true, то пункт является переключателем. Одна группа переключателей должна иметь одинаковое значение в свойстве GroupIndex |
ShortCut | Задает комбинацию клавиш, отображаемую справа от названия пункта меню |
Visible | Если равно true, то пункт видимый |
Для присваивания пункту меню соответствующего обработчика события необходимо выбрать нужен пункт меню на форме.
Приведем несколько примеров для работы с меню.
Пусть на форме есть пункт меню Редактирование – Заблокировать под именем mnuBlock. Если пункт меню отмечен флажком, то поле Memo1 на этой же форме не доступно для редактирования. А если нет, то – доступно.
Для пункта меню mnuBlock зададим свойство AutoCheck равным true. Для пункта напишем код:
procedure TForm1.mnuBlockClick(Sender: TObject);
begin
//если пункт меню отмечен флажком
if mnuBlock.Checked then
//поле блокируется
Memo1.ReadOnly:=true
//а если нет, то - разблокируется
else
Memo1.ReadOnly:=false;
end;
Рассмотрим для этого примера другую ситуацию. Пусть пункт меню отмечается не флажком, а меняется самое название пункта (Заблокировать/Разблокировать).
Для пункта меню mnuBlock напишем код:
procedure TForm1.mnuBlockClick(Sender: TObject);
begin
//если пункт меню подписан "заблокировать"
if mnuBlock.Caption='Заблокировать' then
begin
//поле блокируется
Memo1.ReadOnly:=true;
//подпись меню меняется на "Разблокировать"
mnuBlock.Caption:='Разблокировать';
end
//а если нет, то
else
begin
//поле разблокируется
Memo1.ReadOnly:=false;
//подпись меню меняется на "Заблокировать"
mnuBlock.Caption:='Заблокировать';
end;
end;
Рассмотрим этот же пример с использованием пунктов меню в виде переключателей. Пусть есть два пункта меню Заблокировать (mnuBlock) и Разблокировать (mnuUNBlock). Для создания пунктов в виде переключателей необходимо:
Для пункта меню mnuBlock напишем код:
procedure TForm1.mnuBlockClick(Sender: TObject);
begin
//блокируем поле
Memo1.ReadOnly:=true;
end;
Для пункта меню mnuUNBlock напишем код:
procedure TForm1.mnuUNBlockclick(Sender: TObject);
begin
//разблокируем поле
Memo1.ReadOnly:=false;
end;
Форма может иметь несколько компонентов MainMenu с разным набором разделов и команд (например, меню для новичка и меню для пользователя с опытом).
Для отображения нужного меню нужно в свойстве Menu формы указать имя соответствующего компонента MainMenu.
Одной из требований в приложениях Windows есть стандартизация меню и их разделов. Этому помогает команда Save As Template в контекстном меню, которое появляется при щелчке правой кнопкой мыши в окне Конструктора Меню. Эта команда вызывает диалог сохранения шаблона меню. Со временем в любом вашем новом приложении вы можете загрузить этот шаблон в меню, выбирая со всплывающего меню в окне Конструктора Меню команду Insert From Template.
2. Создание контекстного меню
Контекстное меню привязанно к конкретным компонентам. Оно всплывает, если пользователь щелкает правой кнопкой мыши на компоненте. Обычно в контекстное меню включают те команды главного меню, которые в первую очередь могут понадобиться при работе с данным компонентом.
Контекстному меню отвечает компонент PopupMenu (Standard). Поскольку в приложении может быть несколько контекстных меню, то и компонентов PopupMenu может быть несколько. Оконные компоненты: панели, окна редактирования, а также надписи и др. имеют свойство PopupMenu, которое по умолчанию пустое, но куда можно поместить имя того компонента PopupMenu, с которым будет связанны данный компонент.
Формирование контекстного всплывающего меню проводится с помощью Конструктора Меню, который вызывается двойным щелчком на PopupMenu, точно так же, как это делалось для главного меню. Однако возможно упростить эту работу. Поскольку разделы контекстного меню обычно повторяют некоторые разделы уже сформированного главного меню, то можно обойтись копированием соответствующих разделов. Для этого, войдя в Конструктор Меню из компонента PopupMenu, щелкните правой кнопкой мыши и выберите команду Select Menu (выбрать меню). Вам будет предложено диалоговое окно, в котором вы можете перейти в главное меню. В нем вы можете выделить нужныйн вам раздел или разделы (при нажатой клавише Shift выделяются разделы в заданном диапазоне, при нажатой клавише Ctrl можно выделить совокупность разделов, которые не являются соседними). Потом выполните копирование их в буфер обмена, нажав клавиши Ctrl+С. После этого снова щелкните правой кнопкой мыши, выберите команду Select Menu и вернитесь в контекстное меню. Укажите курсором место, в которое хотите вставить скопированные разделы, и нажмите клавиши чтения из буфера обмена – Ctrl+V. Разделы меню вместе со всеми их свойствами будут скопированы в создаваемое вами контекстное меню.
Для того чтобы пункт контекстного меню выполнял те же действия, что и пункт главного меню необходимо выделить нужный пункт в контекстном меню и в событии OnClick выбрать обработчик, который соответствует этому же пункту в главном меню.
3. Панель инструментов
Для создания панелей инструментов в Delphi есть компонент Toolbar (Win32). Если вы поместите компонент Тооlbar на форму, то по умолчанию он расположится вверху, поскольку его свойство Align по умолчанию ровно alTop. Компонент Toolbar имеет свойства:
Свойство | Описание |
Align | Задает, возле какого края формы разместится панель |
ButtonHeight | Задает высоту кнопок панели |
ButtonWidth | Задает ширину кнопок панели |
Color | Задает цвет фона панели |
Cursor | Задает указатель мыши при наведении на панель |
Enabled | Если равно true, то панель доступная |
Font | Задает параметры шрифта |
Height | Задает высоту панели в пикселях |
Hint | Задает текст всплывающей подсказки |
Images | Задает компонент ImageList с пиктограммами для кнопок панели |
Left | Задает отступ панели от левого края формы в пикселях |
Name | Задает имя панели для обращения к ней в тексте программы |
ShowHint | Если равно true, то отображается всплывающая подсказка |
TabOrder | Задает последовательность перехода на компонент клавишей TAB |
TabStop | Если равно false, то переход на компонент клавишей TAB будет невозможен |
Visible | Если равно true, то панель видима |
Width | Задаем ширину панели в пикселях |
Wrapable | Если равно true, то кнопки на панели могут автоматически переноситься на новую строку. |
Для добавления кнопок на панель щелкните на Toolbar правой кнопкой мыши и выберите команду New Button (для добавления кнопки) или New Separator (для добавления разделителя). Каждая кнопка на панели имеет свои свойства:
Свойство | Описание |
Caption | Текст надписи на кнопке |
Cursor | Указатель мыши при наведении на кнопку |
Down | Если равно true, то кнопка на панели нажата. А если нет, то не нажата |
DropDownMenu | Задает пункт меню, который будет раскрываться при щелчке на кнопке. Имеет смысл, если для кнопки в свойстве Style указанное значение tbsDropDown |
Enabled | Если равно true, то кнопка доступна |
Grouped | Кнопки, которые размещаются подряд и имеют это свойство равным true, работают как группа переключателей. При этом в свойстве Style для этих кнопок обязательно нужно выбрать значение tbsCheck |
Height | Задает высоту кнопки в пикселях |
Hint | Задает текст всплывающей подсказки |
ImageIndex | Задает номер изображения из компонента ImageList для отображения на кнопке |
MenuItem | Задает пункт меню, который дублирует данная кнопка. После установки этого свойства кнопка автоматически наследует от пункта меню его внешний вид и обработчик события |
Name | Задает имя для обращения к кнопке в коде программы |
ShowHint | Если равно true, то отображается текст всплывающей подсказки |
Style | Задает тип кнопки. Может создать обычную кнопку, флажок, выпадающий список или переключатель |
Visible | Если равно true, то кнопка видима на панели |
Width | Задает ширину кнопки на панели |
Wrap | Если равно true, то следующая кнопка располагается в новом ряду на панели инструментов |
Кроме кнопок на панели инструментов можно размещать другие компоненты. Для этого выберите нужен компонент и нарисуйте его на панели так же, как вы рисуете его на форме.
4. Создание строки статуса
Компонент Statusbar (Win32) представляет собой ряд панелей, которые отображают строку статуса в стиле Windows. Обычно эта строка размещается внизу формы.
Компонент имеет свойства:
Свойство | Описание |
Align | Задает край формы, у которого разместится строка статуса |
Color | Задает цвет фона строки статуса |
Cursor | Задает указатель мыши при наведении на строку статуса |
Enabled | Если равно true, то строка статуса доступна |
Font | Задает параметры форматирования текста |
Height | Задает высоту строки статуса в пикселях |
Hint | Задает текст всплывающей подсказки |
Left | Задает отступ от левого края формы в пикселях |
Name | Задает имя панели для обращения в коде программы |
Panels | Открывает редактор панелей строки статуса. Позволяет обратиться в коде к любой панели по ее номеру |
ShowHint | Если равно true, то отображается всплывающая подсказка |
SimplePanel | Если равно true, то строка статуса состоит с одной панели |
Simpletext | Задает текст на панели, если SimplePanel=true |
SizeGrip | Если равно true, то пользователь может изменять размер панелей при работе программы |
Top | Задает отступ от верхнего края формы в пикселях |
Visible | Если равно true, то строка статуса видима на экране |
Width | Задает ширину строки статуса в пикселях |
Если свойство SimplePanel=false, то строка статуса может состоять из нескольких панелей, в каждой из которых может отображаться разная информация. Каждая панель строки статуса является объектом. Свойства панелей вы можете задавать в специальном редакторе, который можно вызвать тремя способами: из Инспектора Объектов кнопкой с тремя точками возле свойства Panels, двойным щелчком на компоненте Statusbar или из контекстного меню, выбрав команду Panels Editor. В окне редактора вы можете перемещаться по панелям, добавлять новые или удалять существующие. При перемещении по панелям в окне Инспектора Объектов вы будете видеть свойства текущей панели. Каждая панель имеет два важных свойства:
Свойство | Описание |
Text | Текст, отображаемый на панели |
Width | Ширина панели в пикселях |
Программный доступ к текстам отдельных панелей можно осуществлять через индексированное свойство Panels. Например:
StatusBar1.Panels[i].Text:='текст';
где i – номер панели. Нумерация начинается с 0.
Пример. Пусть на форме есть строка статуса с двумя панелями. В первой панели отображается текущая дата, а во второй – подсказка о назначении компонента, над которым в данный момент расположен курсор мыши.
Для реализации первой панели в событии OnCreate формы напишите код:
procedure TForm1.FormCreate(Sender: TObject);
begin
StatusBar1.Panels[0].Text:=DateToStr(date);
end;
Функция Date позволяет определить сегодняшнюю дату. Функция DateToStr позволяет конвертировать дату в текст.
Для реализации второй панели необходимо в событии OnMouseMove нужного компонента формы написать код:
StatusBar1.Panels[1].Text:='описание компонента';
В событии OnMouseMove формы написать код:
StatusBar1.Panels[1].Text:='';
Вопросы для самоконтроля
1. Опишите принцип создания меню в программах.
2. Какие свойства имеет компонент MainMenu?
3. Какие свойства имеет отдельный пункт в компоненте MainMenu?
4. Как организовать использование нескольких меню на одной форме?
5. Как создать контекстное меню?
6. Как привязать контекстное меню к компоненту на форме?
7. Опишите копирование команды из главного меню в контекстное меню
8. Как создать панель инструментов? Опишите свойства самой панели и отдельной кнопки на ней?
9. Как создать строку статуса? Какие свойства она имеет?
10. Как создать несколько панелей в строке статуса? Какие свойства имеет отдельная панель и как к ней обратиться?