Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Элемент меню TMenuItem






 

Вне зависимости от того, с каким типом меню (главным или всплывающим)

вы собираетесь работать, основным вашим помощником будет элемент меню – объект типа TMenuItem. Объект TMenuItem не может существовать в отрыве от главного или всплывающего меню. По сути, TMainMenu и TPopupMenu являются хранилищами элементов TMenuItem.

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

 

property Caption: string;

 

Однако свойство Caption элемента меню обладает особенностями, отличающими его от других компонентов Delphi. Во-первых, если в Caption ввести единственный символ «–» (тире), то пункт меню превратится в разделитель. Так, на рис. 8.11 между элементами Сохранить как и Закрыть проведена сплошная горизонтальная линия. Это и есть пункт меню разделитель. Он не способен нести функциональную нагрузку и вызывать связанную с ним процедуру; его задача – улучшение наглядности приложения. Во-вторых, свойство Caption позволяет определить клавиши- акселераторы, ускоряющие доступ пользователя к пункту меню при одновременном нажатии клавиши Alt и клавиши-акселератора. На экране символ, соответствующий клавише-акселератору, выводится с подчеркиванием. Для того чтобы определить акселератор во время набора заголовка меню, необходимо ввести символ & перед символом, который предполагается сделать акселератором, например & Файл или О& кно. Для того чтобы выяснить, какому компоненту принадлежит элемент меню,

вызывают метод:

function GetParentMenu: TMenu;

 

Чтобы исключить ошибки назначения одинаковых акселераторов для различных пунктов меню, следует установить в автоматический режим (maAutomatic) свойство:

property AutoHotkeys: TMenuItemAutoFlag;

type TMenuItemAutoFlag = (maAutomatic, maManual, maParent); //по умолчанию maAutomatic

 

В этом случае, перед тем как меню будет отображено на экране, Delphi выявит и отключит дубликаты акселераторов. То же самое можно сделать, вызвав метод:

function RethinkHotkeys: Boolean;

 

Если функция вернула true, это признак того, что были найдены и исправлены ошибки. Помимо акселераторов с каждым пунктом меню можно связать так называемые «быстрые клавиши». Отличие быстрых клавиш от клавиш-акселераторов заключается в том, что выбор акселератора позволит лишь добраться до необходимого пункта меню, а нажатие комбинации быстрых клавиш заставит приложение выполнить сопоставленный с ними пункт меню. Итак, быстрые клавиши определяются свойством:

property ShortCut: TShortCut;

 

При желании сменить быстрые клавиши во время выполнения программы

следует воспользоваться специальной функцией, преобразующей комбинацию клавиш к виду TShortCut:

function ShortCut(Key: Word; Shift: TShiftState): TShortCut;

 

Здесь первым параметром передается код символа, а вторым – код нажатой

служебной клавиши, например

 

MenuItem1.ShortCut: = ShortCut(Word('V'), [ssCtrl]);

 

Стоит подчеркнуть, что функция не является внутренним методом класса

TMenuItem. Это самостоятельная функция, которая наряду с десятком других

методов входит в обойму так называемых «методов поддержки меню» и объявлена в модуле Menus.

Основное назначение пункта меню – среагировать на щелчок пользователя.

В этом он практически ничем не отличается от уже знакомых нам элементов

управления. Соответственно ничем не отличается и ключевой для элемента

TMenuItem обработчик события:

property OnClick: TNotifyEvent;

 

Хотя у пункта меню не предусмотрена обработка двойного щелчка, но тем не

менее такое действие пользователя совсем не исключается. Если произведен

двойной щелчок по элементу меню, обладающему подменю, то в списке дочерних пунктов меню Delphi постарается найти элемент, чье свойство Default установлено в true:

property Default: Boolean;

 

