Оба этих компонента являются не оконными и не видны в том месте,
в котором их поместили на форму во время проектирования, однако во время выполнения программы главное меню постоянно располагается вверху формы, а локальное меню выводится только по мере необходимости. Чаще всего для этого используется правая клавиша мыши, когда курсор мыши находится над тем элементом управления, для которого следует открыть локальное меню.
Обычно главное и локальное меню формируются на стадии проектирования (однако существуют методы, которые позволяют создавать меню и на стадии выполнения программы). Для создания необходимо воспользоваться свойством Items. При активизации этого свойства открывается конструктор меню, позволяющий набирать элементы меню.
У каждого пункта элемента меню имеются свойства: Caption — свойство типа String, содержащее текст элемента меню (для того чтобы получить разделитель, необходимо данному свойству дать значение –), GroupIndex — свойство целого типа, содержит номер группы, к которой относится элемент меню, ShotCut — свойство целого типа, определяющее код клавиши быстрого доступа.
Компоненты меню могут выполнять роль переключателей с зависимой и независимой фиксацией. Логическое свойство RadioItem определяет, может ли пункт меню выполнять функции переключателя, а Checked — является ли элемент меню отмеченным.
Отдельно отметим свойство Name — имя элемента меню. Если его
не задавать самостоятельно, то оно определяется через значение свойства Caption.
Предположим, что в нашем приложении необходимо создать основное меню, состоящее из пунктов File, Edit, Help. Подчиненное меню для пункта File состоит из разделов Open, Save Save As, для пункта меню Edit — из разделов Copy, Cut, Paste. Для пункта Help — единственный пункт
«О программе».
Добавим на форму компонент MainMenu1 и, произведя двойной щелчок левой клавишей мыши, откроем диалоговое окно формирования данного меню. Теперь можно задавать как основные, так и подчиненный пункты, используя свойство Caption. Заданное меню может выглядеть так, как изображено на рисунке 23.
Рисунок 23
Описание формы после задания данного системного меню будет иметь следующий вид:
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Edit1: TMenuItem;
Help1: TMenuItem;
Open1: TMenuItem;
Save1: TMenuItem;
Saveas1: TMenuItem;
Copy1: TMenuItem;
Cut1: TMenuItem;
Paste1: TMenuItem;
N1: TMenuItem;
private
{ Private declarations }
public
{ Public declarations }
end;
Как видно из текста, появился единственный компонент основного меню (тип TMainMenu) и несколько компонентов, определяющих подпункты в меню (тип TMenuItem). Имена практически во всех случаях совпали с теми названиями, которые мы определяли самостоятельно, кроме последнего случая, а когда название было задано русскими буквами, появился компонент с именем N1. Это стандартное правило, имеющееся
в среде Delphi, для обозначения имен компонентов.
При работе с любым меню определено несколько событий. Среди них необходимо отметить OnClick, которое происходит при выборе элемента меню мышью, клавишами управления клавиатурой или клавишей быстрого доступа. Если воспользоваться предложенным выше меню, то в нашем распоряжение будет 10 процедур, каждая из них вызывается при выборе конкретного пункта меню и задается процедурой вида:
procedure TForm1.Open1Click(Sender: TObject);
begin
end;
Данная процедура будет вызвана при выборе пункта меню File, Open.
Методы, доступные во время выполнения программы, связаны в основном с корректировкой структуры и определения связи между элементами и включают в себя методы: Add(Item) — добавить элемент вменю, Delete(Index) — удалить элемент меню с соответствующим индексом.
Не будем специально приводить пример использования системного
и контекстного меню, поскольку в любое, созданное нами приложение можно добавить необходимые компоненты. Например, меню можно добавить в текстовый или графический редактор.
Рассмотрим дополнительные элементы интерфейса, к которым могут быть отнесены те компоненты, которые позволяют облегчить работу
с конечной программой.
К таким компонентам будем относить строку состояния StatusBar, которая при выполнении программы располагается в нижней части формы
и может содержать основную информацию, характерную для данной программы. Рассмотрим также компонент ToolBar — панель инструментов, используемая в основном для создания кнопок быстрого доступа, панель инструментов CoolBar и компоненты работы со временем — Timer и датой — Calendar.
Панель инструментов ToolBar находится на странице Win32. На ней могут размещаться кнопки быстрого доступа, причем для панели инструментов разработан специальный класс кнопок ToolButton. Однако данный компонент не представлен в компонентах. Для того чтобы вставить на панель инструментов кнопку, необходимо воспользоваться контекстным меню, в котором выбрать пункт New Button или пункт меню New Separator — для расположения на панели инструментов пустого пространства.
У кнопок типа ToolButton следует отметить свойство Style, которое устанавливает внешний вид и функциональные возможности кнопки и может принимать следующие значения: tbsButton — обычная кнопка, tbsCheck — кнопка с фиксацией, которая после нажатия остается в таком положении до следующего нажатия. В данном случае логическое свойство Down принимает значение True, если кнопка нажата, tbsDivider — разделитель, который представляет собой вертикальную линию, разделяющую визуальные кнопки, tbsSeparator — пустое пространство. Свойства ButtonHigth и ButtonWidth устанавливают размеры кнопок. На каждой кнопке может находиться текст (свойство Caption) и картинка (свойство Image). Свойство List устанавливает расположение относительно друг друга текста и изображения.
Данные кнопки обрабатывают все события, однако событие по умолчанию так и остаются OnClck.
Панель инструментов, как правило, располагается на контейнерах — компонентах CoolBar или ControlBar. CoolBar — это панель, снабженная вертикальной полоской в левой части, за которую ее можно перемещать по форме. Основу данного компонента составляет коллекция панелей (свойство Bands). Чтобы «скомплектовать» новую панель, необходимо выбрать данное свойство и в диалоговом окне с помощью клавиш Add
и Delete создать необходимое число элементов. Нумерация элементов панели начинается с 0.
Каждый элемент панели управления имеет несколько свойств, среди которых свойство Control позволяет связать его с одним из оконных элементов управления, после чего элемент перемещается на отведенную панель.
Форма, содержащая системное меню и панель инструментов, представлена на рисунке 24.
Как правило, панель инструментов содержит те же команды, что и меню. Следовательно, имеет смысл один раз описать процедуру, а затем
в событиях, возникающих на других компонентах, вызывать ее. Для этого в инспекторе объектов на закладке Events в нужном событии надо использовать комбинированное меню, в котором уже находятся все имеющиеся процедуры обработки данного события. Например, если уже написана процедура сохранения, которая выполняется после нажатия на кнопку, и та же процедура должна выполняться из системного меню, описав соответствующий пункт меню, имя обрабатываемой процедуры можно выбрать из списка, представленного на рисунке 25.
Рисунок 24
Рисунок 25
Если все-таки процедуры должны быть одинаковыми, за исключением некоторых аспектов, которые зависят от элементов управления, ставшего источником события, то можно воспользоваться передаваемым параметром Sender или параметром Tag, присутствующим в каждой процедуре.
Оператор is предназначен для проверки совместимости по присвоению экземпляра объекта с экземпляром данного класса.
Пример 1
Пусть имеется кнопка на форме, панель инструментов и главное меню. Должно происходить одно и то же действие, например запись файла из содержимого компонента RichEdit1: или после нажатия кнопки формы, или одной из кнопок панели инструментов, или при выборе определенного пункта из главного меню. Следовательно, можно описать одну процедуру, а затем вызывать ее при возникновении всех изложенных выше событий. Создадим процедуру обработки нажатия на кнопки Button1Click
и укажем эту процедуру во всех остальных событиях.
Тогда для определения объекта вызвавшего событие будем применять оператор is и, кроме сохранения содержимого в файле, будем выдавать сообщение о объекте, на котором произошло событие.
procedure TForm1.Button1Click(Sender: TObject);
begin
If SaveDialog1.Execute
Then RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
If Sender is TButton
then ShowMessage('Нажата кнопка');
If Sender is TToolButton
then ShowMessage('Нажата кнопка на панели инструментов');
If Sender is TMenuItem
then ShowMessage('Выбран пункт из главного меню');
end;
Оператор as предназначен специально для приведения объектных
типов. С его помощью можно рассматривать экземпляр объекта как принадлежащий к другому совместному классу. Более подробно об этом операторе и о понятии класса будет рассмотрено нами позднее в лабораторной работе 11.