Недоступные пункты меню

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

Шаг 15. В нашем примере логично было бы сделать недоступными пункты Save As..., Close, а также Half Size, Normal Size и Double Size, когда нет открытого графического файла. Для этого в каждом из указанных пунктов меню установите свойство Enabled в значение False (рисунок 8.14).


Рисунок 8.14. Недоступные пункты меню

Шаг 16. Во время работы приложения нужно еще динамически делать пункты меню доступными или недоступными в зависимости от того, открыт графический файл или нет. Так как эти действия достаточно универсальны, оформим их в виде отдельного метода EnableCommands:

type TPictureForm = class(TForm) ... private { Private declarations } procedure EnableCommands(Enable: Boolean); end;   ...   procedure TPictureForm.EnableCommands(Enable: Boolean); begin SaveAsMenuItem.Enabled:= Enable; CloseMenuItem.Enabled:= Enable; HalfSizeMenuItem.Enabled:= Enable; NormalSizeMenuItem.Enabled:= Enable; DoubleSizeMenuItem.Enabled:= Enable; end;

Параметр Enable данного метода определяет, в какое состояние перевести пункты меню: доступны - True или недоступны - False.

Шаг 17. Создайте обработчики команд Open... и Close. Как вы понимаете, в обработчик команды меню Open... следует поместить вызов метода EnableCommands с параметром True, а в обработчик команды Close - вызов метода EnableCommands с параметром False:

procedure TPictureForm.OpenMenuItemClick(Sender: TObject); begin // Открыть рисунок и разрешить команды EnableCommands(True); end;   procedure TPictureForm.CloseMenuItemClick(Sender: TObject); begin // Закрыть рисунок и запретить команды EnableCommands(False); end;

Выполните компиляцию и запустите программу. Посмотрите, как изменилось ее меню (рисунок 8.15).


Рисунок 8.15. Меню работающей программы. Некоторые пункты недоступны.

В самом начале работы отдельные пункты выпадающих меню File и View недоступны. Они становятся доступными после выбора команды File / Open..., а после выбора команды File / Close - снова недоступными.

Итак, вы изучили все основные аспекты программирования главного меню, поэтому перейдем к вопросу разработки контекстных меню.

Контекстное меню

Контекстное (вспомогательное) меню представлено в среде Delphi компонентом PopupMenu (рисунок 8.16). Отыщите его в палитре компонентов на вкладке Standard и поместите на форму. Дайте новому компоненту имя PopupMenu.


Рисунок 8.16. Компонент PopupMenu

Прежде, чем перейти к практическому использованию контекстных меню, кратко опишем отличительные свойства компонента PopupMenu (таблица 8.4).

Свойство Описание
Alignment Определяет место появления меню относительно указателя мыши: paLeft - левый верхний угол меню совпадает с позицией курсора мыши; paCenter - середина верхнего края меню совпадает с позицией курсора мыши; paRight - правый верхний угол меню совпадает с позицией курсора мыши.
AutoHotkeys Значение maAutomatic избавляет программиста от необходимости назначать пунктам меню "горячие" клавиши (с помощью специального символа & в тексте пунктов); компонент автоматически подбирает "горячие" клавиши. Значение maManual требует, чтобы "горячие" клавиши назначил программист (см. параграф 8.1.3).
AutoLineReduction Если равно значению maAutomatic, то при отображении меню подряд идущие пункты-разделители рисуются как один разделитель, а пункты-разделители, находящиеся в начале или конце меню вообще не показываются. Свойство AutoLineReduction применяется при программном добавлении и удалении пунктов меню, чтобы избежать нежелательных явлений вроде повторяющихся и повисших разделительных линий. Если свойство AutoLineReduction равно значению maManual, то все пункты меню отображаются как есть.
AutoPopup Если равно значению True, то меню появляется автоматически по нажатию правой кнопки мыши. Если равно значению False, то меню необходимо отображать программно.
Images Список значков, отображаемых рядом с пунктами меню. Свойство Images используется совместно со свойством ImageIndex компонентов MenuItem (см. параграф 8.1.12).
Items Обеспечивает нумерованный доступ к пунктам меню.
MenuAnimation Набор флажков, определяющих способ появления меню на экране: maLeftToRight - слева направо, maRightToLeft - справа налево, maTopToBottom - сверху вниз, maBottomToTop - снизу вверх, maNone - мгновенное отображение. Чтобы флажки начали работать, запустите программу настройки экрана (Start->Settings->Control Panel->Display) и на вкладке Effects выберите способ появления меню и подсказок - Scroll Effect.
OwnerDraw Если равно значению True, то каждый пункт меню получает возможность участвовать в процессе своего отображения при помощи специальных событий OnMeasureItem и OnDrawItem. Событие OnMeasureItem происходит в пункте меню, когда расчитываются размеры пункта. Событие OnDrawItem происходит в пункте меню, когда пункт рисуется на экране. Если свойство OwnerDraw равно значению False, то пукнты меню имеют стандартный вид и события OnMeasureItem и OnDrawItem не происходят.
TrackButton Кнопка мыши для выбора пункта меню: tbLeftButton - левая кнопка, tbRightButton - еще и правая кнопка.
OnChange Происходит при изменении структуры меню.
OnPopup Происходит при вызове меню пользователем.