Если такой элемент существует, будет вызван его обработчик OnClick(). Другими словами, это элемент, вызываемый по умолчанию. Вместе с тем пункт меню нельзя считать тривиальным элементом управления. В силах программиста превратить отдельный пункт меню в элемент управления, напоминающий флажок (компонент TCheckBox) или переключатель (компонент TRadioButton). Таким чудесным возможностям TMenuItem в первую очередь обязан свойству:

 

property Checked: Boolean;

 

Установив это поле в true, мы увидим «галочку» слева от заголовка. Этим самым пункт меню сигнализирует нам, что он помечен. Вот вам и аналог элемента управления TCheckBox. Возможность контроля этого свойства позволяет использовать конструкцию IF…THEN…ELSE в обработчике события OnClick():

procedure TForm1.MenuItem1Click(Sender: TObject);

Begin

if MenuItem1.Checked=true then … //операция 1

else …; //операция 2

end;

 

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

галочкой, следует перевести в true свойство:

property AutoCheck: Boolean;

 

иначе это придется делать вручную внутри события OnClick(). В простейшем

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

 

MenuItem1.Checked: = NOT MenuItem1.Checked;

 

Для того чтобы научиться превращать пункт меню в переключатель, рассмотрим небольшой пример. Создайте новый проект, разместите на нем компонент TMainMenu. Создайте пункт меню верхнего уровня с заголовком «Цвет формы» и три подчиненных ему пункта: «Красный» с именем Name: = miRed, «Синий» с именем miBlue и «Зеленый» с именем miGreen. Наша задача – щелчком по меню перекрашивать форму в соответствующий цвет. Теперь одновременно выделите все три только что созданные пункта меню и найдите в Инспекторе объектов свойство GroupIndex, предназначенное для создания логических групп пунктов меню:

property GroupIndex: Byte;

 

По умолчанию каждый вновь создаваемый элемент TMenuItem не входит ни

в одну группу (GroupIndex = 0), но если полю GroupIndex двух или более пунктов меню присвоить значение, отличное от нуля, то мы получим возможность объединить элементы в группу. Установим это свойство, скажем в 10. Следующим шагом по превращению трех наших пунктов меню в группу переключателей будет установка в true свойства:

property RadioItem: Boolean;

 

Теперь пункт меню будет вести себя аналогично переключателю (TRadioButton). Для того чтобы выяснить, не отмечен ли элемент меню флажком, надо обратиться к уже знакомому нам свойству Checked, а Delphi позаботится о том, чтобы в одной группе переключателей не могло быть помечено более одного элемента TMenuItem одновременно. И в заключение проверьте, чтобы свойство AutoCheck всех трех элементов было переведено в true. После этого опишите обработку OnClick() для каждого из пунктов меню, например для красного:

 

Form1.Color: =clRed;

 

Наша программка готова… Доступ к уже существующим пунктам меню мы

получим, обратившись к свойству Items родительского элемента:

property Items[Index: Integer]: TMenuItem;

 

Здесь хранится список всех дочерних элементов меню; нам надо только выбрать его порядковый индекс. Информацию о количестве пунктов меню предоставит свойство:

property Count: Integer; //только для чтения

 

Каждый пункт меню знает, кому он принадлежит и свой индекс в списке

этого родительского элемента:

property Parent: TMenuItem; //родитель

property MenuIndex: Integer; //индекс

 

Единственное исключение при определении родительского пункта меню

возникает, если элемент меню является пунктом самого верхнего уровня.

Свойство MenuIndex сослужит отличную службу, если необходимо пересортировать пункты меню. Например, для перемещения элемента меню в начало списка присвойте этому свойству нулевое значение.

Если родительский пункт меню захочет выяснить индекс пункта меню в сво-

ем списке Items, то для этой цели стоит обратиться к методу:

function IndexOf(Item: TMenuItem): Integer;

 

Если меню не входит в подменю родительского элемента, функция вернет –1.

Для поиска пункта меню по его заголовку применяется функция Find().

В случае успеха метод вернет ссылку на найденный пункт меню, иначе получаем пустышку – неопределенный указатель nil.

function Find(ACaption: string): TMenuItem;






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.