Лекция № 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. Как создать несколько панелей в строке статуса? Какие свойства имеет отдельная панель и как к ней обратиться?