Таблица 8.4. Важнейшие свойства и события компонента PopupMenu

Шаг 18. Контекстное меню наполняется пунктами, как и главное меню, в дизайнере меню. Двойным щелчком мыши на компоненте PopupMenu откройте окно констурктора меню и, используя уже известные вам приемы, добавьте в меню пункты Half Size (с идентификатором HalfSizePopupItem), Normal Size (с идентификатором NormalSizePopupItem) and Double Size (с идентификатором DoubleSizePopupItem). Во всех пунктах контекстного меню установите следующие свойства:

· Enabled = False

· GroupIndex = 1

· RadioItem = True

Кроме этого пометьте пункт Normal Size, установив в нем свойство Checked в значение True. Таким образом, команды всплывающего меню дублируют некоторые команды главного меню, обеспечивая пользователю дополнительные удобства (рисунок 8.17).


Рисунок 8.17. Команды контекстного меню

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

Шаг 19. Активизируйте в дизайнере меню пункт Half Size и выберите в окне свойств вкладку Events. Выберите обработчик HalfSizeMenuItemClick из раскрывающегося списка события OnClick. То же самое проделайте с пунктами Normal Size и Double Size, установив для них обработчики NormalSizeMenuItemClick и DoubleSizeMenuItemClick соответственно (рисунок 8.18).


Рисунок 8.18. Установка обработчиков команд контекстного меню

Шаг 20. Для синхронной работы главного и контекстного меню нужно еще подправить некоторые обработчики:

procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject); begin // Показать рисунок половинного размера HalfSizeMenuItem.Checked:= True; HalfSizePopupItem.Checked:= True; end;   procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject); begin // Показать рисунок нормального размера NormalSizeMenuItem.Checked:= True; NormalSizePopupItem.Checked:= True; end;   procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject); begin // Показать рисунок двойного размера DoubleSizeMenuItem.Checked:= True; DoubleSizePopupItem.Checked:= True; end;   procedure TPictureForm.EnableCommands(Enable: Boolean); begin SaveAsMenuItem.Enabled:= Enable; CloseMenuItem.Enabled:= Enable; HalfSizeMenuItem.Enabled:= Enable; HalfSizePopupItem.Enabled:= Enable; NormalSizeMenuItem.Enabled:= Enable; NormalSizePopupItem.Enabled:= Enable; DoubleSizeMenuItem.Enabled:= Enable; DoubleSizePopupItem.Enabled:= Enable; end;

Шаг 21. Контекстное меню готово, осталось сделать так, чтобы оно вызывалось по щелчку правой кнопки мыши на форме. Нет ничего проще - активизируйте форму и запишите в значении свойства PopupMenu имя разработанного ранее контекстного меню - PopupMenu. Вы можете ввести это значение с клавиатуры или выбрать из раскрывающегося списка (рисунок 8.19).


Рисунок 8.19. Привязка контекстного меню к форме

Готово, выполните компиляцию и запустите программу. Нажатие правой кнопки мыши в окне приложения вызовет появление контекстного меню. Все его пункты окажутся недоступными. Чтобы пункты контекстного меню заработали, выполните команду главного меню File / Open. После этого проверьте, что контекстное меню работает синхронно с главным меню.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: