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

 

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

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

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

 

propertyCaption: string;

 

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

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

functionGetParentMenu: TMenu;

 

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

propertyAutoHotkeys: TMenuItemAutoFlag;

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

 

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

functionRethinkHotkeys: Boolean;

 

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

propertyShortCut : TShortCut;

 

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

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

functionShortCut(Key: Word; Shift: TShiftState): TShortCut;

 

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

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

 

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

 

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

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

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

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

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

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

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

propertyOnClick: TNotifyEvent;

 

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

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

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

propertyDefault: Boolean;

 

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

 

propertyChecked: Boolean;

 

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

procedureTForm1.MenuItem1Click(Sender: TObject);

Begin

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

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

end;

 

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

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

propertyAutoCheck: Boolean;

 

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

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

 

MenuItem1.Checked:= NOTMenuItem1.Checked;

 

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

propertyGroupIndex: Byte;

 

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

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

propertyRadioItem: Boolean;

 

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

 

Form1.Color:=clRed;

 

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

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

propertyItems[Index: Integer]: TMenuItem;

 

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

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

 

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

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

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

propertyMenuIndex: Integer; //индекс

 

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

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

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

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

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

functionIndexOf(Item: TMenuItem): Integer;

 

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

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

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

functionFind(ACaption: string): TMenuItem;








Дата добавления: 2016-03-15; просмотров: 3363;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.011 сек.